CodamAIDocs
Themafertig

Registrieren und Bestätigen

Die öffentlichen Seiten „Registrieren“ und „Bestätigen“ und wie sie ihr Formular aus der Feldbeschreibung des Servers bauen.

Ausprägungen
Formular ladenAbsenden: angenommenAbsenden: zu schnell oder zu altAbsenden: abgelehnt, gedrosselt, abgeschaltetFalle ausgefülltschon angemeldetBestätigen: ohne FreigabeBestätigen: mit FreigabeBestätigen: Einstellung unbekanntLink unvollständig oder ungültig

Worum es geht

Wer noch kein Konto hat, kann sich nicht anmelden. Für diese Menschen gibt es im Hub zwei öffentliche Seiten, die ohne Sitzung erreichbar sind:

  • Registrieren unter /register: das Formular für die Selbstregistrierung.
  • Bestätigen unter /registration/verify?token=…: die Seite, auf die der Link in der Mail zeigt.

Den Weg dorthin zeigt die Anmeldeseite des Hubs mit „Noch kein Konto? Registrieren“. Keycloak selbst bietet in der ausgelieferten Konfiguration keine Registrierung an, siehe Die Login-Seiten.

Der Ablauf

sequenceDiagram
    participant B as Browser
    participant F as BFF des Hubs
    participant C as CIAS
    participant M as E-Mail
    B->>F: GET /api/hub/registration/form
    F->>C: GET /cias/registration/flows/SELF_SERVICE/form
    C-->>F: Feldbeschreibung
    F-->>B: Felder + Challenge (signierter Zeitstempel)
    Note over B: Person füllt aus, setzt das Häkchen
    B->>F: POST /api/hub/registration/self
    F->>F: Falle, Challenge, E-Mail prüfen
    F->>C: POST /cias/registration/self
    C->>M: Mail mit Link
    C-->>F: 202 accepted
    F-->>B: „Prüfe dein Postfach“
    B->>F: öffnet /registration/verify?token=…
    F->>C: POST /cias/registration/verify
    C-->>F: 202 accepted
    F-->>B: Bestätigungstext

Beide Seiten sprechen CIAS ohne Token an. Der BFF benutzt dafür einen eigenen Weg, der nur Adressen unter /cias/registration/ erreichen darf. Genau diese Adressen gibt CIAS ohne Anmeldung frei.

Vom Feld zur Eingabe

GET /cias/registration/flows/SELF_SERVICE/form liefert je Feld Schlüssel, Typ, Pflicht, Höchstlänge und erlaubte Werte. Ein Prüfmuster (pattern) liefert CIAS absichtlich nicht mit: Es bleibt eine Regel des Servers.

Anfrage
GET /cias/registration/flows/SELF_SERVICE/form
Antwort
[
  { "key": "email",       "type": "EMAIL",  "required": true,  "maxLength": 255, "allowedValues": [] },
  { "key": "firstName",   "type": "STRING", "required": false, "maxLength": 255, "allowedValues": [] },
  { "key": "lastName",    "type": "STRING", "required": false, "maxLength": 255, "allowedValues": [] },
  { "key": "company",     "type": "STRING", "required": true,  "maxLength": 255, "allowedValues": [] },
  { "key": "application", "type": "ENUM",   "required": false, "maxLength": 255, "allowedValues": ["hub"] }
]

So sieht die Antwort mit der Konfiguration aus hub-backend aus. Die Seite macht daraus:

In der BeschreibungAuf der Seite
type: EMAILE-Mail-Feld mit Browserprüfung
type: ENUMAuswahlliste mit den erlaubten Werten
jeder andere Typeinfaches Textfeld
required: trueSternchen, Absenden erst möglich, wenn ausgefüllt
maxLengthHöchstlänge im Eingabefeld
ENUM, nicht Pflicht, genau ein erlaubter Wertkein Feld: Die Seite setzt den einen Wert selbst ein. So kommt application: hub mit, ohne dass jemand gefragt wird
bekannter Schlüssel (email, firstName, lastName, company, application)übersetzte Beschriftung, bei email und company mit Hinweis darunter
unbekannter Schlüsselder Schlüssel selbst als Beschriftung. Ein neu konfiguriertes Feld erscheint so sofort

Unter den Feldern steht ein Häkchen zur Einwilligung in die Verarbeitung der Angaben. Ohne Häkchen lässt sich das Formular nicht absenden. Leere freiwillige Felder schickt die Seite nicht mit. Als Sprache schickt sie de.

Lässt sich die Feldbeschreibung nicht laden, zeigt die Seite eine Fehlermeldung mit „Erneut versuchen“ statt eines leeren Formulars.

Absenden

Was mit „Registrieren“ passiert
  1. BFF
    Falle
    Ist das unsichtbare Feld website leer?
    ↳ nein Antwort accepted, ohne CIAS zu fragen
  2. BFF
    Challenge
    Hat dieser Server die Challenge signiert?
    ↳ nein Antwort accepted, ohne CIAS zu fragen
  3. BFF
    Wartezeit
    Ist das Formular älter als 2 Sekunden und jünger als 2 Stunden?
    ↳ nein 429 „zu schnell“ oder 400 „zu lange offen“
  4. BFF
    Adresse
    Ist eine E-Mail-Adresse angegeben?
    ↳ nein 400
  5. CIAS
    CIAS
    Felder gültig, Ablauf eingeschaltet, Drosselung nicht erreicht?
    ↳ nein 400, 503, 429 oder 404
  6. 202 accepted, die Seite zeigt „Prüfe dein Postfach“

Drei Begriffe aus dem Bild:

  • Die Falle (englisch honeypot) ist ein Feld, das kein Mensch sieht: außerhalb des sichtbaren Bereichs, nicht per Tab erreichbar, für Screenreader verborgen. Ein Programm, das alle Felder ausfüllt, füllt auch dieses. Der BFF antwortet dann genau wie bei einer echten Registrierung, damit das Programm kein Signal bekommt.
  • Die Challenge ist ein Zeitstempel mit Signatur, den der BFF beim Laden des Formulars ausgibt. Wer direkt an die Adresse schickt, ohne das Formular zu laden, hat keine gültige.
  • Die Drosselung in CIAS zählt Versuche je Adresse und je Client. Den Client bestimmt der BFF selbst: Er setzt X-Forwarded-For auf den Eintrag, den der eigene Proxy geschrieben hat, und reicht keinen Wert des Browsers durch. Siehe Schutz der öffentlichen Endpunkte.

Die Ausprägungen

Was die Seite Registrieren zeigt

Wann: Jemand öffnet /register ohne Sitzung.

Die Seite zeigt „Formular wird geladen …“, holt Feldbeschreibung und Challenge und baut das Formular.

Ergebnis: Formular mit Einleitung: Die Adresse ist zugleich die Anmeldung, das Passwort setzt die Person später über den Link in der Mail.

Wann: CIAS nimmt den Versuch an, egal ob die Adresse neu ist, schon ein Konto hat oder einem weiteren Mandanten beitritt.

Die Seite zeigt immer dasselbe: „Prüfe dein Postfach“ mit der eingegebenen Adresse und dem Hinweis auf den Spam-Ordner. Was wirklich passiert ist, steht nur in der Mail.

Ergebnis: Die Seite verrät nicht, ob es zur Adresse schon ein Konto gibt.

Wann: Weniger als 2 Sekunden oder mehr als 2 Stunden zwischen Laden und Absenden.

„Das ging zu schnell“ bittet um erneutes Absenden. Bei „zu lange offen“ lädt die Seite das Formular samt neuer Challenge neu. Die Eingaben bleiben stehen.

Ergebnis: Ein zweiter Klick geht durch.

Wann: CIAS lehnt ab.

Der Text kommt aus dem Fehlerschlüssel: 400 „Die Angaben wurden abgelehnt“, 429 „Zu viele Versuche in kurzer Zeit“, 503 „Die Registrierung ist auf dieser Installation nicht freigeschaltet“ (der Ablauf ist nicht eingerichtet). Ist die Registrierung in CIAS ganz ausgeschaltet, antwortet CIAS 404, als gäbe es die Adressen nicht.

Ergebnis: Die Eingaben bleiben stehen.

Wann: Das unsichtbare Feld hat einen Wert, oder die Challenge ist nicht von diesem Server.

Der BFF antwortet accepted, ruft CIAS aber nicht auf.

Ergebnis: Die Seite zeigt „Prüfe dein Postfach“, es geht keine Mail raus.

Wann: Jemand mit gültiger Sitzung öffnet /register.

Die Seite leitet sofort zur Startseite des Hubs weiter.

Ergebnis: Kein Formular.

Die Seite Bestätigen

Den Pfad /registration/verify?token=… legt nicht der Hub fest, sondern CIAS: Es baut jeden Link in seinen Mails als {Basisadresse}/registration/verify?token=…. Die Basisadresse ist die Adresse, die ein Mensch im Browser erreicht, beim Hub die des Hub-Frontends. Deshalb landen auch Einladungslinks auf dieser Seite. Siehe E-Mail bestätigen.

Beim Öffnen löst die Seite das Token sofort ein, ohne Knopf. CIAS antwortet in jedem Erfolgsfall gleich mit 202, auch bei einem Link, der schon benutzt wurde. Welchen Satz die Seite danach zeigt, kann sie deshalb nicht aus der Antwort lesen. Sie fragt stattdessen die Regel der Installation ab: GET /api/hub/registration/policy sagt, ob eine Selbstregistrierung nach der Bestätigung noch freigegeben werden muss.

Einlösen gelungen?Freigabe verlangt?Was die Seite zeigt
janein„Willkommen an Bord“: Konto ist eingerichtet, wie es mit dem Passwort weitergeht, steht in der Willkommensmail
jaja„Adresse bestätigt“: Die Registrierung wird geprüft, eine Nachricht folgt
jaunbekannt„Adresse bestätigt“: Wie es weitergeht, steht in der Nachricht
nein–„Der Link ist nicht mehr gültig“, dazu „Zur Anmeldung“ und „Erneut registrieren“

„Unbekannt“ heißt: Die Regel ließ sich nicht laden. Dann nimmt die Seite den Satz, der in beiden Fällen stimmt. Fehlt das Token ganz in der Adresse, zeigt sie „Der Link ist unvollständig“, ohne CIAS zu fragen. Ein unbekannter und ein abgelaufener Link sind für die Seite dasselbe: CIAS unterscheidet sie absichtlich nicht.

Der Wert für „Freigabe verlangt?“ kommt aus der Konfiguration des Hub-Frontends (CIAS_SELF_SERVICE_APPROVAL, zur Laufzeit NUXT_REGISTRATION_APPROVAL_REQUIRED). Es ist derselbe Schalter, den auch hub-backend für SELF_SERVICE liest. Leer heißt: keine Freigabe.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • hub-frontend – app/pages/register.vue, app/pages/registration/verify.vue, app/pages/login.vue, app/middleware/auth.global.ts (PUBLIC_PATHS), app/composables/useRegistration.ts
  • hub-frontend – server/api/hub/registration/form.get.ts, self.post.ts, verify.post.ts, policy.get.ts, server/utils/ciasPublicFetch.ts, registrationChallenge.ts, clientIp.ts, ciasFetch.ts (recoverCiasFailure)
  • hub-frontend – shared/types/registration.ts (HONEYPOT_FIELD), shared/utils/registration.ts, i18n/locales/de.json (register, verify, registration), nuxt.config.ts (registrationApprovalRequired, registrationTrustedProxyHops)
  • CIAS/cias-registration – RegistrationController (/flows/{flow}/form, /self, /verify), RegistrationRestDtos.FieldSpecResponse, RegistrationLinks (verification), RegistrationEndpointGuard
  • hub-backend – application.yaml (codamai.cias.registration.flows.SELF_SERVICE, base-url)
Suchen