feat(oidc): SSO-Identitaet bewusst mit einem Konto verknuepfen
Bisher war eine SSO-Anmeldung ohne passendes Konto eine Sackgasse: rote Fehlermeldung, kein Weg weiter. Die Verknuepfung ging nur ueber LINK_BY_EMAIL, das der E-Mail-Verwaltung des Providers vertrauen muss. Jetzt endet der Callback bei einer besitzerlosen Identitaet nicht im Fehler, sondern parkt sie in einem kurzlebigen signierten HttpOnly-Cookie und leitet auf /?sso_link=1. Der Login-Screen bittet daraufhin einmalig um das Calendarr-Passwort; nach erfolgreichem Login loest der Client POST /api/auth/oidc/link-pending ein und die Identitaet haengt an genau dem Konto, das sich gerade ausgewiesen hat. Beide Haelften sind damit bewiesen — das ID-Token haben wir selbst geprueft, das Konto durch das Passwort — und die Vertrauensannahme ueber die E-Mail entfaellt. Das greift fuer alle drei Faelle, in denen eine gueltige Identitaet keinen Besitzer hat: kein Konto vorhanden, Selbstregistrierung aus, oder E-Mail bereits vergeben. Ausserdem: unbekannte Fehler-Slugs werden jetzt mit angezeigt statt hinter "Anmeldung fehlgeschlagen" zu verschwinden — genau die Information, die zur Diagnose fehlte. Und oidc_token_exchange_failed hat eine eigene Meldung, die auf Client-Typ und Redirect-URI hinweist, weil das der haeufigste Konfigurationsfehler ist. Sechs Tests dazu; Ablauf zusaetzlich im Browser gegen einen echten OIDC-Stub-Provider durchgespielt: Hinweis statt Fehler, Verknuepfung nach Passwort-Login, danach Anmeldung allein per SSO. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b560ee260c
commit
cc4daf4a84
@@ -171,11 +171,18 @@ OIDC_AUTHENTIK_ALLOW_SIGNUP=false
|
||||
> `profile` and startup fails.
|
||||
|
||||
**Account matching.** An identity is matched on the provider's `sub` claim.
|
||||
A first-time SSO user whose email matches an existing local account is
|
||||
*refused* by default rather than linked — otherwise anyone who can set that
|
||||
email at the identity provider inherits the account. Link deliberately instead:
|
||||
sign in with the password, then link under Settings. `LINK_BY_EMAIL=true`
|
||||
enables automatic linking and additionally requires `email_verified`.
|
||||
|
||||
A first SSO login with no matching account does **not** fail. The verified
|
||||
identity is parked in a short-lived signed cookie and the login screen asks the
|
||||
user to sign in once with their Calendarr password; the identity is then
|
||||
attached to exactly that account. Both halves are proven — the ID token by us,
|
||||
the account by the password — so no trust in the provider'''s email handling is
|
||||
required.
|
||||
|
||||
`LINK_BY_EMAIL=true` links automatically to an existing account with the same
|
||||
address instead (additionally requiring `email_verified`). It saves one step,
|
||||
but means anyone who can set an arbitrary email at the identity provider
|
||||
inherits the matching account, including an admin'''s. Prefer the default.
|
||||
|
||||
With `ALLOW_SIGNUP=true`, unknown users get an account on first login. Such
|
||||
accounts have no usable password; they use **app passwords** for CalDAV, the
|
||||
|
||||
Reference in New Issue
Block a user