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
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.
Quelle: docs/issues/004-anmeldung-rollen.md – dort wird dieses Issue gepflegt.
## 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
- [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
- [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.
---
Quelle: `docs/issues/004-anmeldung-rollen.md` – dort wird dieses Issue gepflegt.
florian.wilde
added this to the v0.1.0 milestone 2026-10-12 15:12:34 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
jose), OIDC mit PKCE (openid-client)prompt=login/max_age=0+auth_time, Notfall-Admin Passwort + TOTP; Gültigkeit 5 mindarf(), jede Seite/Route prüft selbst; struktureller Testdocker-compose.dev.ymlAkzeptanzkriterien
Abhängigkeiten
#003
Notizen / Entscheidungen
jose) und OIDC (openid-client) aus Laufzettel übernommen und angepasst.totpLetzterSchritt)./anmelden, 10 min); gespeichert wird es erst nach passendem Code, verschlüsselt mitSSHKV_APP_SECRET.prompt=login,max_age=0, Prüfung vonauth_timegegen den Startzeitpunkt (30 s Toleranz). Gültigkeit 5 min, gespeichert inBenutzer.bestaetigtAm– serverseitig, nicht im Cookie.SSHKV_OIDC_HTTP_ERLAUBT=1(openid-client verweigert http zu Recht).tests/zugang.test.ts: jedepage.tsx/route.tsprüft selbst oder steht namentlich in den Ausnahmen.pnpm test:e2e, gebauter Stand): OIDC-Admin, OIDC ohne Gruppe, Notfall-Admin mit TOTP-Einrichtung und Re-Auth – 4/4 grün.Quelle:
docs/issues/004-anmeldung-rollen.md– dort wird dieses Issue gepflegt.