Implémentation complète du flux de réinitialisation de mot de passe (Story 1.5): Backend: - Aggregate PasswordResetToken avec TTL 1h, UUID v7, usage unique - Endpoint POST /api/password/forgot avec rate limiting (3/h par email, 10/h par IP) - Endpoint POST /api/password/reset avec validation token - Templates email (demande + confirmation) - Repository Redis avec TTL 2h pour distinguer expiré/invalide Frontend: - Page /mot-de-passe-oublie avec message générique (anti-énumération) - Page /reset-password/[token] avec validation temps réel des critères - Gestion erreurs: token invalide, expiré, déjà utilisé Tests: - 14 tests unitaires PasswordResetToken - 7 tests unitaires RequestPasswordResetHandler - 7 tests unitaires ResetPasswordHandler - Tests E2E Playwright pour le flux complet
34 lines
1.1 KiB
YAML
34 lines
1.1 KiB
YAML
# Rate Limiter Configuration
|
|
# Story 1.4 - AC3: Lockout après 5 échecs répétés
|
|
|
|
framework:
|
|
rate_limiter:
|
|
# Limite les tentatives de login par email
|
|
login_attempts:
|
|
policy: fixed_window
|
|
limit: 5
|
|
interval: '15 minutes'
|
|
cache_pool: cache.rate_limiter
|
|
|
|
# Limite les tentatives de login par IP (protection contre brute force distribué)
|
|
login_by_ip:
|
|
policy: sliding_window
|
|
limit: 20
|
|
interval: '15 minutes'
|
|
cache_pool: cache.rate_limiter
|
|
|
|
# Limite les demandes de reset password par email
|
|
# Story 1.5 - AC1: Rate limiting 3 demandes/heure
|
|
password_reset_by_email:
|
|
policy: fixed_window
|
|
limit: 3
|
|
interval: '1 hour'
|
|
cache_pool: cache.rate_limiter
|
|
|
|
# Limite les demandes de reset password par IP (protection contre énumération)
|
|
password_reset_by_ip:
|
|
policy: sliding_window
|
|
limit: 10
|
|
interval: '1 hour'
|
|
cache_pool: cache.rate_limiter
|