feat(auth): harden login flows and finalize quality-check coverage

This commit is contained in:
2026-03-07 22:54:33 +01:00
parent aefe80457c
commit 7153fec05c
20 changed files with 1769 additions and 28 deletions

View File

@@ -0,0 +1,249 @@
{
"task_id": "LOGIN-AUTH-QUALITY-CHECK-001",
"summary": "Ganzheitlicher Quality-Check fuer Auth/Login/Password (lokal + Microsoft SSO) mit Guard- und Best-Practice-Review ueber PHP und Frontend, gezielten Korrekturen bei Verstoessen (inkl. unnoetigem CSS/JS), sowie Ergaenzung und Absicherung durch reproduzierbare Tests und Quality Gates.",
"assumptions": [
"Scope umfasst lokalen Login/Password-Flow und Microsoft-SSO-Start/Callback inklusive tenantabhaengiger Login-Methoden.",
"Umsetzungstiefe ist 'gezielte Fixes', kein breiter Architektur-Refactor.",
"Wenn API-Verhalten nicht geaendert wird, ist keine OpenAPI-Aenderung noetig.",
"Alle neu eingefuehrten sichtbaren Texte werden im selben Merge in de+en gepflegt."
],
"scope": {
"in": [
"pages/auth/login().php, register().php, forgot().php, verify().php, reset().php, verify-email().php",
"pages/auth/login(login).phtml, register(login).phtml, forgot(login).phtml, verify(login).phtml, reset(login).phtml, verify-email(login).phtml",
"pages/auth/microsoft/start().php und pages/auth/microsoft/callback().php",
"pages/api/v1/auth/login().php und pages/api/v1/me/password().php",
"lib/Service/Auth/AuthService.php, RememberMeService.php, PasswordResetService.php, EmailVerificationService.php, MicrosoftOidcService.php, TenantSsoService.php, SsoUserLinkService.php",
"templates/login.phtml und templates/partials/auth-help-links.phtml (plus ggf. auth-bezogene Partials)",
"web/js/app-login-init.js, web/js/components/app-password-toggle.js, web/js/components/app-password-hints.js",
"web/css/pages/app-login.css",
"tests/Service/Auth/*, tests/Http/ApiAuthTest.php, tests/Architecture/AuthLoginAccessibilityContractTest.php, tests/Architecture/AuthHelpLinksContractTest.php",
"i18n/default_de.json und i18n/default_en.json fuer neue Keys"
],
"out": [
"Neues Auth-Feature-Design oder Produktneuentwicklung",
"Breite Refactors ausserhalb Auth/Login/Password/SSO",
"DB-Schema-Migrationen",
"Nicht-authentifizierungsbezogene Admin-Module"
]
},
"guardrails": {
"required_guard_ids": [
"GR-CORE-001",
"GR-CORE-002",
"GR-CORE-003",
"GR-CORE-004",
"GR-CORE-005",
"GR-CORE-006",
"GR-CORE-008",
"GR-CORE-012",
"GR-SEC-001",
"GR-SEC-002",
"GR-SEC-003",
"GR-SEC-004",
"GR-SEC-005",
"GR-UI-009",
"GR-UI-010",
"GR-UI-011",
"GR-UI-012",
"GR-UI-013",
"GR-UI-015",
"GR-TEST-001",
"GR-TEST-002",
"GR-LANG-002"
],
"required_quality_gate_ids": [
"QG-001",
"QG-002",
"QG-003",
"QG-004",
"QG-005",
"QG-006"
]
},
"success_criteria": [
{
"id": "SC-001",
"criterion": "Eine vollstaendige Guard-Matrix fuer den Auth/Login/Password-Scope liegt vor, mit Datei-/Flow-Bezug und priorisierten Findings (kritisch/hoch/mittel)."
},
{
"id": "SC-002",
"criterion": "Alle kritischen und hohen Guard-Verstoesse im Scope sind durch gezielte Code-Anpassungen behoben oder mit begruendeter, nachvollziehbarer Ausnahme dokumentiert."
},
{
"id": "SC-003",
"criterion": "Frontend-Review entfernt oder konsolidiert unnoetige/duplizierte Login-CSS- und Login-JS-Logik, ohne A11y- oder UX-Regression."
},
{
"id": "SC-004",
"criterion": "Serverseitige Sicherheitsinvarianten bleiben fuer alle betroffenen Auth-Endpunkte intakt (AuthZ, Tenant-Scope, CSRF auf POST, keine sensiblen Leaks)."
},
{
"id": "SC-005",
"criterion": "Automatisierte Tests sind erweitert, sodass Login/Password-Edge-Cases und Regressionen (inkl. Reset/Verify sowie SSO-Pfade) reproduzierbar abgedeckt sind."
},
{
"id": "SC-006",
"criterion": "Alle Pflicht-Gates QG-001 bis QG-006 laufen mit PASS und nachvollziehbarer Evidenz."
},
{
"id": "SC-007",
"criterion": "Manuelle End-to-End-Smokes fuer lokale Login- und SSO-Kernfluesse sind erfolgreich, inklusive Browser-Console ohne neue JS-Fehler."
}
],
"implementation_steps": [
{
"id": "S1",
"title": "Guard-Matrix und Baseline erstellen",
"description": "Dokumentiere pro Auth/Login/Password-Flow die relevanten Guards aus Katalog und ordne sie konkreten Dateien/Codepfaden zu; erfasse bestehende Testabdeckung und initiale Gap-Liste.",
"guard_refs": [
"GR-CORE-001",
"GR-TEST-001"
]
},
{
"id": "S2",
"title": "PHP Page/API Boundary-Review durchfuehren",
"description": "Pruefe pages/auth/* und pages/api/v1/auth|me auf requestInput-Vertrag, Superglobal-Vermeidung, CSRF-Reihenfolge, API-Fehlerkonsistenz, PRG-Verhalten und serverseitige Sicherheitspruefungen.",
"guard_refs": [
"GR-CORE-003",
"GR-CORE-004",
"GR-CORE-008",
"GR-CORE-012",
"GR-SEC-001",
"GR-CORE-005",
"GR-CORE-006"
]
},
{
"id": "S3",
"title": "Service-Layer Security- und Testability-Review",
"description": "Pruefe AuthService/RememberMe/PasswordReset/EmailVerification/MicrosoftOIDC/TenantSSO auf Auth- und Tenant-Invarianten, PII-Redaktion, SQL-/Crypto-Nutzung sowie unit-testbare Konstruktion via Dependency Injection.",
"guard_refs": [
"GR-CORE-001",
"GR-SEC-002",
"GR-SEC-003",
"GR-SEC-005",
"GR-TEST-002"
]
},
{
"id": "S4",
"title": "Frontend/UI-UX Quality-Review mit CSS/JS-Cleanup",
"description": "Pruefe Login-Templates, Login-CSS und Login-JS auf A11y-Basics, i18n-Konformitaet, Semantik, UI-State-Vollstaendigkeit sowie JS/CSS-Reuse-first; entferne unnoetige/duplizierte Regeln oder Logik gezielt.",
"guard_refs": [
"GR-UI-009",
"GR-UI-010",
"GR-UI-011",
"GR-UI-012",
"GR-UI-013",
"GR-UI-015",
"GR-SEC-004"
]
},
{
"id": "S5",
"title": "Gezielte Korrekturen umsetzen",
"description": "Setze nur die priorisierten High-Impact-Fixes um (PHP + Frontend), ohne Scope-Ausweitung; bei UI-Textaenderungen i18n-Keys in de/en im selben Schritt nachziehen.",
"guard_refs": [
"GR-TEST-002",
"GR-UI-010",
"GR-UI-015",
"GR-LANG-002"
]
},
{
"id": "S6",
"title": "Testabdeckung gezielt erweitern",
"description": "Ergaenze/erweitere PHPUnit-Tests fuer unterabgedeckte Auth/Login/Password-Pfade (v. a. PasswordResetService, EmailVerificationService, Login/SSO-Edge-Cases) sowie passende Architektur-Contracts fuer Markup-/A11y-Invarianten.",
"guard_refs": [
"GR-TEST-001",
"GR-TEST-002",
"GR-UI-009",
"GR-SEC-001"
]
},
{
"id": "S7",
"title": "Quality Gates und Smokes ausfuehren",
"description": "Fuehre QG-001 bis QG-006 aus, inklusive struktureller rg-Checks und JS-Smoke; dokumentiere pro Gate PASS/FAIL/Blocker mit kurzer Evidenz.",
"guard_refs": [
"GR-LANG-002",
"GR-TEST-001",
"GR-UI-011",
"GR-UI-012"
]
},
{
"id": "S8",
"title": "Acceptance gegen SC-IDs abschliessen",
"description": "Mappe jede Success-Criterion-ID auf konkrete Evidenz (Dateien, Tests, Gate-Resultate, Smoke-Ergebnisse) und markiere verbleibende Restrisiken transparent.",
"guard_refs": [
"GR-TEST-001",
"GR-CORE-005"
]
}
],
"tests": [
"Bestehende Tests: tests/Service/Auth/AuthServiceTest.php und tests/Service/Auth/RememberMeServiceTest.php gezielt erweitern (fehlende Login-/Tenant-/SSO-Edge-Cases).",
"Neue Tests: tests/Service/Auth/PasswordResetServiceTest.php (requestReset, verifyCode, resetPassword inkl. expiry/attempts/used).",
"Neue Tests: tests/Service/Auth/EmailVerificationServiceTest.php (sendVerification, verifyCode, resendVerification inkl. already_verified/attempt limits).",
"Bestehende Architekturtests: tests/Architecture/AuthLoginAccessibilityContractTest.php und tests/Architecture/AuthHelpLinksContractTest.php bei Bedarf erweitern.",
"API-bezogene Regressionen: gezielte Ergaenzung in tests/Http/ApiAuthTest.php oder neuer fokussierter Auth-API-Test fuer Login-/Password-Randfaelle.",
"QG-001: docker compose exec php vendor/bin/phpunit",
"QG-002: docker compose exec php vendor/bin/phpstan analyse -c phpstan.neon --no-progress",
"QG-003: docker compose exec php vendor/bin/phpunit tests/Architecture/CoreStarterkitContractTest.php",
"QG-004: strukturelle rg-Checks gemaess agent-system/checks/quality-gates.json (Erwartung: 0 Verstosse)",
"QG-005: Browser-Smoke fuer Login, Forgot/Verify/Reset, Microsoft Start/Callback; DevTools Console ohne neue Errors",
"QG-006: docker compose exec php composer cs:check"
],
"acceptance_checks": [
"SC-001: Guard-Matrix enthaelt jeden In-Scope-Flow und referenziert konkrete Dateien plus Priorisierung der Findings.",
"SC-002: Kein offener kritischer/hoher Guard-Verstoss im Scope ohne dokumentierte und akzeptierte Ausnahme.",
"SC-003: Login-Frontend hat keine neu eingefuehrte A11y-Regressionsspur und keine unnoetige duplizierte CSS/JS-Logik in den geprueften Bereichen.",
"SC-004: AuthZ-, Tenant- und CSRF-Invarianten sind fuer alle betroffenen POST- und Login-Endpunkte nachweisbar intakt.",
"SC-005: Neue/erweiterte Tests schlagen bei kontrollierter Regelverletzung fehl und laufen im Zielzustand stabil gruen.",
"SC-006: QG-001 bis QG-006 sind mit PASS protokolliert.",
"SC-007: Manueller Smoke bestaetigt erfolgreiche Kernfluesse (lokal + SSO + Logout) ohne neue Browser-Console-Fehler."
],
"ux_notes": {
"affected_patterns": [
"Auth login card/layout (templates/login.phtml + pages/auth/*(login).phtml)",
"Tenant selection pattern (login-tenant-fieldset, login-tenant-choice-grid)",
"Auth help links partial (templates/partials/auth-help-links.phtml)",
"Password hint/toggle behavior (web/js/components/app-password-hints.js, app-password-toggle.js)",
"Login page styling (web/css/pages/app-login.css)"
],
"ui_states_required": [
"loading",
"empty",
"error",
"success"
],
"a11y_touchpoints": [
"Email/password/code inputs inklusive aria-invalid und aria-describedby Verknuepfungen",
"Fehler-Notices als assertive live regions mit fokussierbarer Rueckmeldung",
"Tenant-Radioauswahl und Tastatur-Fokuspfad",
"Microsoft Login CTA und lokale Login-Buttons mit semantischer Bedienbarkeit",
"Password toggle control (button semantics, focus-visible, aria-label updates)"
]
},
"risks": [
{
"risk": "Gezielte CSS-Bereinigung kann visuelle Login-Regressionen erzeugen, obwohl funktional korrekt.",
"mitigation": "Nur additive/minimale CSS-Deltas, visuelle Smokes pro Auth-Stage und QG-005 verpflichtend."
},
{
"risk": "Aenderungen an tenantabhaengiger Login-Methodik koennen lokale oder Microsoft-Login-Pfade unbeabsichtigt blockieren.",
"mitigation": "SSO- und Local-Branches jeweils mit positiven und negativen Tests absichern; End-to-End-Smoke fuer Start/Callback/Login ausfuehren."
},
{
"risk": "Security-Fixes koennen durch Nebenwirkungen API- oder Session-Verhalten brechen.",
"mitigation": "Invarianten zuerst testen (CSRF/AuthZ/Tenant), danach nur kleine isolierte Codeaenderungen mit Ruecktests."
},
{
"risk": "Neue Tests werden flakey wegen Session/Global-State-Kopplung.",
"mitigation": "Konsequent Mocking/DI nutzen, globale Abhaengigkeiten kapseln und deterministische Assertions ohne Zeitrennen definieren."
}
]
}