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
@@ -565,6 +565,16 @@ a { color: var(--primary); text-decoration: none; }
|
||||
#view-container { flex: 1; display: flex; flex-direction: column; min-height: 0; }
|
||||
|
||||
/* ── SSO on the login screen ─────────────────────────────── */
|
||||
/* Informational, not an error: the SSO identity is fine, it just needs to be
|
||||
tied to an account. */
|
||||
.form-hint {
|
||||
font-size: 13px; line-height: 1.4;
|
||||
padding: 10px 12px; margin-bottom: 12px;
|
||||
border-radius: 8px;
|
||||
color: var(--text-1);
|
||||
background: var(--primary-dim);
|
||||
border: 1px solid var(--primary);
|
||||
}
|
||||
#sso-block { margin-top: 18px; }
|
||||
.auth-divider {
|
||||
display: flex; align-items: center; gap: 10px;
|
||||
|
||||
Reference in New Issue
Block a user