feat(auth): Anmeldeseiten, TOTP-Einrichtung und Bestaetigung (#004)
Anmeldung, Einrichtung des zweiten Faktors fuer den Notfall-Admin, erneute Bestaetigung vor kritischen Aktionen und die Seite fuer fehlende Rechte. Die Huelle zeigt jetzt den echten Benutzer, und jede Seite prueft die Sitzung selbst; ein struktureller Test haelt das fest. Die Ablaeufe sind im gebauten Stand gegen den Mock-OIDC geprueft (pnpm test:e2e): Admin, Konto ohne Gruppe, Notfall-Admin mit TOTP. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 152 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 150 KiB |
@@ -1,28 +1,37 @@
|
||||
# #004 Anmeldung, Rollen und erneute Bestätigung
|
||||
**Status:** offen
|
||||
**Status:** erledigt
|
||||
**Meilenstein:** v0.1.0
|
||||
**Labels:** sicherheit
|
||||
**Geschätzt:** 5 h **Tatsächlich:** –
|
||||
**Geschätzt:** 5 h **Tatsächlich:** 0 h 45 min
|
||||
|
||||
## Ziel
|
||||
Anmeldung per OIDC (authentik, in der Entwicklung Mock-Anbieter) und lokaler Notfall-Admin mit Passwort + TOTP. Rollen Admin/Operator/Leser, Re-Auth für kritische Aktionen.
|
||||
|
||||
## Aufgaben
|
||||
- [ ] Sitzungs-Cookie (`jose`), OIDC mit PKCE (`openid-client`)
|
||||
- [ ] Rollen aus authentik-Gruppen, bei jeder Anmeldung neu
|
||||
- [ ] Notfall-Admin: argon2id + TOTP (Pflicht), Einrichtung beim ersten Login
|
||||
- [ ] Re-Auth: OIDC `prompt=login`/`max_age=0` + `auth_time`, Notfall-Admin Passwort + TOTP; Gültigkeit 5 min
|
||||
- [ ] Rechtetabelle `darf()`, jede Seite/Route prüft selbst; struktureller Test
|
||||
- [ ] Rate-Limit für Anmeldung und Re-Auth
|
||||
- [ ] Mock-OIDC-Anbieter in `docker-compose.dev.yml`
|
||||
- [ ] Proxy mit CSP-Nonce und Sicherheits-Kopfzeilen
|
||||
- [x] Sitzungs-Cookie (`jose`), OIDC mit PKCE (`openid-client`)
|
||||
- [x] Rollen aus authentik-Gruppen, bei jeder Anmeldung neu
|
||||
- [x] Notfall-Admin: argon2id + TOTP (Pflicht), Einrichtung beim ersten Login
|
||||
- [x] Re-Auth: OIDC `prompt=login`/`max_age=0` + `auth_time`, Notfall-Admin Passwort + TOTP; Gültigkeit 5 min
|
||||
- [x] Rechtetabelle `darf()`, jede Seite/Route prüft selbst; struktureller Test
|
||||
- [x] Rate-Limit für Anmeldung und Re-Auth
|
||||
- [x] Mock-OIDC-Anbieter in `docker-compose.dev.yml`
|
||||
- [x] Proxy mit CSP-Nonce und Sicherheits-Kopfzeilen
|
||||
|
||||
## Akzeptanzkriterien
|
||||
- [ ] Ohne Anmeldung keine Seite erreichbar
|
||||
- [ ] Operator sieht keine Private-Key-Funktionen
|
||||
- [ ] Re-Auth älter als 5 min wird abgelehnt
|
||||
- [x] Ohne Anmeldung keine Seite erreichbar
|
||||
- [x] Operator sieht keine Private-Key-Funktionen
|
||||
- [x] Re-Auth älter als 5 min wird abgelehnt
|
||||
|
||||
## Abhängigkeiten
|
||||
#003
|
||||
|
||||
## Notizen / Entscheidungen
|
||||
- **Kein Auth.js**, sondern Sitzung (`jose`) und OIDC (`openid-client`) aus Laufzettel übernommen und angepasst.
|
||||
- **Ohne sshkv-Gruppe kein Zugang** – auch kein Lesezugriff (Abweichung von Laufzettel, das LESER vergibt).
|
||||
- **TOTP selbst implementiert** (RFC 6238, Testvektoren aus Anhang B); jeder Code gilt einmal (`totpLetzterSchritt`).
|
||||
- **TOTP-Einrichtung:** Das Geheimnis lebt bis zur Bestätigung nur in einem signierten httpOnly-Cookie (Pfad `/anmelden`, 10 min); gespeichert wird es erst nach passendem Code, verschlüsselt mit `SSHKV_APP_SECRET`.
|
||||
- **Re-Auth bei OIDC:** `prompt=login`, `max_age=0`, Prüfung von `auth_time` gegen den Startzeitpunkt (30 s Toleranz). Gültigkeit 5 min, gespeichert in `Benutzer.bestaetigtAm` – serverseitig, nicht im Cookie.
|
||||
- **Sitzungsdauer 8 h** statt 12 h.
|
||||
- **Mock-OIDC über http** nur mit `SSHKV_OIDC_HTTP_ERLAUBT=1` (openid-client verweigert http zu Recht).
|
||||
- Struktureller Test `tests/zugang.test.ts`: jede `page.tsx`/`route.ts` prüft selbst oder steht namentlich in den Ausnahmen.
|
||||
- E2E (`pnpm test:e2e`, gebauter Stand): OIDC-Admin, OIDC ohne Gruppe, Notfall-Admin mit TOTP-Einrichtung und Re-Auth – 4/4 grün.
|
||||
|
||||
Reference in New Issue
Block a user