Archived
feat(auth): SSO-Anmeldung ueber OpenID Connect (AppAuth)
Zusaetzlicher Anmeldeweg neben Benutzername/Passwort. Der Login-Screen holt die konfigurierten Provider von GET /api/auth/oidc/providers; ohne Provider oder gegen einen aelteren Server bleibt der Screen unveraendert. Die App laeuft als Public Client: Authorization Code Flow mit PKCE in einer ASWebAuthenticationSession (nie ein WKWebView), ohne Client Secret. Das ID-Token wird an POST /api/auth/oidc/exchange gegen ein Calendarr-Token getauscht; die Antwort hat dieselbe Form wie der Passwort-Login, sodass der bestehende Session-Pfad unveraendert weiterlaeuft. - OIDCAuthenticator kapselt Discovery, PKCE-Request, Code-Tausch und die stille Erneuerung. Der AuthState mit dem Refresh-Token liegt in der Keychain (kSecAttrAccessibleAfterFirstUnlock) und wird beim Logout aus beiden Zugriffsgruppen entfernt. - OIDCSessionRefresher erneuert die Sitzung beim Start, wenn das Calendarr-Token binnen 24 h ablaeuft — ohne Browser, ueber den Refresh-Token des Providers. - Die angefragten Scopes kommen vom Server (mobile_scopes); ein Scope, den der Provider nicht kennt, wuerde die ganze Anfrage scheitern lassen. - Bei aktiviertem gefuehrten Zugriff weicht AppAuth auf SFSafariViewController aus, dessen Redirect nur ueber ein registriertes URL-Schema zurueckkaeme. Da das App-Target seine Info.plist generiert und CFBundleURLTypes dort nicht setzbar ist, wird der Fall vorab sauber abgelehnt statt endlos auf einen Callback zu warten, der nicht kommen kann. - Abbrueche werden mit Fehlerdomaene geprueft (user- und programCanceled) und still behandelt; alle uebrigen Fehler tragen Domain, Code und OAuth-Fehler ins DEBUG-Log, statt spurlos zu verschwinden. project.pbxproj: AppAuth-iOS 1.7.5 als SPM-Abhaengigkeit, nur am App-Target. OTHER_LDFLAGS bekommt -ObjC, weil OIDAuthState+IOS.m ausschliesslich eine Kategorie enthaelt und ohne Symbol sonst wegoptimiert werden koennte. Achtung: mangels macOS/Xcode ist dieser Stand nicht kompiliert. Beim ersten Oeffnen loest Xcode das Paket auf und legt Package.resolved an; die bitte mit committen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
d1da8de06a
commit
7b51cab693
@@ -294,6 +294,25 @@ private let strings: [String: [String: String]] = [
|
||||
"login.remember": "Angemeldet bleiben",
|
||||
"login.signin": "Anmelden",
|
||||
"login.choose_server": "Anderen Server wählen",
|
||||
// Single sign-on (OpenID Connect)
|
||||
"sso.or": "oder",
|
||||
"sso.login_with": "Mit %@ anmelden",
|
||||
"sso.err.generic": "Anmeldung fehlgeschlagen",
|
||||
"sso.err.oidc_failed": "Anmeldung fehlgeschlagen",
|
||||
"sso.err.oidc_provider_unreachable": "Anmeldedienst nicht erreichbar",
|
||||
"sso.err.oidc_guided_access": "Bei aktiviertem geführten Zugriff ist die SSO-Anmeldung nicht möglich",
|
||||
"sso.err.oidc_refresh_failed": "Sitzung konnte nicht erneuert werden",
|
||||
"sso.err.oidc_no_presenter": "Anmeldefenster konnte nicht geöffnet werden",
|
||||
"sso.err.oidc_bad_issuer": "Der Anbieter ist falsch konfiguriert",
|
||||
"sso.err.oidc_account_not_linked": "Kein verknüpftes Calendarr-Konto. Bitte lokal anmelden und in den Einstellungen verknüpfen.",
|
||||
"sso.err.oidc_signup_disabled": "Automatische Kontoerstellung ist deaktiviert",
|
||||
"sso.err.oidc_domain_not_allowed": "Diese E-Mail-Domain ist nicht zugelassen",
|
||||
"sso.err.oidc_email_conflict": "Diese E-Mail-Adresse gehört bereits zu einem anderen Konto",
|
||||
"sso.err.oidc_email_not_verified": "E-Mail-Adresse beim Anbieter nicht bestätigt",
|
||||
"sso.err.oidc_no_email": "Der Anbieter hat keine E-Mail-Adresse übermittelt",
|
||||
"sso.err.oidc_unknown_client": "Diese App ist beim Anbieter nicht registriert",
|
||||
"sso.err.oidc_invalid_token": "Das Anmelde-Token ist ungültig",
|
||||
"sso.err.oidc_no_id_token": "Der Anbieter hat kein ID-Token geliefert",
|
||||
"server.connect_title": "Server verbinden",
|
||||
"server.url": "Server-URL",
|
||||
"server.connect": "Verbinden",
|
||||
@@ -668,6 +687,25 @@ private let strings: [String: [String: String]] = [
|
||||
"login.remember": "Stay signed in",
|
||||
"login.signin": "Sign in",
|
||||
"login.choose_server": "Choose another server",
|
||||
// Single sign-on (OpenID Connect)
|
||||
"sso.or": "or",
|
||||
"sso.login_with": "Sign in with %@",
|
||||
"sso.err.generic": "Sign-in failed",
|
||||
"sso.err.oidc_failed": "Sign-in failed",
|
||||
"sso.err.oidc_provider_unreachable": "Sign-in service unreachable",
|
||||
"sso.err.oidc_guided_access": "SSO sign-in is not available while Guided Access is on",
|
||||
"sso.err.oidc_refresh_failed": "Could not renew the session",
|
||||
"sso.err.oidc_no_presenter": "Could not open the sign-in window",
|
||||
"sso.err.oidc_bad_issuer": "The provider is misconfigured",
|
||||
"sso.err.oidc_account_not_linked": "No linked Calendarr account. Sign in locally and link it in Settings.",
|
||||
"sso.err.oidc_signup_disabled": "Automatic account creation is disabled",
|
||||
"sso.err.oidc_domain_not_allowed": "This email domain is not allowed",
|
||||
"sso.err.oidc_email_conflict": "That email address already belongs to another account",
|
||||
"sso.err.oidc_email_not_verified": "Email address not verified at the provider",
|
||||
"sso.err.oidc_no_email": "The provider did not supply an email address",
|
||||
"sso.err.oidc_unknown_client": "This app is not registered with the provider",
|
||||
"sso.err.oidc_invalid_token": "The sign-in token is invalid",
|
||||
"sso.err.oidc_no_id_token": "The provider did not return an ID token",
|
||||
"server.connect_title": "Connect server",
|
||||
"server.url": "Server URL",
|
||||
"server.connect": "Connect",
|
||||
|
||||
Reference in New Issue
Block a user