Files
Classeo/backend/config/packages/rate_limiter.yaml
Mathias STRASSER affad287f9 feat: Réinitialisation de mot de passe avec tokens sécurisés
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
2026-02-02 09:45:15 +01:00

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