Added authentication for test-requests and test agains current nginx-server
Sonarqube Scanner / Build and analyze (push) Failing after 20s
Sonarqube Scanner / Build and analyze (push) Failing after 20s
This commit is contained in:
@@ -4,17 +4,16 @@ Die Skripte benötigen nur Python 3 und die Standardbibliothek. Node.js, `curl`
|
||||
|
||||
## Authentifizierung
|
||||
|
||||
Jeder Request wird zunächst mit den bereits bekannten Zugangsdaten oder ohne Zugangsdaten ausgeführt. Antwortet ein vorgeschalteter Webserver mit `401 Unauthorized`, fragt das Werkzeug Benutzername und Passwort interaktiv ab und wiederholt denselben Request. Das Passwort wird mit `getpass` ohne Bildschirmausgabe eingelesen.
|
||||
Jeder Request wird zunächst ohne vorauseilenden Authorization-Header ausgeführt. Antwortet ein vorgeschalteter Webserver mit `401 Unauthorized`, verwendet die gemeinsame Request-Schicht zuerst die Umgebungsvariablen `API_USER` und `API_PASSWORD`. Sind beide gesetzt, wird derselbe Request genau mit diesen Basic-Auth-Credentials wiederholt. Fehlen sie, fragt das Werkzeug Benutzername und Passwort interaktiv ab. Das Passwort wird mit `getpass` ohne Bildschirmausgabe eingelesen.
|
||||
|
||||
Optionale Umgebungsvariablen:
|
||||
Für unbeaufsichtigte Aufrufe und CI-Pipelines:
|
||||
|
||||
```bash
|
||||
export WEGWICHTEL_URL='https://wegwichtel.de'
|
||||
export WEGWICHTEL_USER='florian'
|
||||
# WEGWICHTEL_PASSWORD nur für unbeaufsichtigte Aufrufe verwenden.
|
||||
export API_USER='florian'
|
||||
export API_PASSWORD='geheimes-passwort'
|
||||
```
|
||||
|
||||
Alle Skripte unterstützen außerdem `--base-url` und `--username`. Fehlende fachliche Parameter werden interaktiv abgefragt.
|
||||
Die API-Basisadresse ist standardmäßig `https://wegwichtel.de`. Alle Skripte unterstützen außerdem `--base-url` für abweichende Zielsysteme und `--username` für eine interaktive Anmeldung. Fehlende fachliche Parameter werden interaktiv abgefragt.
|
||||
|
||||
## Routen
|
||||
|
||||
|
||||
+18
-4
@@ -18,6 +18,8 @@ from urllib.parse import urljoin
|
||||
from urllib.request import Request, urlopen
|
||||
|
||||
DEFAULT_BASE_URL = "https://wegwichtel.de"
|
||||
API_USER_ENV = "API_USER"
|
||||
API_PASSWORD_ENV = "API_PASSWORD"
|
||||
|
||||
|
||||
class ApiError(RuntimeError):
|
||||
@@ -33,6 +35,15 @@ class Credentials:
|
||||
password: str
|
||||
|
||||
|
||||
def credentials_from_environment() -> Credentials | None:
|
||||
"""Liest CI-Credentials, ohne einen Request vor dem ersten HTTP 401 zu authentifizieren."""
|
||||
username = os.getenv(API_USER_ENV, "").strip()
|
||||
password = os.getenv(API_PASSWORD_ENV, "").strip()
|
||||
if username and password:
|
||||
return Credentials(username, password)
|
||||
return None
|
||||
|
||||
|
||||
class ApiClient:
|
||||
"""Kleine HTTP-Schicht mit dynamischer Basic-Auth-Nachfrage bei 401."""
|
||||
|
||||
@@ -41,7 +52,12 @@ class ApiClient:
|
||||
self.credentials = Credentials(username, password) if username and password else None
|
||||
|
||||
def prompt_credentials(self) -> None:
|
||||
default_user = self.credentials.username if self.credentials else os.getenv("WEGWICHTEL_USER", "")
|
||||
environment_credentials = credentials_from_environment()
|
||||
if environment_credentials:
|
||||
self.credentials = environment_credentials
|
||||
return
|
||||
|
||||
default_user = self.credentials.username if self.credentials else os.getenv(API_USER_ENV, "")
|
||||
username = input(f"Benutzername{f' [{default_user}]' if default_user else ''}: ").strip() or default_user
|
||||
if not username:
|
||||
raise ApiError(401, "Für den geschützten API-Zugriff ist ein Benutzername erforderlich.")
|
||||
@@ -172,9 +188,7 @@ def add_common_arguments(parser: argparse.ArgumentParser) -> None:
|
||||
|
||||
def client_from_args(args: argparse.Namespace) -> ApiClient:
|
||||
base_url = args.base_url or os.getenv("WEGWICHTEL_URL") or DEFAULT_BASE_URL
|
||||
username = args.username or os.getenv("WEGWICHTEL_USER")
|
||||
password = os.getenv("WEGWICHTEL_PASSWORD") if username else None
|
||||
return ApiClient(base_url, username, password)
|
||||
return ApiClient(base_url, args.username)
|
||||
|
||||
|
||||
def ask(label: str, value: Any = None, *, required: bool = False, cast: Callable[[str], Any] = str) -> Any:
|
||||
|
||||
Reference in New Issue
Block a user