feat: Connexion utilisateur avec sécurité renforcée

Implémente la Story 1.4 du système d'authentification avec plusieurs
couches de protection contre les attaques par force brute.

Sécurité backend :
- Authentification JWT avec access token (15min) + refresh token (7j)
- Rotation automatique des refresh tokens avec détection de replay
- Rate limiting progressif par IP (délai Fibonacci après échecs)
- Intégration Cloudflare Turnstile CAPTCHA après 5 tentatives
- Alerte email à l'utilisateur après blocage temporaire
- Isolation multi-tenant (un utilisateur ne peut se connecter que sur
  son établissement)

Frontend :
- Page de connexion avec feedback visuel des délais et erreurs
- Composant TurnstileCaptcha réutilisable
- Gestion d'état auth avec stockage sécurisé des tokens
- Tests E2E Playwright pour login, tenant isolation, et activation

Infrastructure :
- Configuration Symfony Security avec json_login + jwt
- Cache pools séparés (filesystem en test, Redis en prod)
- NullLoginRateLimiter pour environnement de test (évite blocage CI)
- Génération des clés JWT en CI après démarrage du backend
This commit is contained in:
2026-02-01 10:25:25 +01:00
parent 6889c67a44
commit b9d9f48305
93 changed files with 6850 additions and 155 deletions

View File

@@ -173,10 +173,9 @@ jobs:
docker compose build php
# Start services (includes db, redis, rabbitmq dependencies)
# Use null mailer transport since mailpit is not available in CI
docker compose up -d php
# Use test environment to disable rate limiting for E2E tests
APP_ENV=test MAILER_DSN="null://null" docker compose up -d php
timeout-minutes: 10
env:
MAILER_DSN: "null://null"
- name: Wait for backend to be ready
run: |
@@ -189,10 +188,25 @@ jobs:
done'
echo "Backend is ready!"
- name: Generate JWT keys for authentication
run: |
# Generate JWT keys if they don't exist (required for login/token endpoints)
docker compose exec -T php php bin/console lexik:jwt:generate-keypair --skip-if-exists
- name: Show backend logs on failure
if: failure()
run: docker compose logs php
- name: Configure hosts for multi-tenant testing
run: |
echo "127.0.0.1 classeo.local" | sudo tee -a /etc/hosts
echo "127.0.0.1 ecole-alpha.classeo.local" | sudo tee -a /etc/hosts
echo "127.0.0.1 ecole-beta.classeo.local" | sudo tee -a /etc/hosts
cat /etc/hosts
- name: Reset rate limiter before E2E tests
run: docker compose exec -T php php bin/console app:dev:reset-rate-limit
- name: Run E2E tests
working-directory: frontend
run: pnpm run test:e2e