Add local username/password login as fallback when Microsoft login isn't available
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 21s
Build and Deploy / deploy (push) Successful in 1s

Neues "users"-Table (bcrypt-Hash, nie Klartext), POST /api/auth/login gibt ein
selbst-signiertes JWT (HS256) aus. requireAuth unterscheidet MSAL- (RS256) und
lokale Tokens (HS256) anhand des alg-Headers. Server legt beim Start optional
ein erstes lokales Konto an, wenn SEED_ADMIN_USERNAME/SEED_ADMIN_PASSWORD als
Stack-Env gesetzt sind (idempotent, Klartext-Passwort landet nie im Repo).

Frontend: Login-Screen hat jetzt einen Alternativ-Link zu Benutzername/Passwort,
App.tsx kombiniert MSAL- und lokalen Auth-Status.

Temporärer test-build-only.yml Workflow zur Docker-Build-Verifikation ohne
Registry-Push (wird nach dem Test wieder entfernt).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Fidelis Huber
2026-08-21 17:56:40 +02:00
co-authored by Claude Sonnet 5
parent 7bdf4f2897
commit 97c4aa1c68
14 changed files with 263 additions and 32 deletions
+24 -1
View File
@@ -76,7 +76,12 @@ Auf `https://10.1.10.111:9443` (Zugang laut deploy-standard bei "dominic"):
- Compose path: `gitops/stack.yml`
- Authentication: `portainer-deploy` + dessen PAT (Org-Repos sind über das
`deploy-read`-Team bereits abgedeckt, nichts zusätzlich einzutragen)
- Environment-Variable setzen: `POSTGRES_PASSWORD` = ein zufälliges, sicheres Passwort
- Environment-Variablen setzen:
- `POSTGRES_PASSWORD` = ein zufälliges, sicheres Passwort
- `JWT_SECRET` = ein zufälliger, langer String (signiert die lokalen Login-Tokens
niemals ins Repo, nur hier als Stack-Env). Beispiel zum Generieren: `openssl rand -base64 48`
- `SEED_ADMIN_USERNAME` / `SEED_ADMIN_PASSWORD` = legt beim ersten Start automatisch
ein lokales Fallback-Konto an (siehe "Lokales Konto" unten)
- **Webhook aktivieren**, **ForceUpdate an**, `ForcePullImage` bleibt aus
- Die angezeigte Webhook-URL (`.../api/stacks/webhooks/<uuid>`) als Gitea-Secret
`PORTAINER_WEBHOOK_URL` eintragen (Schritt 2).
@@ -90,6 +95,24 @@ Auf `https://10.1.10.111:9443` (Zugang laut deploy-standard bei "dominic"):
- Cleanup-Rule für den Package-Owner einmalig setzen (Org/User → Settings → Packages →
Cleanup Rules): keep most recent 10 + keep matching `^latest$`.
## Lokales Konto (Fallback ohne Microsoft-Login)
Auf dem Login-Screen gibt es unter dem Microsoft-Button den Link "Alternativ mit
Benutzername anmelden". Damit das funktioniert, muss im Portainer-Stack `JWT_SECRET`
gesetzt sein (Schritt 4).
Ein erstes Konto legt der Server **automatisch beim Start** an, wenn
`SEED_ADMIN_USERNAME` und `SEED_ADMIN_PASSWORD` als Stack-Env gesetzt sind (idempotent
läuft bei jedem Neustart mit, legt aber nur an, was noch nicht existiert). Das
Klartext-Passwort steht dabei nur in der Portainer-Stack-Konfiguration, nie im Git-Repo
der Server speichert ausschließlich einen bcrypt-Hash in der Datenbank.
Optional danach `SEED_ADMIN_PASSWORD` aus dem Stack wieder entfernen (Härtung), sobald
das Konto einmal erfolgreich angelegt wurde `SEED_ADMIN_USERNAME` kann stehen bleiben,
ohne Passwort passiert dann nichts mehr. Weitere lokale Konten aktuell nur direkt in der
Datenbank anlegbar (`INSERT INTO users …` mit einem bcrypt-Hash) ein Verwaltungs-UI
dafür gibt es noch nicht.
### Danach: zum Homescreen hinzufügen
Seite im Handy-Browser öffnen, anmelden, "Zum Home-Bildschirm hinzufügen" (iOS Safari)
bzw. "App installieren" (Android Chrome) die App ist als PWA installierbar