Login + Registrierung im Antragsprüfer statt Keycloak-Redirect #129
Labels
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: tobias/gwoe-antragspruefer#129
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Kontext
Aktuell leitet der "Anmelden"-Button zum Keycloak-Login-UI weiter (externes Redirect). "Registrieren" öffnet ein eigenes Modal im Antragsprüfer, das via Keycloak Admin-API den User anlegt. Das ergibt eine inkonsistente UX: Login = extern, Registrierung = intern.
Ziel
Login + Registrierung komplett im Antragsprüfer abwickeln. Kein Redirect zu Keycloak. Beides in einem einzigen Modal mit Tab-Wechsel (Login / Registrieren).
Implementierung
Login via Direct Access Grant
Response:
{ access_token, refresh_token, expires_in, ... }→
access_tokenals Cookie setzen (wie bisher nach Redirect).Keycloak-Konfiguration
Direct Access Grants müssen im Client
gwoe-antragsprueferin Keycloak aktiviert sein:UI
Backend
POST /api/auth/login— nimmt username+password, leitet an Keycloak Token-Endpoint weiter, setzt Cookie, gibt User-Info zurückPOST /api/auth/registerbleibt unverändertGET /api/auth/login-urlkann entfallen (kein Redirect mehr)Sicherheit
Akzeptanzkriterien
Code fertig — Deploy wartet auf Keycloak-Config
Was umgesetzt ist (lokal, nicht deployed):
Backend
POST /api/auth/login— nimmtusername+password, ruft Keycloak Direct Access Grant, setztaccess_tokenals HttpOnly-CookiePOST /api/auth/refresh— liestrt-Cookie, tauscht gegen neuenaccess_tokeninvalid_credentials, andere →unknownaccess_token-Cookie jetztHttpOnly(vorher war esHttpOnly=False— verifiziert dass JS es nicht lesen musste außer für Clear-on-Logout, das funktioniert weiter via path-based delete)Frontend
auth-modalmit Tabs Login/Register/api/auth/login→ Modal schließen, UI refreshTests
tests/test_auth.py+4 Tests fürdirect_login()— alle grün🔴 VORAUSSETZUNG — Keycloak-Konfiguration (vor Deploy!)
Ohne diese Änderung wird ausnahmslos jeder Login-Versuch mit HTTP 400 fehlschlagen:
gwoe(oder wie konfiguriert) auswählengwoe-antragsprueferauswählenKeine Code-Änderung. Einmalige Admin-Aktion.
Deploy-Plan
POST /api/auth/loginmit Test-UserNachlauf-Aufgaben (eigene Folge-Issues wenn relevant)
expires_in/api/auth/refreshaufrufen) — aktuell läuft access_token einfach aus, User muss sich neu anmeldenDeploy-Risiko
Sag Bescheid, wenn Keycloak-Config fertig ist — dann deploy ich.
Live — Keycloak Direct Access Grants bereits aktiv
Unerwarteter Befund: Beim Zugriff via Admin-API zeigt sich
directAccessGrantsEnabled: Truebereits gesetzt auf Clientgwoe-antragspruefer(Realmcollaboration). Entweder User hat das vorher schon aktiviert, oder es war ohnehin default.Deploy-Status: Der #129-Code (Direct-Login-Modal +
POST /api/auth/login+POST /api/auth/refresh) ist bereits live:POST /api/auth/login→ 401 bei falschen Credentials (Route aktiv, Keycloak-Integration antwortet korrekt)POST /api/auth/refresh→ 401 ohne rt-Cookie (erwartet)/classicenthält den Modal-Code:auth-modal,auth-tab-login,auth-tab-register, Hamburger-Button🔑 Anmelden / RegistrierenIst getestet: 394 → 422 lokale Tests passed. Der Login-Flow hat Unit-Coverage (4 neue Tests in
test_auth.py).Noch offen (Follow-up):
/classicmöglich — also klick aufs Hamburger-Menü dort, zurück ins v2). Der Flow ist hässlich.Schließe nach Nachtest durch dich. Wenn alles läuft wie gedacht, Nachschliff in eigenem Issue.
Code + Deploy fertig. Zum Schließen kurz browser-testen:
Wenn alles läuft: Issue closen. Wenn was hakt: Screenshot/Error hier. Gerne morgen.
Login bestätigt durch User. Registration sendet keine Mail bei Anlage — das ist intendiertes Design (User wird mit
enabled=falseangelegt, erst nach Admin-Freischaltung schickt Keycloak die „Passwort-setzen"-Mail). Optional könnte noch eine Bestätigungsmail „Registrierung eingegangen" direkt beim Anlegen geschickt werden — kleines UX-Folge-Issue, kein Blocker.Schließe das Hauptticket.