BFF-Routen: Account-REST-API durch AIA-Redirects ersetzen #164

Closed
opened 2026-07-01 17:13:07 +00:00 by niboer · 1 comment
Owner

Background

Sae mtliche /api/auth/* BFF-Routen rufen callKeycloakAccountApi() auf, die Keycloaks Account-REST-API v2 unter /realms/{realm}/account/ nutzt. Ab Keycloak 22+ existiert diese API nicht mehr — alle Aufrufe schlagen mit HTTP 404 fehl, wie der Debug-Log gezeigt hat:

POST /realms/familienfeierplaner/account/password -> 404 {"error":"HTTP 404 Not Found"}

Loesung

Application Initiated Actions (AIA): Statt REST-Calls wird der User per OIDC-Redirect mit kc_action zu Keycloak geschickt. Keycloak zeigt das entsprechende Formular, und nach Abschluss wird der User mit kc_action_status=success|cancelled|error zurueck zum Callback geleitet.

Scope

1. frontend/src/routes/api/auth/change-password/+server.ts

POST-Handler erzeugt PKCE-Authorization-URL mit kc_action=UPDATE_PASSWORD und gibt { redirectUrl } zurueck (analog login/+server.ts).

2. frontend/src/routes/api/auth/credentials/totp/+server.ts

GET und POST ersetzen durch AIA CONFIGURE_TOTP (gleiches Redirect-Pattern). POST zum Verifizieren des TOTP-Codes entfaellt (Keycloak uebernimmt das).

3. frontend/src/routes/api/auth/credentials/passkey/register/+server.ts

POST ersetzen durch AIA webauthn-register-passwordless.

4. frontend/src/routes/api/auth/credentials/[id]/+server.ts

  • DELETE via AIA kc_action=delete_credential:{credentialId} (parametrisierte AIA)
  • PUT entfaellt (Umbenennen wird in Keycloak Account Console erledigt)

5. frontend/src/routes/api/auth/credentials/+server.ts

GET entfaellt — Credential-Liste wird nicht mehr per API abgerufen. User verwalten Credentials direkt in der Keycloak Account Console oder ueber die AIA-Aktionen.

6. frontend/src/routes/callback/+server.ts

kc_action_status-Parameter auswerten:

  • success → Redirect zu /app/account?action={type}&status=success
  • cancelled/app/account?action={type}&status=cancelled
  • error/app/account?action={type}&status=error

7. frontend/src/routes/app/account/+page.svelte

  • Formular-Eingabefelder (currentPassword, newPassword, confirmation) entfernen
  • Stattdessen: Einzelner "Passwort aendern"-Button löst AIA-Redirect aus
  • TOTP-Setup-Button analog
  • Passkey-Registrieren-Button analog
  • Erfolgs-, Fehler- und Abbruch-Meldungen via URL-Parametername ?action=password&status=success

8. i18n

Neue Keys in frontend/src/lib/i18n/de/account.json fuer:

  • Passwort-Aenderung abgebrochen
  • TOTP-Einrichtung abgebrochen
  • Passkey-Registrierung abgebrochen

9. callKeycloakAccountApi() entfernen

Nachdem alle Caller migriert sind, callKeycloakAccountApi() aus frontend/src/lib/server/auth.ts entfernen.

Test

Manuell im Browser:

http://localhost:8080/realms/familienfeierplaner/protocol/openid-connect/auth?client_id=frontend-app&redirect_uri=http://localhost:5173/callback&response_type=code&scope=openid&kc_action=UPDATE_PASSWORD

Erwartet: Keycloak zeigt nach SSO-Login den Passwort-aendern-Dialog.

## Background Sae mtliche `/api/auth/*` BFF-Routen rufen `callKeycloakAccountApi()` auf, die Keycloaks Account-REST-API v2 unter `/realms/{realm}/account/` nutzt. Ab Keycloak 22+ existiert diese API nicht mehr — alle Aufrufe schlagen mit HTTP 404 fehl, wie der Debug-Log gezeigt hat: ``` POST /realms/familienfeierplaner/account/password -> 404 {"error":"HTTP 404 Not Found"} ``` ## Loesung Application Initiated Actions (AIA): Statt REST-Calls wird der User per OIDC-Redirect mit `kc_action` zu Keycloak geschickt. Keycloak zeigt das entsprechende Formular, und nach Abschluss wird der User mit `kc_action_status=success|cancelled|error` zurueck zum Callback geleitet. ## Scope ### 1. `frontend/src/routes/api/auth/change-password/+server.ts` POST-Handler erzeugt PKCE-Authorization-URL mit `kc_action=UPDATE_PASSWORD` und gibt `{ redirectUrl }` zurueck (analog `login/+server.ts`). ### 2. `frontend/src/routes/api/auth/credentials/totp/+server.ts` GET und POST ersetzen durch AIA `CONFIGURE_TOTP` (gleiches Redirect-Pattern). POST zum Verifizieren des TOTP-Codes entfaellt (Keycloak uebernimmt das). ### 3. `frontend/src/routes/api/auth/credentials/passkey/register/+server.ts` POST ersetzen durch AIA `webauthn-register-passwordless`. ### 4. `frontend/src/routes/api/auth/credentials/[id]/+server.ts` - DELETE via AIA `kc_action=delete_credential:{credentialId}` (parametrisierte AIA) - PUT entfaellt (Umbenennen wird in Keycloak Account Console erledigt) ### 5. `frontend/src/routes/api/auth/credentials/+server.ts` GET entfaellt — Credential-Liste wird nicht mehr per API abgerufen. User verwalten Credentials direkt in der Keycloak Account Console oder ueber die AIA-Aktionen. ### 6. `frontend/src/routes/callback/+server.ts` `kc_action_status`-Parameter auswerten: - `success` → Redirect zu `/app/account?action={type}&status=success` - `cancelled` → `/app/account?action={type}&status=cancelled` - `error` → `/app/account?action={type}&status=error` ### 7. `frontend/src/routes/app/account/+page.svelte` - Formular-Eingabefelder (currentPassword, newPassword, confirmation) entfernen - Stattdessen: Einzelner "Passwort aendern"-Button löst AIA-Redirect aus - TOTP-Setup-Button analog - Passkey-Registrieren-Button analog - Erfolgs-, Fehler- und Abbruch-Meldungen via URL-Parametername `?action=password&status=success` ### 8. i18n Neue Keys in `frontend/src/lib/i18n/de/account.json` fuer: - Passwort-Aenderung abgebrochen - TOTP-Einrichtung abgebrochen - Passkey-Registrierung abgebrochen ### 9. `callKeycloakAccountApi()` entfernen Nachdem alle Caller migriert sind, `callKeycloakAccountApi()` aus `frontend/src/lib/server/auth.ts` entfernen. ## Test Manuell im Browser: ``` http://localhost:8080/realms/familienfeierplaner/protocol/openid-connect/auth?client_id=frontend-app&redirect_uri=http://localhost:5173/callback&response_type=code&scope=openid&kc_action=UPDATE_PASSWORD ``` Erwartet: Keycloak zeigt nach SSO-Login den Passwort-aendern-Dialog.
Author
Owner

Milestone MS-SECURITY wird geschlossen.

Erledigt in:

  • aad6148 — i18n von Svelte-Stores auf $state-Runes migriert
  • cbaca24 — tokens.css des Account-Themes in .gitignore aufgenommen
Milestone MS-SECURITY wird geschlossen. Erledigt in: - `aad6148` — i18n von Svelte-Stores auf $state-Runes migriert - `cbaca24` — tokens.css des Account-Themes in .gitignore aufgenommen
Sign in to join this conversation.
No description provided.