Worum es geht
Die Oberflächen von CodamAI (der Hub, das CIAS-Portal, das CDMS-Portal) haben keine eigene Login-Maske. Wer sich anmeldet, landet auf einer Seite von Keycloak, gibt dort Passwort und gegebenenfalls einen Einmalcode ein und kommt danach zurück.
Dazwischen steht der BFF, kurz für Backend for Frontend: der Server-Teil der Oberfläche. Er führt die Anmeldung durch und hebt die Tokens auf. Der Browser bekommt nur ein verschlüsseltes Sitzungs-Cookie.
Das Verfahren heißt Authorization Code Flow. „Code“ ist dabei der Einmalcode, den Keycloak nach dem Login an die Anwendung zurückgibt.
Der Ablauf
sequenceDiagram
participant B as Browser
participant F as BFF (Server der Oberfläche)
participant K as Keycloak
B->>F: öffnet /kunden
F-->>B: nicht angemeldet → /login?redirect=/kunden
B->>F: /login startet die Anmeldung
F-->>B: Weiterleitung zu Keycloak (mit state und PKCE)
B->>K: Login-Seite
K-->>B: Passwort, ggf. Einmalcode
B->>K: Eingaben
K-->>B: Weiterleitung zurück mit Code
B->>F: /api/auth/callback/keycloak?code=…
F->>K: tauscht Code gegen Tokens
K-->>F: Access-, Refresh- und ID-Token
F-->>B: setzt Sitzungs-Cookie, zurück zu /kunden
Drei Begriffe aus dem Bild:
- state ist ein Zufallswert, den der BFF mitschickt und beim Rücksprung wieder erwartet. So erkennt er, dass der Rücksprung zu seiner eigenen Anfrage gehört.
- PKCE („Pixie“) ist ein zweites Geheimnis: Der BFF schickt Keycloak nur einen Hash davon und legt beim Code-Tausch das Original vor. Wer den Code unterwegs abfängt, kann ihn ohne das Original nicht einlösen.
- Die drei Tokens: Das Access-Token ist der Ausweis für jede Anfrage an die APIs. Mit dem Refresh-Token holt der BFF ein neues Access-Token, bevor das alte abläuft. Das ID-Token braucht der BFF später zum Abmelden.
Die Varianten
Wann: Jemand öffnet eine Seite ohne gültige Sitzung.
-
1Browser→BFFöffnet eine geschützte Seite
-
2BFFGibt es eine gültige Sitzung ohne Fehler?
-
3BFF→Browserleitet auf
/loginum. CIAS- und CDMS-Portal hängen den Pfad als?redirect=an, der Hub springt danach immer auf/
Ergebnis: Die Login-Seite übernimmt.
Wann: Die Seite /login wird geöffnet, ohne dass gerade abgemeldet wurde.
-
1BFFIst die Sitzung gültig? Dann sofort weiter zum Ziel
-
2BFF→Keycloakstartet die Anmeldung von selbst, ohne dass jemand klickt
-
3KeycloakBesteht bei Keycloak noch eine Sitzung? Dann ist kein Passwort nötig
-
4Keycloak→BFFschickt den Code zurück
Ergebnis: Wer bei Keycloak noch angemeldet ist, merkt vom Login nichts. Landet der Browser innerhalb von 15 Sekunden ein zweites Mal automatisch auf der Login-Seite, bricht der Hub ab und zeigt einen Knopf „Erneut anmelden“. So entsteht keine Endlosschleife.
Wann: Die Abmeldung leitet auf /login?loggedOut=1.
-
1BFFSteht
loggedOutin der Adresse? Dann kein automatischer Login -
2Benutzer→BFFklickt selbst auf „Anmelden“
Ergebnis: Die Login-Seite bleibt stehen. Ohne diese Bremse würde die Abmeldung sofort wieder anmelden.
Wann: Nach dem Login geht es zur Seite aus ?redirect=.
-
1BFFBeginnt das Ziel mit
/und nicht mit//? -
2BFFsonst: Ziel ist
/ -
3BFF→Browserleitet zum Ziel
Ergebnis: Nur Pfade der eigenen Anwendung sind erlaubt. //andere-seite.de oder https://… werden zu /.
Die Seiten von Keycloak
Was die Person bei Keycloak sieht, liefert das Login-Theme aus hub-login. Ein Theme ist die Gestaltung der Keycloak-Seiten, in Deutsch und Englisch.
| Seite | Wann sie erscheint |
|---|---|
| Benutzername und Passwort | bei jeder Anmeldung ohne bestehende Keycloak-Sitzung |
| Einmalcode (OTP) | wenn für das Konto ein zweiter Faktor eingerichtet ist |
| Passwort vergessen | Link auf der Login-Seite. Keycloak schickt eine Mail zum Zurücksetzen |
| Passwort setzen oder ändern | nach dem Link aus der Willkommensmail oder wenn Keycloak ein neues Passwort verlangt |
| Seite abgelaufen | wenn die Login-Seite zu lange offen stand |
| Abmelden bestätigen | beim Abmelden ohne ID-Token, siehe Abmelden |
OTP heißt One-Time Password: ein Code aus einer Authenticator-App, der nur einmal und kurz gilt.
Was nach dem Login im Browser liegt
Ein verschlüsseltes Sitzungs-Cookie, das kein Skript der Seite lesen kann. Darin liegen die Tokens. Refresh- und ID-Token verlassen den BFF nie. Wie das genau aussieht, steht unter Sitzung im BFF und Cookies.