feat: SSO-Login per OpenID Connect (Authentik u.a.)
Dritte Login-Methode neben Passwort und Passkey, konfiguriert über OIDC_ISSUER/OIDC_CLIENT_ID/OIDC_CLIENT_SECRET (optional, Button bleibt ohne diese Vars ausgeblendet). Authorization-Code-Flow mit PKCE, ID-Token-Signaturprüfung gegen das JWKS des Providers via neuer Abhängigkeit "jose" (RS256 fest gepinnt gegen Algorithm-Confusion), State/Nonce kurzlebig und einmalig verwendbar in neuer Tabelle oidc_states (Migration 0003, analog zu webauthn_challenges). Funktioniert ausschließlich für bereits angelegte Benutzer (Abgleich per E-Mail) – kein Auto-Provisioning, keine Rollenübernahme aus Claims, beides bleibt exklusiv über die bestehende Benutzerverwaltung steuerbar. app/login/page.tsx zu Server-Component-Wrapper reduziert (prüft isConfigured(), liest ?error= aus searchParams), bisheriger Inhalt nach components/LoginForm.tsx verschoben. Version 1.9.0. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
import "server-only";
|
||||
|
||||
// SSO-Konfiguration wird direkt aus Env-Vars abgeleitet – kein
|
||||
// Cloud-Konfigurationsschritt, analog zu lib/auth/webauthn-config.ts.
|
||||
// "Aktiviert" ergibt sich implizit aus dem Vorhandensein der drei
|
||||
// Pflicht-Vars (wie bei DEEPL_API_KEY), kein separates Enable-Flag.
|
||||
|
||||
export function isConfigured(): boolean {
|
||||
return !!(
|
||||
process.env.OIDC_ISSUER &&
|
||||
process.env.OIDC_CLIENT_ID &&
|
||||
process.env.OIDC_CLIENT_SECRET
|
||||
);
|
||||
}
|
||||
|
||||
export function issuer(): string {
|
||||
return process.env.OIDC_ISSUER!;
|
||||
}
|
||||
|
||||
export function clientId(): string {
|
||||
return process.env.OIDC_CLIENT_ID!;
|
||||
}
|
||||
|
||||
export function clientSecret(): string {
|
||||
return process.env.OIDC_CLIENT_SECRET!;
|
||||
}
|
||||
|
||||
// Bewusst aus APP_URL abgeleitet statt aus Request-Headern (wie z. B.
|
||||
// proxy.ts es für den Login-Redirect tut): der Wert muss exakt mit der
|
||||
// beim Identity Provider hinterlegten Redirect-URI übereinstimmen,
|
||||
// darf sich also nicht je nach eingehendem Host-Header ändern.
|
||||
export function redirectUri(): string {
|
||||
const appUrl = new URL(process.env.APP_URL ?? "http://localhost:3000");
|
||||
return `${appUrl.origin}/api/auth/oidc/callback`;
|
||||
}
|
||||
Reference in New Issue
Block a user