all systems self-hosted

~/selfhostjournal $

← Alle Artikel

Single Sign-on für WordPress mit Authentik

4–6 Minuten

Kurz gesagt

Problem: WordPress war der letzte Dienst, der noch ein eigenes Passwort wollte.

Lösung: Ein OAuth2/OpenID-Provider in Authentik plus das Plugin OpenID Connect Generic in WordPress, mit allen Werten unten aufgelistet.

Getestet mit: WordPress 7.1, Authentik 2026.8, OpenID Connect Generic 3.11

Ich nutze Authentik als zentrale Anmeldung für meine selbst gehosteten Dienste. Dieser Blog soll genauso funktionieren: ein Klick auf den Login-Button, Passkey, fertig. Die normale WordPress-Anmeldung bleibt als Rückfallebene erhalten, falls Authentik einmal nicht erreichbar ist.

In den Beispielen läuft Authentik unter https://auth.example.com, der Blog unter https://blog.example.com, und der Slug der Authentik-Anwendung ist blog. Ersetze diese Werte durch deine eigenen.

So funktioniert die Anmeldung

  1. Du klickst auf der WordPress-Anmeldeseite auf den Login-Button.
  2. WordPress leitet dich zu Authentik weiter, wo du dich anmeldest, zum Beispiel mit einem Passkey.
  3. Authentik schickt dich mit einem Einmal-Code zurück zu WordPress.
  4. WordPress tauscht den Code im Hintergrund gegen Tokens, liest Benutzername und E-Mail-Adresse und meldet dich als passenden WordPress-Benutzer an.

1. Authentik: Provider anlegen

Im Authentik-Adminbereich unter Applications → Providers → Create den Typ OAuth2/OpenID Provider wählen. Das sind meine Einstellungen:

EinstellungWert
NameProvider for Blog
Authorization flowdefault-provider-authorization-implicit-consent (ohne zusätzliche „Zugriff erlauben?“-Seite)
Invalidation flowdefault-provider-invalidation-flow
Client typeConfidential
Client ID / Client Secreterzeugt Authentik, beide für WordPress kopieren
Redirect URI (strict)https://blog.example.com/wp-admin/admin-ajax.php?action=openid-connect-authorize
Signing keyauthentik Self-signed Certificate
Scopesdie Standard-Mappings für openid, email und profile
Subject modeBased on the User’s hashed ID
Include claims in id_tokenan
Issuer modeEach provider has a different issuer
Grant typesAuthorization code und Refresh token
Access token validity5 Minuten
Refresh token validity30 Tage

Achtung: Wenn du den Provider über die Authentik-API statt über die Oberfläche anlegst, musst du grant_types selbst setzen. Sonst bleibt die Liste leer und jede Anmeldung endet mit „The request is otherwise malformed“. Im Authentik-Serverlog steht dann „Invalid grant_type for provider“.

Zum Vergleich derselbe Provider, über die API angelegt:

curl -X POST https://auth.example.com/api/v3/providers/oauth2/ 
  -H "Authorization: Bearer $AUTHENTIK_TOKEN" 
  -H "Content-Type: application/json" 
  -d '{
    "name": "Provider for Blog",
    "client_type": "confidential",
    "authorization_flow": "<UUID von default-provider-authorization-implicit-consent>",
    "invalidation_flow": "<UUID von default-provider-invalidation-flow>",
    "property_mappings": ["<openid-UUID>", "<email-UUID>", "<profile-UUID>"],
    "signing_key": "<UUID des Signatur-Zertifikats>",
    "sub_mode": "hashed_user_id",
    "include_claims_in_id_token": true,
    "grant_types": ["authorization_code", "refresh_token"],
    "redirect_uris": [{
      "matching_mode": "strict",
      "url": "https://blog.example.com/wp-admin/admin-ajax.php?action=openid-connect-authorize"
    }]
  }'

2. Authentik: Anwendung anlegen

Unter Applications → Applications → Create:

EinstellungWert
NameBlog
Slugblog (wird Teil der Issuer- und JWKS-Adresse)
ProviderProvider for Blog
Launch URLhttps://blog.example.com/wp-admin/

Danach die Anwendung öffnen, unter Policy / Group / User Bindings die Benutzer oder die Gruppe binden, die sich bei WordPress anmelden dürfen. Ohne Binding kann jeder Authentik-Benutzer die Anwendung nutzen.

Alle Endpunkte stehen im Discovery-Dokument der Anwendung. Ruf es einmal auf, um zu prüfen, dass alles passt:

curl -s https://auth.example.com/application/o/blog/.well-known/openid-configuration

3. WordPress: Plugin installieren

Installiere und aktiviere OpenID Connect Generic (von daggerhart) aus dem Plugin-Verzeichnis. Die Einstellungen findest du unter Einstellungen → OpenID Connect Client. Sobald das Plugin aktiv ist, zeigt die Anmeldeseite einen Button. Er funktioniert erst, wenn die Einstellungen unten gespeichert sind.

4. WordPress: alle Plugin-Einstellungen

FeldWert
Login TypeOpenID Connect button on login form
Client IDaus dem Authentik-Provider
Client Secret Keyaus dem Authentik-Provider
OpenID Scopeopenid email profile
Login Endpoint URLhttps://auth.example.com/application/o/authorize/
Userinfo Endpoint URLhttps://auth.example.com/application/o/userinfo/
Token Validation Endpoint URLhttps://auth.example.com/application/o/token/
End Session Endpoint URLhttps://auth.example.com/application/o/blog/end-session/
JWKS URIhttps://auth.example.com/application/o/blog/jwks/
Issuer (falls deine Version danach fragt)https://auth.example.com/application/o/blog/
ACR valuesleer lassen
Identity Keypreferred_username
Disable SSL Verifyaus
HTTP Request Timeout5
Nickname Keypreferred_username
Email Formatting{email}
Display Name Formatting{name}
Identify with User Nameaus
Enable Refresh Tokenan
Link Existing Usersan
Create user if does not existaus
Redirect Back to Origin Pagean
Redirect to the login screen when session is expiredaus
Enable Loggingbeim Testen an, danach aus

Nur die JWKS-URI, die End-Session-URL und der Issuer enthalten den Slug der Anwendung. Die Endpunkte für authorize, token und userinfo sind in Authentik für alle Anwendungen gleich.

Tipp: Ganz unten auf der Einstellungsseite des Plugins steht die genaue Redirect-URI, die WordPress verwendet. Kopier sie von dort nach Authentik, damit beide Zeichen für Zeichen übereinstimmen.

Wie bestehende Benutzer zugeordnet werden

Mit Link Existing Users sucht das Plugin einen WordPress-Benutzer, dessen Benutzername dem Wert des Identity Keys entspricht, hier also dem Authentik-Benutzernamen (preferred_username). Bei der ersten Anmeldung werden die beiden Konten verknüpft, danach bleibt die Verknüpfung fest. Verwende in WordPress und Authentik denselben Benutzernamen. Solange Create user if does not exist aus ist, bekommt niemand ein neues WordPress-Konto, nur weil er einen Authentik-Zugang hat.

Optional: das Secret aus der Datenbank heraushalten

Statt die Werte auf der Einstellungsseite einzutragen, kannst du sie in der wp-config.php definieren. Das Plugin verwendet dann diese Werte und zeigt die Felder schreibgeschützt an:

define( 'OIDC_CLIENT_ID', 'deine-client-id' );
define( 'OIDC_CLIENT_SECRET', 'dein-client-secret' );
define( 'OIDC_CLIENT_SCOPE', 'openid email profile' );
define( 'OIDC_ENDPOINT_LOGIN_URL', 'https://auth.example.com/application/o/authorize/' );
define( 'OIDC_ENDPOINT_USERINFO_URL', 'https://auth.example.com/application/o/userinfo/' );
define( 'OIDC_ENDPOINT_TOKEN_URL', 'https://auth.example.com/application/o/token/' );
define( 'OIDC_ENDPOINT_LOGOUT_URL', 'https://auth.example.com/application/o/blog/end-session/' );

5. Testen

Bevor du auf den Button klickst, teste die Anfrage in der Kommandozeile. Ein funktionierender Provider leitet zum Authentik-Login weiter:

curl -s -o /dev/null -w "%{http_code} -> %{redirect_url}n" 
  "https://auth.example.com/application/o/authorize/?response_type=code&scope=openid%20email%20profile&client_id=DEINE_CLIENT_ID&state=test&redirect_uri=https%3A%2F%2Fblog.example.com%2Fwp-admin%2Fadmin-ajax.php%3Faction%3Dopenid-connect-authorize"

# gut:    302 -> https://auth.example.com/if/flow/default-authentication-flow/?...
# falsch: 302 -> https://blog.example.com/...?error=invalid_request&...

Wenn das passt: aus WordPress abmelden, auf den Login-Button klicken und mit Authentik anmelden. Du solltest als dein bestehender Benutzer im Dashboard landen.

Fehlersuche

Was du siehstWahrscheinliche Ursache
„The request is otherwise malformed“Keine Grant Types im Provider (über die API angelegt)
„Redirect URI Error“Die Redirect-URI in Authentik weicht von der ab, die WordPress sendet, schon ein Schrägstrich reicht
Zurück in WordPress, aber nicht angemeldetKein WordPress-Benutzer passt zu preferred_username, und das Anlegen neuer Benutzer ist aus
„Permission denied“ in AuthentikDein Benutzer ist nicht an die Anwendung gebunden
Eine leere Seite mit „0“Authentik hat einen Fehler an die Redirect-URI zurückgegeben. Sieh ins Authentik-Serverlog.

Was ich gelernt habe

  • Die Authentik-Oberfläche setzt Standardwerte, die die API nicht setzt.
  • Das Serverlog nennt den wahren Grund, wenn der Browser nur einen allgemeinen Fehler zeigt.
  • Behalte die lokale WordPress-Anmeldung als Rückfallebene. Wenn der Identity Provider ausfällt, willst du trotzdem auf deine eigene Seite kommen.

Alles hier hat bei mir zum Zeitpunkt des Schreibens funktioniert. Software ändert sich, und dein Setup ist anders: mach vorher ein Backup, teste vorsichtig und wende die Schritte auf eigenes Risiko an. Details im Impressum.