WordPress Single Sign-On mit CodeB.
Den OpenID-Connect-Provider von CodeB als Identitätsquelle für eine Self-hosted-WordPress-Seite nutzen. Ein Konto, ein Passwort, Auto-Provisioning beim ersten Login, optionales Rollen-Mapping. Funktioniert mit dem gängigen Plugin OpenID Connect Generic — kein Bezahl-Add-on nötig.
Zeit bis zum ersten Login: ca. 10 Minuten. Getestet gegen WordPress 6.x mit OpenID Connect Generic von daggerhart (das meistinstallierte OIDC-Plugin auf wordpress.org).
Lesen Sie das, bevor Sie OIDC an einen bestehenden WordPress-Benutzer hängen. OIDC-Plugins verknüpfen normalerweise ein bestehendes lokales Konto beim ersten Sign-in mit dem Subject-Identifier (sub) des IdP. Stimmen lokaler Username/E-Mail und CodeB-Identität nicht zusammen, legt das Plugin unter Umständen ein doppeltes WordPress-Konto an — oder überschreibt bei manchen Konfigurationen die Rolle/Profilfelder des verknüpften Benutzers bei jedem Sign-in. Legen Sie vorab fest, wer welches Feld besitzt (WordPress oder CodeB), und testen Sie mit einem Wegwerf-Benutzer, bevor Sie echte Admin-Konten auf OIDC umstellen.
1. Voraussetzungen
- HTTPS auf beiden Seiten. Der CodeB-IdP erzwingt HTTPS für jede Nicht-Loopback-Redirect-URI; die Callback-URL von WordPress muss ebenfalls HTTPS sein. (Steht WordPress hinter einem Reverse-Proxy, stellen Sie sicher, dass WordPress die korrekte
HTTPS-Servervariable sieht, damit es HTTPS-Callback-URLs erzeugt.) - WordPress 5.5+ mit Adminzugriff zur Plugin-Installation.
- Betreiberzugriff auf den CodeB-Host. Sie bearbeiten eine Datei (
clients.json) auf der IIS-Maschine, die CodeB betreibt. Kein Neustart nötig — die Datei wird hot-reloaded. - Ein CodeB-Benutzerkonto für den Test. Über die CodeB-Adminseite register.html anlegen, falls noch keines existiert.
2. Plugin OpenID Connect Generic installieren
In WordPress: Plugins → Hinzufügen. Nach OpenID Connect Generic suchen. Autor sollte daggerhart sein. Jetzt installieren, dann Aktivieren klicken. Nach der Aktivierung erscheint ein neuer Abschnitt unter Einstellungen → OpenID Connect Client.
Andere OIDC-Plugins (WP OAuth Server Client, miniOrange usw.) funktionieren ebenfalls — die Feldnamen unterscheiden sich, die Werte sind dieselben. Diese Anleitung verwendet OpenID Connect Generic, weil es kostenlos, weit verbreitet ist und CodeB als generischen OIDC-Provider behandelt, ohne herstellerspezifische Annahmen.
3. WordPress-Client auf CodeB registrieren
Der CodeB-IdP verlangt eine Vorab-Registrierung jedes Relying Party. Ohne Eintrag liefert er invalid_client.
Auf dem IIS-Host, auf dem CodeB läuft, bearbeiten (oder erzeugen) Sie die Datei unter:
Bei der öffentlichen Installation auf phone.codeb.io lautet der Pfad zum Beispiel D:\aloaha\phone\App_Data\phone.codeb.io\oidc\clients.json. Fügen Sie einen Client-Eintrag hinzu:
Die Form der Redirect-URI ist durch das Plugin festgelegt: /wp-admin/admin-ajax.php?action=openid-connect-authorize. Behalten Sie den vollständigen Query-String bei (CodeB prüft die gesamte URL byteweise — Query-String inklusive). Fügen Sie den Port hinzu, wenn Ihr WordPress nicht auf dem Standard-HTTPS-Port läuft.
Datei speichern. Kein IIS-Recycle nötig — der IdP prüft die mtime von clients.json und lädt sie beim nächsten OIDC-Request neu.
Mehrere WordPress-Seiten (Staging, Prod, Blog), die denselben CodeB-Mandanten teilen? Listen Sie alle Callback-URIs im selben redirect_uris-Array. Ein Client-Eintrag kann viele Seiten bedienen.
4. Plugin konfigurieren
In WordPress: Einstellungen → OpenID Connect Client. Füllen Sie das Formular:
| Feld | Wert |
|---|---|
| Login Type | OpenID-Connect-Button im Login-Formular (oder Auto Login, wenn Sie OIDC für alle erzwingen wollen) |
| Client ID | wordpress (muss exakt mit dem Eintrag in clients.json übereinstimmen) |
| Client Secret Key | Fuegen Sie denselben Wert ein, den Sie in client_secret gesetzt haben |
| OpenID Scope | openid profile email |
| Login Endpoint URL | https://phone.codeb.io/oidc.ashx?action=authorize |
| Userinfo Endpoint URL | https://phone.codeb.io/oidc.ashx?action=userinfo |
| Token Validation Endpoint URL | https://phone.codeb.io/oidc.ashx?action=token |
| End Session Endpoint URL | https://phone.codeb.io/oidc.ashx?action=end_session |
| ACR values | (leer lassen, außer Sie brauchen Step-up) |
| Identity Key | preferred_username (der CodeB-Username) |
| Nickname Key | preferred_username |
| Email Formatting | {email} |
| Display Name Formatting | {name} (fällt auf Nickname zurück, wenn name fehlt) |
| Link Existing Users | an — beim ersten Sign-in über E-Mail matchen, dann für künftige Logins mit OIDC verknüpfen |
| Create user if does not exist | an — neue Konten beim ersten Sign-in automatisch anlegen |
| Enforce Privacy | aus (außer Sie wollen OIDC für ALLE Logins erzwingen, inklusive Admin) |
Speichern. Das Plugin entdeckt Endpunkte nicht automatisch — alles wird explizit eingetragen, was zu CodeBs Philosophie passt: vorhersagbar, auditierbar, keine Magie.
Die End Session Endpoint URL ist wichtig für sauberen Benutzerwechsel. Meldet sich ein WordPress-Benutzer ab, leitet das Plugin über diese URL um, was CodeB veranlasst, die SSO-Assertion im Browser-localStorage auf phone.codeb.io zu löschen. Ohne sie loggt der nächste Sign-in den zuvor angemeldeten CodeB-Benutzer stillschweigend wieder ein.
5. Claims mappen
CodeB liefert einen Standardsatz OIDC-Claims. Das Plugin liest sie wie folgt:
| CodeB-Claim | WordPress-Feld | Hinweise |
|---|---|---|
sub | (interner OIDC-Subject-Identifier) | Stabil pro Benutzer. Verknüpft das WordPress-Konto mit einer CodeB-Identität. Subs nicht zwischen Benutzern wiederverwenden. |
preferred_username | Benutzername / Login | Über „Identity Key“ konfigurierbar. Wird beim Auto-Provisioning zum WordPress-Login. |
name | Anzeigename | Aus dem CodeB-Profil. Fällt auf Nickname zurück, wenn leer. |
email | Aus dem CodeB-Profil. Wird für „Link Existing Users“ verwendet. | |
role | (out-of-the-box nicht vom Plugin verwendet) | Rollen-Mapping siehe Abschnitt 6. |
groups | (out-of-the-box nicht vom Plugin verwendet) | WordPress hat kein eingebautes Group-Konzept; manche Membership-Plugins konsumieren groups via Filter. |
Die Profilfelder des Benutzers setzen Sie in der CodeB-Adminseite register.html — Bearbeiten des Nutzers und Name, Email usw. ausfüllen.
6. Rollen-Mapping
OpenID Connect Generic legt neue WordPress-Nutzer standardmäßig mit der Default Role aus Einstellungen → Allgemein an (typischerweise Subscriber). Bestehende verknüpfte Nutzer behalten ihre bisherige WordPress-Rolle.
Soll die Rollenzuweisung von CodeB getrieben sein, ist der einfachste Weg ein kleiner Snippet in functions.php, der bei jedem Sign-in den role-Claim ausliest:
Ergebnis: Meldet sich ein CodeB-Benutzer mit role: "admin" an, wird seine WordPress-Rolle auf Administrator gesetzt. Passen Sie die Map an Ihre WordPress-Rollen-Taxonomie an (Editor, Author, Contributor usw.). Setzen Sie admin in derselben Map zurück auf subscriber, wenn CodeB-seitige Herabstufungen durchschlagen sollen.
Dieses Snippet schreibt die WordPress-Rolle bei jedem Sign-in neu. Verwalten Sie Rollen zusätzlich lokal in WordPress (jemandem manuell Editor gegeben), überschreibt der nächste OIDC-Login das. Wählen Sie eine Source of Truth: Entweder treibt CodeB die Rollen (Snippet verwenden) oder WordPress (Snippet weglassen). Nicht mischen.
7. Round-Trip testen
- Eine WordPress-Login-Seite im Inkognito-Modus öffnen.
- Den Button Login with OpenID Connect unter dem Standard-Login-Formular klicken.
- Der Browser springt zu
https://phone.codeb.io/login.html. - CodeB-Username + Passwort eingeben. Der Browser hasht das Passwort lokal zu HA1 und postet nur den Hash — CodeB sieht den Klartext nie.
- Bei Erfolg landen Sie zurück in WordPress, angemeldet. Beim ersten Login wird automatisch ein WordPress-Konto mit den obigen Claims angelegt.
Prüfen in WordPress: Benutzer → Alle Benutzer zeigt den neuen Nutzer mit konfigurierter E-Mail und Rolle. Der User-Record trägt einen Meta-Key openid-connect-generic-subject-identity, der dem CodeB-sub entspricht.
8. Aus einem CodeB-Nutzer einen WordPress-Admin machen
Zwei Wege:
- Manuell in WordPress. Den Nutzer einmal über OIDC anmelden lassen, damit das Konto existiert, dann unter Benutzer → Alle Benutzer die Rolle auf Administrator umstellen. Das Snippet aus Abschnitt 6 nicht verwenden (sonst macht der nächste Sign-in das rückgängig).
- Von CodeB getrieben. Die CodeB-Rolle des Nutzers in register.html auf
adminsetzen und das Snippet aus Abschnitt 6 verwenden, damit derrole-Claim bei jedem Sign-in auf Administrator mappt.
Für feinere Steuerung (Editor vs. Admin, mehrere Admin-Tiers, Capability-Mapping) der Hook openid-connect-generic-user-logged-in in Kombination mit der WordPress-wp_roles()-Capabilities-API.
9. Fehlersuche
| Symptom | Wahrscheinliche Ursache / Fix |
|---|---|
invalid_client von CodeB |
Die von WordPress gesendete Redirect-URI matcht nichts in clients.json. CodeB verlangt byteweise Gleichheit. URI im Browser-Adressfeld im Fehlermoment ablesen und wörtlich in redirect_uris übernehmen. |
invalid_request bei /authorize |
CodeB erwartet PKCE (Public Client), das Plugin sendet aber keinen code_challenge. Tragen Sie ein nicht-leeres client_secret in clients.json ein — dann behandelt CodeB den Client als confidential und akzeptiert die Anfrage ohne PKCE. |
invalid_client bei /token |
Das Plugin hat das falsche client_secret gepostet. Unter WordPress Einstellungen → OpenID Connect Client prüfen, ob das Secret exakt mit clients.json übereinstimmt (kein Leerzeichen am Ende, keine typografischen Anführungszeichen aus Copy-Paste). |
| WordPress legt bei jedem Sign-in einen neuen Nutzer an statt zu verknüpfen | Die Plugin-Option Link Existing Users muss AN sein, und der email-Claim des CodeB-Nutzers muss exakt der E-Mail des bestehenden WordPress-Kontos entsprechen. E-Mail in der CodeB-register.html setzen. |
| Plugin meldet „HTTP error“ gegenüber /token oder /userinfo | Das serverseitige wp_remote_post von WordPress kann CodeB nicht erreichen. Firewall-Regeln / Proxy-Einstellungen auf dem WordPress-Host prüfen. Der Browser macht den Token-Exchange nicht — der WordPress-PHP-Prozess macht ihn und braucht ausgehende HTTPS-Verbindungen zu phone.codeb.io. |
| SSL-Validierung fehlgeschlagen | Ihr WordPress-Host vertraut dem SSL-Zertifikat von CodeB nicht. Bei Self-hosted-CodeB mit privater CA: CA-Zertifikat in den Trust-Store des WordPress-Hosts einspielen, ODER die Plugin-Option „Disable SSL verification“ aktivieren (letztes Mittel — in Produktion nicht angeschaltet lassen). |
| Benutzer bleibt nach WordPress-Logout angemeldet | End Session Endpoint URL in der Plugin-Konfiguration auf https://phone.codeb.io/oidc.ashx?action=end_session setzen. Ohne sie überlebt die CodeB-SSO-Assertion im Browser-localStorage den WordPress-Logout, und der nächste Sign-in mintet automatisch als vorheriger Benutzer. |
| Beim Testen aus dem Admin ausgesperrt | ?loggedout=true an die WordPress-Login-URL anhängen, oder den Ordner des OpenID-Connect-Generic-Plugins unter wp-content/plugins/ per FTP/SSH vorübergehend umbenennen, um das Plugin abzuschalten und über das Standard-WordPress-Login wieder reinzukommen. |
10. Kurzreferenz
| Was | Wert |
|---|---|
| CodeB Authorize-Endpunkt | https://phone.codeb.io/oidc.ashx?action=authorize |
| CodeB Token-Endpunkt | https://phone.codeb.io/oidc.ashx?action=token |
| CodeB Userinfo-Endpunkt | https://phone.codeb.io/oidc.ashx?action=userinfo |
| CodeB End_session-Endpunkt | https://phone.codeb.io/oidc.ashx?action=end_session |
| CodeB Discovery-Dokument | https://phone.codeb.io/.well-known/openid-configuration |
| CodeB JWKS | https://phone.codeb.io/oidc.ashx?action=jwks |
| Standard-WordPress-Callback | https://<wordpress>/wp-admin/admin-ajax.php?action=openid-connect-authorize |
| Unterstützte Scopes | openid profile email |
| Signaturalgorithmus | RS256 |
| PKCE | S256 (Pflicht für Public Clients; optional für confidential) |
| OIDC-Plugin | OpenID Connect Generic (daggerhart) |