CodamAIDocs
Themafertig

Die Login-Seiten (Keycloak-Theme)

Welche Seiten das Login-Theme bereitstellt und welcher Ablauf zu welcher Seite führt.

Ausprägungen
AnmeldenAnmelden in zwei SchrittenPasswort vergessenPasswort setzen oder ändernOTPE-Mail bestätigen (Keycloak)Seite abgelaufenFehler und HinweisAbmelden bestätigenRegistrieren (Keycloak)

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

SeiteVorlageWann sie erscheintWohin danach
Anmeldenlogin.ftlbei jeder Anmeldung ohne bestehende Keycloak-SitzungEinmalcode, Pflichtaktion oder zurück zur Oberfläche
Benutzername, dann Passwortlogin-username.ftl, login-password.ftlwenn der Anmeldeablauf im Realm auf „erst Benutzername“ umgestellt istwie „Anmelden“
Passwort vergessenlogin-reset-password.ftlLink „Passwort vergessen?“ auf der AnmeldeseiteKeycloak schickt eine Mail mit Link
Neues Passwortlogin-update-password.ftlPflichtaktion UPDATE_PASSWORD, Link aus der Willkommensmail von CIAS oder aus der Mail „Passwort vergessen“zurück zur Oberfläche
Einmalcode (OTP)login-otp.ftldas Konto hat einen zweiten Faktor eingerichtetPflichtaktion oder zurück
E-Mail bestätigenlogin-verify-email.ftlPflichtaktion VERIFY_EMAIL in Keycloaknach dem Klick in der Mail weiter
Seite abgelaufenlogin-page-expired.ftldie Anmeldeseite stand zu lange offen, oder der Browser ging zurück„Neu starten“ oder „Fortfahren“
Fehlererror.ftlKeycloak kann den Vorgang nicht fortsetzen, etwa bei einem ungültigen Link„Zurück zur Anwendung“, wenn der Client eine Startadresse hat
Hinweisinfo.ftlnach einer abgeschlossenen Aktion, etwa „Konto aktualisiert“Weiter-Link zur Anwendung oder zur nächsten Aktion
Abmelden bestätigenlogout-confirm.ftlbeim Abmelden ohne ID-Tokennach dem Klick abgemeldet
Registrierenregister.ftlnur, wenn die Registrierung im Realm eingeschaltet istKeycloak 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 Realmin cias-runtime ausgeliefertWas auf der Anmeldeseite passiert
resetPasswordAllowedanLink „Passwort vergessen?“ erscheint
registrationAllowedauskein Link „Registrieren“
rememberMeauskein Häkchen „Angemeldet bleiben“
loginWithEmailAllowedanFeld heißt „Benutzername oder E-Mail“
internationalizationEnabledauskeine Sprachauswahl
verifyEmailausKeycloak 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

Was auf den Keycloak-Seiten passiert

Wann: Die Oberfläche leitet von /login zu Keycloak, und es gibt dort noch keine Sitzung.

  1. 1
    Benutzer→Keycloak
    gibt Benutzername oder E-Mail und Passwort ein
  2. 2
    Keycloak
    Stimmen die Angaben?
  3. 3
    Keycloak
    sonst: dieselbe Seite mit Fehlermeldung unter den Feldern
  4. 4
    Keycloak→Browser
    Weiterleitung 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.

  1. 1
    Benutzer→Keycloak
    gibt Benutzername oder E-Mail ein
  2. 2
    Keycloak→Email
    schickt eine Mail mit einem Link zum Zurücksetzen
  3. 3
    Benutzer→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).

  1. Den Ordner theme/codamai in das Theme-Verzeichnis von Keycloak legen (/opt/keycloak/themes/codamai).
  2. Im Realm unter Realm-Einstellungen → Themes → Login-Theme codamai auswählen.

Die Realm-Datei aus cias-runtime legt kein Login-Theme fest. Ohne diese Auswahl zeigt Keycloak seine Standardseiten, der Ablauf ist derselbe.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • hub-login – theme/codamai/login/theme.properties, template.ftl, login.ftl, login-username.ftl, login-password.ftl, login-reset-password.ftl, login-update-password.ftl, login-verify-email.ftl, login-otp.ftl, login-page-expired.ftl, register.ftl, error.ftl, info.ftl, logout-confirm.ftl, messages/messages_de.properties, messages_en.properties, README.md
  • CIAS/cias-runtime – deploy/keycloak/import/codamai-realm.json (registrationAllowed, resetPasswordAllowed, verifyEmail, loginWithEmailAllowed), docker-compose.yml
  • CIAS/cias-iam-keycloak – KeycloakIdentityAdapter (UPDATE_PASSWORD)
  • CIAS/cias-iam-keycloak-provider – ActionLinkResource
  • hub-frontend, CIAS/cias-frontend – app/pages/login.vue
Suchen