Anmeldung ueber Authentik und andere OIDC-Anbieter

Anmeldefluss mit PKCE (S256), State und Nonce. Das ID-Token wird gegen den
JWKS des Anbieters geprueft — Signatur, Aussteller, Empfaenger, Ablauf und
Nonce; alles Noetige kommt aus dem Discovery-Dokument, damit die Anbindung
nicht auf Authentik festgelegt ist.

Wiedererkannt wird jemand an der Kennung des Anbieters (sub), nicht an der
E-Mail-Adresse — Adressen aendern sich. Ein bestehendes Konto mit derselben
Adresse wird verknuepft statt verdoppelt, aber nur bei bestaetigter Adresse:
sonst koennte sich beim Anbieter jemand eine fremde Adresse eintragen und
damit ein hiesiges Konto uebernehmen.

Uebernommen wird bewusst nur, wer jemand ist — plus die Instanz-Administration,
wenn OIDC_ADMIN_GROUP gesetzt ist. Gruppen und Rollen bleiben Sache dieser
Anwendung: die Gruppen im Verzeichnis bedeuten etwas anderes als die hier.

Konten aus dem Verzeichnis haben kein Passwort mehr (passwordHash ist jetzt
optional); Konto-Bereich und Passwort-Anmeldung sagen das statt an einer
leeren Pruefung zu scheitern.

Anleitung mit allen Feldern in Authentik: docs/authentik.md
This commit is contained in:
Florian Wilde
2026-08-15 00:12:21 +02:00
parent e296b1e6c2
commit c8d60d8006
14 changed files with 1039 additions and 11 deletions
@@ -0,0 +1,9 @@
-- Anmeldung über einen externen Anbieter (OpenID Connect).
--
-- `oidcSubject` ist die stabile Kennung beim Anbieter. Sie und nicht die
-- E-Mail-Adresse entscheidet, wer wiedererkannt wird — Adressen ändern sich.
ALTER TABLE "User" ADD COLUMN "oidcSubject" TEXT;
CREATE UNIQUE INDEX "User_oidcSubject_key" ON "User"("oidcSubject");
-- Konten, die sich nur über den Anbieter anmelden, haben kein Passwort.
ALTER TABLE "User" ALTER COLUMN "passwordHash" DROP NOT NULL;
+6 -1
View File
@@ -29,7 +29,12 @@ model User {
email String @unique
name String?
/// scrypt-Hash, siehe src/lib/auth/password.ts — nie das Klartextpasswort.
passwordHash String
/// Leer bei Konten, die sich ausschließlich über den externen Anbieter
/// anmelden: dort gibt es hier kein Passwort zu prüfen.
passwordHash String?
/// Stabile Kennung beim externen Anbieter (OIDC `sub`). Bleibt leer, solange
/// sich das Konto nur mit Passwort anmeldet.
oidcSubject String? @unique
/// Darf Gruppen, Benutzer und Domains verwalten.
isInstanceAdmin Boolean @default(false)
/// Deaktivierte Benutzer können sich nicht anmelden; laufende Sitzungen