Wie ein Dienst sich an den zentralen Anmeldedienst auth.seolizer.de andockt (Single Sign-On).
/authorize, /api/token,
/.well-known/jwks.json und die OIDC-Discovery laufen produktiv. Client-Registrierung
erfolgt derzeit per CLI durch einen Administrator (bin/client_add.php).
Ein angebundener Dienst (Client) betrachtet einen Nutzer nur dann als eingeloggt, wenn
auth.seolizer.de eine gültige Login-Bestätigung liefert. Fehlt sie, leitet der Dienst
den Nutzer zum zentralen Login weiter; nach erfolgreicher Anmeldung kehrt der Nutzer zum Dienst zurück.
Technisch ist das ein OAuth-2.0-/OIDC-artiger Authorization-Code-Flow mit PKCE.
Ein Administrator registriert deinen Dienst einmalig. Danach erhältst du:
| Feld | Bedeutung |
|---|---|
client_id | Öffentliche Kennung des Dienstes, z. B. word. |
client_secret | Geheimnis (nur für vertrauliche Server-Clients; niemals im Browser/Frontend). |
redirect_uri | Whitelist erlaubter Rücksprung-URLs, z. B. https://word.seolizer.de/auth/callback. |
scopes | Erlaubte Rechte, z. B. openid profile email. |
state (CSRF-Schutz) und einen PKCE-code_verifier + code_challenge (S256) und leitet weiter zu:
https://auth.seolizer.de/authorize
?client_id=word
&redirect_uri=https://word.seolizer.de/auth/callback
&response_type=code
&scope=openid%20profile%20email
&state=RANDOM_STATE
&code_challenge=BASE64URL_S256
&code_challenge_method=S256
auth.seolizer.de leitet zurück zur redirect_uri mit einem einmaligen Code:
https://word.seolizer.de/auth/callback?code=AUTH_CODE&state=RANDOM_STATE
Dienst prüft, dass state mit dem gesendeten übereinstimmt.
| Token | Zweck | Laufzeit |
|---|---|---|
access_token | Zugriff auf Dienste/APIs | 5–15 Min |
id_token | Identitätsinfos über den Nutzer (JWT) | 5–15 Min |
refresh_token | Erneuert Access-Tokens | Tage–Wochen (widerrufbar) |
JWT-Claims u. a.: sub (Benutzer-UUID, unveränderlich), iss=https://auth.seolizer.de,
aud (deine client_id), iat, exp, jti,
scope, roles.
POST https://auth.seolizer.de/api/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=AUTH_CODE
&redirect_uri=https://word.seolizer.de/auth/callback
&client_id=word
&client_secret=DEIN_SECRET
&code_verifier=DEIN_PKCE_VERIFIER
Antwort (JSON): access_token, id_token, refresh_token,
token_type=Bearer, expires_in.
Der Dienst prüft die JWT-Signatur gegen die öffentlichen Schlüssel unter
https://auth.seolizer.de/.well-known/jwks.json. Der private Schlüssel verlässt den
Auth-Dienst nie. Prüfe zusätzlich immer:
kid aus JWKS)iss == https://auth.seolizer.deaud == deine client_idexp nicht abgelaufen, iat plausibelFür erste Tests läuft bereits eine session-basierte Auth-API (Cookie + CSRF). Diese ist die Basis, auf der der Redirect-Flow aufsetzt.
| Methode & Pfad | Zweck | Status |
|---|---|---|
GET /api/health | Statuscheck (inkl. DB) | live |
GET /api/csrf | CSRF-Token für mutierende Requests | live |
POST /api/auth/register | Registrierung (E-Mail, Benutzername, Passwort) | live |
POST /api/auth/login | Login per E-Mail ODER Benutzername | live |
POST /api/auth/logout | Abmelden | live |
GET /api/auth/me | Aktueller Nutzer inkl. roles | live |
PATCH /api/auth/profile | Profil ändern (Anzeigename, E-Mail, Benutzername) | live |
POST /api/auth/password | Passwort ändern (aktuelles + neues) | live |
GET /authorize | Redirect-Login startet hier | live |
POST /api/token | Code gegen Tokens tauschen | live |
GET /.well-known/jwks.json | Öffentliche Signaturschlüssel (RS256) | live |
GET /.well-known/openid-configuration | OIDC-Discovery | live |
POST /api/revoke | Refresh-Token widerrufen (RFC 7009) | live |
GET /logout | Abmelden (OIDC end_session) | live |
Mutierende Requests brauchen den CSRF-Token aus /api/csrf im Header X-CSRF-Token
und dasselbe Session-Cookie (Cookie-Jar).
# 1) CSRF-Token holen (setzt Session-Cookie)
CSRF=$(curl -s -c cj.txt https://auth.seolizer.de/api/csrf | jq -r .token)
# 2) Login
curl -s -b cj.txt -c cj.txt \
-H "Content-Type: application/json" \
-H "X-CSRF-Token: $CSRF" \
-d '{"identifier":"testuser","password":"..."}' \
https://auth.seolizer.de/api/auth/login
# 3) Aktuellen Nutzer abfragen
curl -s -b cj.txt https://auth.seolizer.de/api/auth/me
Zwei Bausteine, je nach Bedarf:
POST /api/revoke (RFC 7009)Serverseitig aufrufen (Client-Authentifizierung). Antwort ist immer 200,
auch bei unbekanntem Token.
POST https://auth.seolizer.de/api/revoke
Content-Type: application/x-www-form-urlencoded
token=DEIN_REFRESH_TOKEN
&token_type_hint=refresh_token
&client_id=word
&client_secret=DEIN_SECRET
Access-Tokens sind kurzlebige, zustandslose JWTs und laufen von selbst ab; sie werden nicht einzeln widerrufen.
GET /logout (OIDC end_session)Beendet die zentrale Auth-Session und widerruft alle Refresh-Tokens des Nutzers. Der Nutzer
wird zu post_logout_redirect_uri zurückgeleitet, sofern diese in der Whitelist
des Clients steht (dieselbe Whitelist wie redirect_uri); andernfalls zur
zentralen Anmeldeseite.
GET https://auth.seolizer.de/logout
?client_id=word
&post_logout_redirect_uri=https://word.seolizer.de/auth/callback
&state=RANDOM_STATE
Der Dienst sollte parallel seine eigene lokale Session beenden.
state bei jedem Login prüfen (Schutz gegen CSRF/Session-Fixation).S256) verwenden, auch bei vertraulichen Clients.client_secret nur serverseitig, nie im Browser/Frontend.iss, aud und exp jedes Tokens serverseitig prüfen.