CodeB-Anmeldung in Ihre App einbauen.
Diese Seite führt Sie durch alles, was Sie brauchen, um den OpenID-Connect-Identity-Provider von CodeB von einer Drittanbieter-Website aus zu konsumieren — PKCE-Setup, Auth-Code-Tausch, JWT-Validierung, Refresh-Handhabung und Logout. Kopierfertige Beispiele in Vanilla-JavaScript und Node, plus ein curl-Durchlauf für Backend-Bastler.
Der gesamte IdP ist standardkonform zu OIDC Core 1.0. Wenn Sie bereits eine Library wie oidc-client-ts, openid-client (Node), Authlib (Python) oder die eingebaute OpenIdConnectAuthentication aus .NET verwenden — richten Sie sie auf die Discovery-URL und konfigurieren Sie Ihre Client-ID. Die meisten Schritte unten kollabieren dann zu einem Config-Block.
1. Voraussetzungen
- Ihre Website muss über HTTPS ausgeliefert werden. Der IdP weist nicht-loopback
http://-Redirect-URIs zurück. - Sie benötigen einen HTTP-Client, der
POSTmitapplication/x-www-form-urlencoded-Bodies beherrscht, und die Fähigkeit, RS256-JWT-Signaturen zu verifizieren (jede OIDC/JOSE-Library kann beides). - Der Host, auf dem CodeB läuft, muss vom Browser und von Ihrem Server erreichbar sein (der serverseitige Token-Tausch ist ein Back-Channel-Aufruf).
2. Anwendung registrieren
CodeB verlangt, dass jede Relying Party vorregistriert ist — die Standard-OIDC-Haltung (RFC 6749 §3.1.2.1). Die Vorregistrierung verriegelt, welche redirect_uri-Werte der IdP akzeptiert, und genau das verhindert, dass ein Angreifer die Auth-Codes Ihrer Nutzer abfängt.
Der Betreiber fügt Ihren Client in App_Data/<tenant>/oidc/clients.json ein. Die Datei ist pro Mandant und wird bei jeder Änderung heiß nachgeladen — kein IIS-Recycle nötig. Beispiel:
Wenn Sie den Host nicht selbst betreiben, schreiben Sie an info@codeb.io mit Ihrem Anwendungsnamen, der exakten Callback-URL (HTTPS, außer loopback) und ob Sie Test- vs. Produktions-Redirects benötigen. Alle CodeB-Clients sind öffentliche PKCE-only-Clients — kein Client-Secret zu verwalten.
Der eingebaute codeb-admin-Client ist immer verfügbar und an https://<tenant>/oidc-callback.html gebunden — das ist, was die Admin-UI antreibt. Sie können ihn nicht in clients.json überschreiben oder entfernen.
Für Experimente gegen Ihren eigenen Mandanten ist der eingebaute Client codeb-admin mit der Redirect-URI https://<ihr-host>/oidc-callback.html vorregistriert — das nutzen die CodeB-Admin-Seiten. Verwenden Sie ihn nicht für Drittanbieter-Produktions-Integrationen; fordern Sie Ihre eigene Client-ID an.
3. Endpoints entdecken
Der IdP veröffentlicht alles Nötige unter der Standard-Well-known-URL:
Antwort (gekürzt):
Die meisten Libraries holen sich das einmal beim Start und cachen es. Holen Sie es neu, wenn Sie bei der Token-Validierung kid-Mismatches zu sehen beginnen (Betreiber hat den Key rotiert).
4. Der Anmelde-Flow
Standard-Authorization-Code mit PKCE. Vier bewegliche Teile: Ihr Frontend, Ihr Backend, der Browser des Nutzers und der CodeB-IdP.
PKCE-Paar im Frontend erzeugen
Zufälliger 32-Byte-code_verifier, base64url-codiert. code_challenge ist der SHA-256 des Verifiers, ebenfalls base64url. Verifier in sessionStorage ablegen, damit die Callback-Seite ihn wiederfindet.
Nutzer zu /authorize umleiten
Mit Ihrer client_id, Ihrer redirect_uri, angefragten Scopes (immer openid einschließen), einem zufälligen state-Token, dem code_challenge und code_challenge_method=S256.
CodeB fordert den Nutzer zur Anmeldung auf
Der Nutzer landet auf /login.html, tippt seinen CodeB-Benutzernamen + Passwort (clientseitig zu HA1 gehasht; das Klartext-Passwort verlässt nie den Browser). Bei Erfolg leitet CodeB zurück auf Ihre redirect_uri mit ?code=…&state=….
State validieren, Code tauschen
Frontend prüft, dass state mit dem gesendeten Wert übereinstimmt. Dann postet entweder das Frontend (Public Client) oder das Backend (Confidential Client) den Code + PKCE-Verifier an /token und erhält access_token, id_token, refresh_token.
ID-Token verifizieren, Nutzer einloggen
JWT-Signatur gegen die JWKS des IdP validieren, iss, aud, exp, nonce prüfen. Der sub-Claim ist die Nutzer-ID; role ist admin/user/siponly/guest.
5. Vollständiger Code — Vanilla-JS (Public SPA Client)
Für eine Single-Page-App, die den gesamten Flow clientseitig erledigt. Zwei Dateien: ein Launcher und ein Callback-Handler.
Launcher (der Button, der die Anmeldung startet)
Callback-Handler (die Seite, auf die CodeB zurückleitet)
Public Clients müssen PKCE verwenden. Ohne PKCE kann jeder, der die Redirect-URL abfängt, den Code gegen Tokens tauschen. Wir akzeptieren den authorization_code-Grant nicht ohne code_verifier.
6. Vollständiger Code — Node / Express (Confidential Client)
Für ein Backend, das den Token-Tausch serverseitig erledigt — das empfohlene Muster, wenn Sie Ihren eigenen Server kontrollieren. Nutzt die Library openid-client, die Discovery, PKCE, Token-Validierung und Refresh handhabt.
7. curl-Durchlauf
Nützlich, um den IdP aus einem Skript oder einer Postman-Collection heraus anzutesten. Ersetzen Sie YOUR_CLIENT_ID, YOUR_REDIRECT_URI und die PKCE-Werte durch Ihre eigenen.
Schritt 1 — die Authorize-URL im Browser öffnen
Anmelden. Der Browser landet auf Ihrer Callback-URL mit ?code=<langer String>&state=abc123.
Schritt 2 — Code gegen Tokens tauschen
Antwort:
Schritt 3 — Nutzerprofil abrufen
8. ID-Token validieren
Wenn Sie ID-Tokens serverseitig akzeptieren (zum Beispiel, um den Nutzer ohne Back-Channel-Call zu identifizieren), MÜSSEN Sie sie verifizieren. Validierung überspringen heißt: jeder kann Ihnen ein gefälschtes Token in die Hand drücken.
Jede OIDC/JOSE-Library erledigt das für Sie. Die nötigen Prüfungen:
- Signatur — gegen den öffentlichen Schlüssel aus
jwks_uriverifizieren, passend zurkidim JWT-Header. iss— muss dem Issuer aus dem Discovery-Dokument entsprechen (https://phone.codeb.io).aud— muss Ihrerclient_identsprechen.exp— muss in der Zukunft liegen (ein paar Sekunden Clock-Skew zulassen).iat— Sanity-Check: nicht weit in der Zukunft.nonce— falls Sie eine an/authorizegesendet haben, muss sie im Token zurückkommen.
Decodierte ID-Token-Payload:
Der role-Claim ist die CodeB-spezifische Rollen-Zuweisung (admin, user, siponly oder guest). Der Standard-groups-Claim ist per Default ein einelementiges Array mit der Rolle — das erwarten die meisten RPs. Admins können pro Nutzer überschreiben via Groups-Feld im Nutzerprofil-Editor (register.html) — wenn gesetzt, ersetzen diese Gruppen das Rolle-als-Gruppe-Default, was der empfohlene Weg ist, RP-spezifische Mitgliedschaften (Nextcloud-Gruppen, App-Rollen, Abteilungen) ins Token zu speisen.
9. Refresh + Logout
Access-Token erneuern
Access-Tokens laufen 1 Stunde. Refresh-Tokens 4 Stunden und werden bei jeder Nutzung rotiert (entsprechend OAuth-2.1-Best-Practice): jeder Aufruf von /token mit grant_type=refresh_token liefert ein frisches refresh_token, das alte wird sofort invalidiert. Speichern Sie das neue, werfen Sie das alte weg.
Wenn Sie jemals ein bereits eingelöstes refresh_token vorlegen, antwortet der IdP mit invalid_grant. Das ist das Sicherheits-Feature der Rotation: es zeigt Ihnen, dass das Token anderswo benutzt wurde (mögliche Exfiltration). Erzwingen Sie eine erneute Anmeldung.
Nutzer abmelden
Löschen Sie Ihre eigene Session, dann optional auf den End-Session-Endpoint des IdP umleiten:
Weil CodeB cookie-frei ist, ist der IdP-seitige Logout meist nur ein Redirect — es gibt kein IdP-Session-Cookie zu löschen. Die eigentliche Logout-Arbeit passiert bei Ihnen: Tokens wegwerfen.
10. Token-Widerruf (RFC 7009)
Sie müssen die Session eines Nutzers sofort IdP-seitig beenden (Admin-Aktion, Passwort-Änderung, Mitarbeiter-Abgang)? POSTen Sie das refresh_token an /oidc.ashx?action=revoke. Beim nächsten Refresh-Versuch des RP gibt es invalid_grant und der Nutzer muss sich erneut anmelden.
Liefert immer 200 {}, unabhängig davon, ob das Token existierte — das ist RFC 7009 §2.2 mit Absicht, um Token-Enumeration zu verhindern. Confidential Clients müssen client_secret mitschicken; Public Clients dürfen ohne Auth widerrufen.
Access-Tokens sind zustandslose JWTs mit 1h-TTL, deshalb macht RFC 7009 §2.2 serverseitigen Widerruf optional — CodeB macht Access-Token-Widerruf zum No-Op (liefert trotzdem 200). Um eine Session schneller zu beenden, widerrufen Sie das refresh_token UND lassen Sie den RP sein In-Memory-access_token verwerfen.
11. Authentifizierungs-Faktor (amr / acr)
Jedes ausgestellte id_token und access_token trägt zwei Claims, die beschreiben, wie sich der Nutzer tatsächlich authentifiziert hat:
amr— Array von RFC 8176-Methoden-Codes. Häufige Werte, die CodeB emittiert:"pwd"(HA1-Formular-Login),"hwk"(Hardware-Key, z. B. Smartcard),"mfa"(Multi-Faktor),"swk"(Software-Key),"otp"(One-Time-Password).acr— eine URI, die die Authentifizierungs-Kontext-Klasse benennt. CodeB verwendeturn:codeb:acr:pwd,urn:codeb:acr:hwk,urn:codeb:acr:hwk-mfa,urn:codeb:acr:mfa.
RPs, die Step-up-Auth brauchen (z. B. Smartcard-Login für sensitive Operation erzwingen), können auf acr verzweigen:
Die Claims überleben Refresh-Token-Rotation, also bleibt der Faktor für die gesamte Session-Lebensdauer korrekt. Sie werden auch durch die cookielose SSO-Assertion getragen: meldet sich der Nutzer innerhalb des 30-min-Fensters bei einem zweiten RP an, sieht der neue RP denselben Faktor.
12. Key-Rotation-Runbook (Betreiber)
Der IdP signiert jedes JWT mit einem pro-Mandant 2048-Bit-RSA-Key. Für Rotation ohne Downtime unterstützt CodeB ein Überlappungsfenster: zwei Keys können gleichzeitig aktiv sein. Tokens, die vor der Rotation signiert wurden, verifizieren weiter via den vorigen Key, solange er auf der Platte liegt; neue Tokens werden mit dem frisch erzeugten Key signiert.
- SSH / RDP auf den IIS-Host.
- Aktuellen Key beiseite schieben:
cd D:\aloaha\phone\App_Data\phone.codeb.io\oidc move private-key.xml private-key-previous.xml
- Der nächste Request an
/oidc.ashxauf diesem Mandanten erkennt die fehlendeprivate-key.xmlund erzeugt eine frische. Der vorige Key bleibt als verify-only-Fallback geladen. - JWKS publiziert nun beide öffentlichen Schlüssel (den neuen zuerst):
curl https://phone.codeb.io/.well-known/jwks.json | jq .keys
RPs, die JWKS regelmäßig holen, picken beide automatisch auf. Vor der Rotation signierte Tokens verifizieren weiter; neue Tokens verwenden die neue
kid. - Warten, bis das Überlappungsfenster leerläuft. Sobald jedes unter dem alten Key ausgegebene refresh_token rotiert wurde (max. 4 h bei Default-TTL), darf der vorige Key gelöscht werden:
del D:\aloaha\phone\App_Data\phone.codeb.io\oidc\private-key-previous.xml
JWKS fällt beim nächsten Request auf einen einzigen Key zurück; etwaige Nachzügler mit Token unter altem Key scheitern bei der Verifikation und müssen sich neu anmelden.
Der IdP mtime-überwacht beide Dateien, sodass die Rotation heiß ist — kein IIS-Recycle, keine abgebrochenen WebSocket-Sessions, keine kaputten laufenden Anmeldungen. Die kid in jedem JWT-Header pinnt es zur Verifikationszeit an den richtigen Key.
13. Fehlersuche
| Symptom | Wahrscheinliche Ursache |
|---|---|
invalid_client bei /authorize |
Ihre client_id ist nicht für diesen Mandanten registriert, oder Ihre redirect_uri entspricht nicht byte-genau dem registrierten Wert (Case, Trailing-Slash, Query-String). |
invalid_request-Redirect |
Fehlende code_challenge oder code_challenge_method != S256. PKCE ist Pflicht. |
invalid_grant: PKCE verifier invalid |
Der gesendete code_verifier ergibt nicht den vorher gesendeten code_challenge-SHA-256. Meist ein Tippfehler oder versehentlich den Challenge statt des Verifiers gesendet. |
invalid_grant: code invalid or expired |
Auth-Codes sind single-use und leben 60 Sekunden. Nicht cachen; sofort beim Callback tauschen. |
invalid_grant: refresh_token invalid |
Refresh-Tokens sind single-use (Rotation). Sie haben eines vorgelegt, das schon eingelöst war — entweder von Ihnen bei einem früheren Aufruf oder von einem Angreifer, falls es geleakt ist. Re-Login erzwingen. |
401 invalid_token bei /userinfo |
Access-Token abgelaufen (1h) oder der falsche Mandanten-Key hat es signiert. Refresh + retry. |
429 rate_limited bei /login |
Pro-IP-Rate-Limit (10 Fehlversuche pro Minute). Retry-After-Header beachten. |
| State-Mismatch beim Callback | Ihr Frontend hat den gespeicherten state verloren (z. B. Nutzer hat die Auth-URL in einem anderen Tab geöffnet). Flow neu starten. |
14. Schnellreferenz
| Was | Wert |
|---|---|
| Discovery | /.well-known/openid-configuration |
| JWKS | /.well-known/jwks.json |
| Authorize | /oidc.ashx?action=authorize |
| Token | /oidc.ashx?action=token |
| UserInfo | /oidc.ashx?action=userinfo |
| End-Session | /oidc.ashx?action=end_session |
| Signatur-Alg. | RS256 (2048-Bit RSA, pro-Mandant-Key) |
| PKCE | für alle Flows verpflichtend, nur S256 |
| Grant-Typen | authorization_code, refresh_token |
| Access-Token-TTL | 3600s (1h) |
| ID-Token-TTL | 3600s (1h) |
| Refresh-Token-TTL | 14400s (4h), bei jeder Nutzung rotiert |
| Auth-Code-TTL | 60s, single-use |
| Scopes | openid, profile, email, groups, phone, address |
| Revocation-Endpoint | /oidc.ashx?action=revoke |
| amr-Werte | pwd, hwk, mfa, swk, otp |
| acr-Werte | urn:codeb:acr:pwd, urn:codeb:acr:hwk, urn:codeb:acr:hwk-mfa, urn:codeb:acr:mfa |
| Key-Rotation | Überlappungsfenster: private-key.xml → private-key-previous.xml umbenennen; neuer Key wird automatisch erzeugt; beide in JWKS publiziert |
Rollen (im role-Claim) | admin, user, siponly, guest |
Hilfe beim Einbau gefällig? Schreiben Sie an info@codeb.io · Zurück zur OIDC-Übersicht →
Siehe auch · Plattform-Integrations-Anleitungen
- Nextcloud Single Sign-On mit CodeB — user_oidc + Social-Login-Walkthrough mit dem Group-Overwrite-Warnhinweis.
- WordPress Single Sign-On mit CodeB — OpenID-Connect-Generic-Plugin, Claim-Mapping und ein Rollen-Mapping-Snippet für functions.php.