Worum es geht
Die Oberflächen von CodamAI haben keine eigene Login-Maske. Wer sich anmeldet, landet auf einer Seite von Keycloak. Wie Keycloak dorthin kommt, steht unter Anmelden im Browser. Hier geht es um die Seiten selbst: welche es gibt, wann sie erscheinen und wohin sie führen.
Ein Theme ist die Gestaltung dieser Seiten. Keycloak baut jede Seite aus einer Vorlage im Format FreeMarker (Dateiendung .ftl) und füllt sie mit Texten aus einer Sprachdatei. Das Theme von CodamAI heißt codamai und liegt im Repository hub-login.
Wie eine Seite aussieht
Jede Seite hat zwei Spalten:
- Links das eigentliche Formular: Überschrift, ein kurzer Einleitungssatz, die Felder, Meldungen und Knöpfe.
- Rechts eine Produktfläche mit Hintergrundbild, den CodamAI-Modulen und kurzen Nutzenaussagen.
Alle Texte stehen in messages_de.properties und messages_en.properties, auch die der Produktfläche. Eine Sprachauswahl erscheint oben im Formular, sobald im Realm die Internationalisierung eingeschaltet ist und mehr als eine Sprache angeboten wird.
Das Theme erbt vom Standard-Theme keycloak (parent=keycloak). Seiten, die es nicht selbst gestaltet, etwa Passkeys (WebAuthn), das Einrichten eines Einmalcodes oder „Profil vervollständigen“, kommen deshalb mit dem Standard-Aufbau von Keycloak, eingebettet in den Rahmen von CodamAI.
Die Seitenkarte
flowchart TD
APP["Oberfläche<br/>/login"] --> L["Anmelden<br/>login.ftl"]
L -- "Passwort richtig" --> OTP{"zweiter Faktor<br/>eingerichtet?"}
OTP -- ja --> O["Einmalcode<br/>login-otp.ftl"]
OTP -- nein --> PA{"Pflichtaktion<br/>offen?"}
O --> PA
PA -- "Passwort setzen" --> UP["Neues Passwort<br/>login-update-password.ftl"]
PA -- "E-Mail bestätigen" --> VE["E-Mail bestätigen<br/>login-verify-email.ftl"]
PA -- keine --> BACK["zurück zur Oberfläche<br/>mit Code"]
UP --> BACK
VE --> BACK
L -- "Link „Passwort vergessen“" --> RP["Passwort vergessen<br/>login-reset-password.ftl"]
RP --> MAIL["Mail von Keycloak<br/>mit Link"]
MAIL --> UP
L -. "zu lange offen" .-> EX["Seite abgelaufen<br/>login-page-expired.ftl"]
EX --> L
Lies es so: Die Anmeldung beginnt immer auf der Oberfläche, die auf /login automatisch zu Keycloak weiterleitet. Nach Passwort und gegebenenfalls Einmalcode prüft Keycloak, ob für das Konto noch eine Pflichtaktion offen ist. Eine Pflichtaktion (englisch required action) ist ein Schritt, den Keycloak vor dem ersten Zugang verlangt, etwa „Passwort setzen“. Erst wenn nichts mehr offen ist, schickt Keycloak die Person mit dem Einmalcode zurück zur Oberfläche.
Welche Seite wann kommt
| Seite | Vorlage | Wann sie erscheint | Wohin danach |
|---|---|---|---|
| Anmelden | login.ftl | bei jeder Anmeldung ohne bestehende Keycloak-Sitzung | Einmalcode, Pflichtaktion oder zurück zur Oberfläche |
| Benutzername, dann Passwort | login-username.ftl, login-password.ftl | wenn der Anmeldeablauf im Realm auf „erst Benutzername“ umgestellt ist | wie „Anmelden“ |
| Passwort vergessen | login-reset-password.ftl | Link „Passwort vergessen?“ auf der Anmeldeseite | Keycloak schickt eine Mail mit Link |
| Neues Passwort | login-update-password.ftl | Pflichtaktion UPDATE_PASSWORD, Link aus der Willkommensmail von CIAS oder aus der Mail „Passwort vergessen“ | zurück zur Oberfläche |
| Einmalcode (OTP) | login-otp.ftl | das Konto hat einen zweiten Faktor eingerichtet | Pflichtaktion oder zurück |
| E-Mail bestätigen | login-verify-email.ftl | Pflichtaktion VERIFY_EMAIL in Keycloak | nach dem Klick in der Mail weiter |
| Seite abgelaufen | login-page-expired.ftl | die Anmeldeseite stand zu lange offen, oder der Browser ging zurück | „Neu starten“ oder „Fortfahren“ |
| Fehler | error.ftl | Keycloak kann den Vorgang nicht fortsetzen, etwa bei einem ungültigen Link | „Zurück zur Anwendung“, wenn der Client eine Startadresse hat |
| Hinweis | info.ftl | nach einer abgeschlossenen Aktion, etwa „Konto aktualisiert“ | Weiter-Link zur Anwendung oder zur nächsten Aktion |
| Abmelden bestätigen | logout-confirm.ftl | beim Abmelden ohne ID-Token | nach dem Klick abgemeldet |
| Registrieren | register.ftl | nur, wenn die Registrierung im Realm eingeschaltet ist | Keycloak legt das Konto an |
OTP heißt One-Time Password: ein Code aus einer Authenticator-App, der nur einmal und kurz gilt.
Was die Realm-Einstellungen zeigen oder verstecken
Einige Elemente der Seiten hängen an Schaltern im Realm. Das Theme fragt sie ab und zeigt das Element nur, wenn der Schalter an ist.
| Schalter im Realm | in cias-runtime ausgeliefert | Was auf der Anmeldeseite passiert |
|---|---|---|
| resetPasswordAllowed | an | Link „Passwort vergessen?“ erscheint |
| registrationAllowed | aus | kein Link „Registrieren“ |
| rememberMe | aus | kein Häkchen „Angemeldet bleiben“ |
| loginWithEmailAllowed | an | Feld heißt „Benutzername oder E-Mail“ |
| internationalizationEnabled | aus | keine Sprachauswahl |
| verifyEmail | aus | Keycloak verlangt keine eigene E-Mail-Bestätigung |
Die zweite Spalte zeigt die Realm-Datei, die cias-runtime unter deploy/keycloak/import/ mitbringt. Eine andere Installation kann jeden Schalter anders setzen.
Die Ausprägungen
Wann: Die Oberfläche leitet von /login zu Keycloak, und es gibt dort noch keine Sitzung.
-
1Benutzer→Keycloakgibt Benutzername oder E-Mail und Passwort ein
-
2KeycloakStimmen die Angaben?
-
3Keycloaksonst: dieselbe Seite mit Fehlermeldung unter den Feldern
-
4Keycloak→BrowserWeiterleitung zurück zur Oberfläche mit Code
Ergebnis: Der BFF der Oberfläche tauscht den Code gegen Tokens, siehe Anmelden im Browser.
Wann: Der Anmeldeablauf im Realm fragt zuerst nur den Benutzernamen ab.
Keycloak zeigt erst login-username.ftl, danach login-password.ftl. Auf der zweiten Seite steht der Benutzername oben, dazu ein Link, um mit einem anderen Namen neu zu beginnen. Der Link „Passwort vergessen?“ steht auf der Passwortseite.
Ergebnis: Gleiches Ergebnis wie beim einstufigen Anmelden.
Wann: Jemand klickt auf „Passwort vergessen?“. Der Link erscheint nur, wenn resetPasswordAllowed an ist.
-
1Benutzer→Keycloakgibt Benutzername oder E-Mail ein
-
2Keycloak→Emailschickt eine Mail mit einem Link zum Zurücksetzen
-
3Benutzer→Keycloaköffnet den Link, setzt ein neues Passwort
Ergebnis: Die Mail kommt von Keycloak, mit dessen Vorlagen und dessen Mailserver-Einstellung im Realm, nicht über die Mail-Vorlagen von CIAS.
Wann: Für das Konto ist die Pflichtaktion UPDATE_PASSWORD offen, oder jemand öffnet einen Passwort-Link.
CIAS setzt diese Pflichtaktion, wenn es ein Konto aus einer Registrierung freischaltet, und legt der Willkommensmail möglichst einen direkten Link bei. Die Seite fragt das neue Passwort zweimal ab. Das Häkchen „Von anderen Geräten abmelden“ ist vorausgewählt. Hat eine Anwendung die Aktion selbst angestoßen, gibt es zusätzlich „Abbrechen“.
Ergebnis: Siehe Das Passwort setzen.
Wann: Das Konto hat einen zweiten Faktor, also eine Authenticator-App.
Nach dem Passwort fragt Keycloak den Code aus der App ab. Sind mehrere Apps eingerichtet, wählt die Person zuerst, welche sie benutzt. Das Einrichten eines zweiten Faktors ist eine eigene Seite, die das Theme vom Standard-Theme übernimmt.
Ergebnis: Code richtig → weiter. Code falsch → dieselbe Seite mit Fehlermeldung.
Wann: Keycloak selbst verlangt eine Bestätigung der Adresse (Pflichtaktion VERIFY_EMAIL, oder verifyEmail im Realm).
Die Seite sagt, dass eine Mail an die Adresse ging, und bietet einen Link, um sie erneut zu schicken. Im CIAS-Weg kommt diese Seite nicht vor: CIAS bestätigt die Adresse selbst, mit einem eigenen Link, und markiert sie danach in Keycloak als bestätigt.
Ergebnis: Siehe E-Mail bestätigen für die Bestätigung durch CIAS.
Wann: Die Anmeldeseite stand zu lange offen, oder der Browser hat eine alte Seite erneut abgeschickt.
Zwei Knöpfe: Neu starten beginnt die Anmeldung von vorn, Fortfahren versucht, beim aktuellen Schritt weiterzumachen.
Ergebnis: Kein Fehler im System, nur eine veraltete Seite.
Wann: Keycloak kann nicht weitermachen (Fehler) oder meldet eine abgeschlossene Aktion (Hinweis).
Die Fehlerseite zeigt die Meldung von Keycloak in einem roten Kasten und, wenn der Client eine Startadresse hat, einen Knopf „Zurück zur Anwendung“. Die Hinweisseite zeigt eine Nachricht, gegebenenfalls die Liste der noch offenen Pflichtaktionen, und einen Weiter-Link.
Ergebnis: Typischer Fall: ein Passwort-Link, der schon benutzt wurde oder abgelaufen ist.
Wann: Die Oberfläche beendet die Keycloak-Sitzung, ohne ein ID-Token mitzuschicken.
Keycloak fragt, ob wirklich abgemeldet werden soll. Mit ID-Token entfällt die Frage.
Ergebnis: Siehe Abmelden.
Wann: registrationAllowed ist im Realm eingeschaltet. In der ausgelieferten Realm-Datei ist es aus.
Das Theme bringt eine Seite mit Vorname, Nachname, E-Mail, gegebenenfalls Benutzername und Passwort mit. Konten, die hier entstehen, laufen an CIAS vorbei.
Ergebnis: Neue Konten entstehen bei CodamAI über Registrieren und Bestätigen.
Das Theme in Keycloak einbinden
Das Theme ist statisch: FreeMarker-Vorlagen, Sprachdateien, ein Stylesheet und ein kleines Skript (Passwort anzeigen, Sprachmenü). Das Stylesheet resources/css/styles.css wird mit Tailwind aus src/main.css gebaut (npm run build).
- Den Ordner
theme/codamaiin das Theme-Verzeichnis von Keycloak legen (/opt/keycloak/themes/codamai). - Im Realm unter Realm-Einstellungen → Themes → Login-Theme
codamaiauswählen.
Die Realm-Datei aus cias-runtime legt kein Login-Theme fest. Ohne diese Auswahl zeigt Keycloak seine Standardseiten, der Ablauf ist derselbe.