# language: fr

@api @authentication @security @mvp
Fonctionnalité: Récupération et réinitialisation avancée du mot de passe

  En tant qu'utilisateur ayant oublié son mot de passe
  Je veux pouvoir récupérer l'accès à mon compte de manière sécurisée
  Afin de reprendre l'utilisation de l'application

  Contexte:
    Étant donné que le système de récupération est configuré avec:
      | Paramètre                              | Valeur    |
      | Durée de validité du lien de reset     | 1 heure   |
      | Nombre max de demandes par heure       | 3         |
      | Nombre max de demandes par jour        | 10        |
      | Longueur du token de reset             | 64 chars  |
      | Délai de cooldown entre demandes       | 5 minutes |

  Scénario: Demande de réinitialisation de mot de passe
    Étant donné un utilisateur "alice@roadwave.fr" qui a oublié son mot de passe
    Quand l'utilisateur clique sur "Mot de passe oublié ?" sur l'écran de connexion
    Et saisit son adresse email "alice@roadwave.fr"
    Alors un email de réinitialisation est envoyé avec:
      | Élément                  | Contenu                                           |
      | Sujet                    | Réinitialisation de votre mot de passe RoadWave   |
      | Lien sécurisé            | https://roadwave.fr/reset?token=abc123...         |
      | Durée de validité        | Ce lien expire dans 1 heure                       |
      | Warning sécurité         | Si vous n'êtes pas à l'origine de cette demande...  |
    Et un événement "PASSWORD_RESET_REQUESTED" est enregistré
    Et la métrique "auth.password_reset.requested" est incrémentée
    Et un message s'affiche: "Si cette adresse est enregistrée, vous recevrez un email de réinitialisation"

  Scénario: Protection contre l'énumération d'adresses email
    Étant donné une adresse email "inexistant@roadwave.fr" non enregistrée
    Quand un utilisateur demande la réinitialisation pour cette adresse
    Alors le même message de confirmation s'affiche: "Si cette adresse est enregistrée, vous recevrez un email"
    Et aucun email n'est envoyé
    Et le temps de réponse est identique à une demande valide (800-1200ms)
    Et un événement "PASSWORD_RESET_UNKNOWN_EMAIL" est enregistré
    Et la métrique "auth.password_reset.unknown_email" est incrémentée
    Et les logs n'exposent pas l'information de l'existence ou non de l'email

  Scénario: Limitation du nombre de demandes de réinitialisation
    Étant donné un utilisateur "bob@roadwave.fr"
    Et il a déjà effectué 3 demandes de réinitialisation dans la dernière heure
    Quand l'utilisateur effectue une 4ème demande
    Alors la demande est refusée avec le message: "Trop de demandes de réinitialisation. Veuillez attendre 1 heure."
    Et aucun email n'est envoyé
    Et un événement "PASSWORD_RESET_RATE_LIMITED" est enregistré
    Et la métrique "auth.password_reset.rate_limited" est incrémentée

  Scénario: Utilisation du lien de réinitialisation valide
    Étant donné un utilisateur "charlie@roadwave.fr" ayant demandé la réinitialisation
    Et il a reçu un email avec un token valide il y a 30 minutes
    Quand l'utilisateur clique sur le lien dans l'email
    Alors il est redirigé vers la page de réinitialisation
    Et le formulaire de nouveau mot de passe s'affiche
    Et le token est validé côté serveur
    Et un événement "PASSWORD_RESET_TOKEN_ACCESSED" est enregistré
    Et la session est sécurisée avec CSRF protection

  Scénario: Définition du nouveau mot de passe avec validation
    Étant donné un utilisateur "david@roadwave.fr" sur la page de réinitialisation
    Et il a un token valide
    Quand l'utilisateur saisit un nouveau mot de passe "SecurePass2026!"
    Et confirme le mot de passe
    Alors le mot de passe est validé selon les règles de sécurité
    Et le mot de passe est hashé avec bcrypt (cost: 12)
    Et le mot de passe est enregistré dans la base de données
    Et toutes les sessions actives sont révoquées
    Et tous les tokens d'accès sont invalidés
    Et un événement "PASSWORD_RESET_COMPLETED" est enregistré
    Et un email de confirmation est envoyé: "Votre mot de passe a été modifié avec succès"
    Et la métrique "auth.password_reset.completed" est incrémentée
    Et l'utilisateur est redirigé vers la page de connexion

  Scénario: Tentative d'utilisation d'un token expiré
    Étant donné un utilisateur "eve@roadwave.fr" ayant demandé la réinitialisation
    Et il a reçu un email avec un token valide il y a 2 heures
    Quand l'utilisateur clique sur le lien expiré
    Alors un message d'erreur s'affiche: "Ce lien de réinitialisation a expiré. Veuillez faire une nouvelle demande."
    Et un bouton "Demander un nouveau lien" est affiché
    Et un événement "PASSWORD_RESET_TOKEN_EXPIRED" est enregistré
    Et la métrique "auth.password_reset.token_expired" est incrémentée

  Scénario: Tentative d'utilisation d'un token déjà utilisé
    Étant donné un utilisateur "frank@roadwave.fr" ayant réinitialisé son mot de passe
    Et le token a déjà été utilisé il y a 10 minutes
    Quand l'utilisateur tente de réutiliser le même lien
    Alors un message d'erreur s'affiche: "Ce lien a déjà été utilisé. Si vous avez besoin de réinitialiser à nouveau, faites une nouvelle demande."
    Et un événement "PASSWORD_RESET_TOKEN_REUSED" est enregistré avec niveau "MEDIUM"
    Et un email d'alerte est envoyé: "Tentative de réutilisation d'un ancien lien de réinitialisation"
    Et la métrique "auth.password_reset.token_reused" est incrémentée

  Scénario: Détection de tentative d'attaque par force brute sur les tokens
    Étant donné un attaquant qui tente de deviner des tokens de réinitialisation
    Quand 10 tokens invalides sont testés depuis la même IP en 5 minutes
    Alors l'IP est bloquée temporairement pour 1 heure
    Et tous les tokens valides pour cette IP sont invalidés
    Et un événement "PASSWORD_RESET_BRUTE_FORCE_DETECTED" est enregistré avec niveau "CRITICAL"
    Et l'équipe de sécurité est alertée via webhook
    Et la métrique "security.password_reset.brute_force" est incrémentée

  Scénario: Réinitialisation avec validation 2FA pour comptes sensibles
    Étant donné un utilisateur "grace@roadwave.fr" avec 2FA activé
    Et il a demandé la réinitialisation de son mot de passe
    Quand l'utilisateur clique sur le lien de réinitialisation
    Alors une étape supplémentaire de vérification 2FA s'affiche
    Et l'utilisateur doit saisir un code TOTP ou un code de récupération
    Et après validation 2FA, le formulaire de nouveau mot de passe s'affiche
    Et un événement "PASSWORD_RESET_2FA_VALIDATED" est enregistré
    Et la métrique "auth.password_reset.with_2fa" est incrémentée

  Scénario: Notification de sécurité sur tous les appareils
    Étant donné un utilisateur "henry@roadwave.fr" connecté sur 3 appareils
    Quand l'utilisateur réinitialise son mot de passe
    Alors une notification push est envoyée sur tous les appareils:
      | Message                                              |
      | Votre mot de passe a été modifié                     |
      | Si ce n'est pas vous, contactez immédiatement le support |
    Et un email est envoyé avec détails:
      | Détail              | Valeur                |
      | Date et heure       | 2026-02-03 14:32:18   |
      | Adresse IP          | 1.2.3.4               |
      | Localisation        | Paris, France         |
      | Appareil            | iPhone 14 Pro         |
      | Navigateur          | Safari 17.2           |
    Et un lien "Ce n'était pas moi" permet de bloquer le compte immédiatement

  Scénario: Historique des modifications de mot de passe
    Étant donné un utilisateur "iris@roadwave.fr"
    Quand l'utilisateur accède à "Mon compte > Sécurité > Historique"
    Alors l'utilisateur voit l'historique des modifications:
      | Date               | Action                        | IP        | Appareil     | Localisation  |
      | 2026-02-03 14:32   | Réinitialisation mot de passe | 1.2.3.4   | iPhone 14    | Paris, FR     |
      | 2026-01-15 10:20   | Changement mot de passe       | 5.6.7.8   | MacBook Pro  | Lyon, FR      |
      | 2025-12-01 08:15   | Création du compte            | 9.10.11.12| iPad Air     | Marseille, FR |
    Et les événements sont conservés pendant 90 jours minimum
    Et les logs sont conformes RGPD

  Scénario: Réinitialisation impossible pour compte bloqué ou suspendu
    Étant donné un utilisateur "jack@roadwave.fr" dont le compte est suspendu
    Quand l'utilisateur demande la réinitialisation de son mot de passe
    Alors un message s'affiche: "Votre compte est actuellement suspendu. Veuillez contacter le support."
    Et aucun email de réinitialisation n'est envoyé
    Et un événement "PASSWORD_RESET_ACCOUNT_SUSPENDED" est enregistré
    Et un lien vers le support est fourni
    Et la métrique "auth.password_reset.blocked_account" est incrémentée

  Scénario: Vérification de l'unicité du nouveau mot de passe
    Étant donné un utilisateur "kate@roadwave.fr" sur la page de réinitialisation
    Quand l'utilisateur tente de définir le même mot de passe que l'ancien
    Alors une erreur s'affiche: "Veuillez choisir un mot de passe différent de l'ancien"
    Et le mot de passe n'est pas enregistré
    Et un événement "PASSWORD_RESET_SAME_PASSWORD" est enregistré
    Et la métrique "auth.password_reset.same_password" est incrémentée

  Scénario: Vérification contre les mots de passe compromis
    Étant donné un utilisateur "luke@roadwave.fr" sur la page de réinitialisation
    Quand l'utilisateur tente de définir un mot de passe "Password123!"
    Et ce mot de passe figure dans la base de données Have I Been Pwned
    Alors une erreur s'affiche: "Ce mot de passe est connu et a été compromis. Veuillez en choisir un autre."
    Et le mot de passe n'est pas enregistré
    Et un événement "PASSWORD_RESET_COMPROMISED_PASSWORD" est enregistré
    Et la métrique "auth.password_reset.compromised_blocked" est incrémentée

  Scénario: Cooldown entre demandes successives de réinitialisation
    Étant donné un utilisateur "mary@roadwave.fr"
    Et il a fait une demande de réinitialisation il y a 2 minutes
    Quand l'utilisateur fait une nouvelle demande de réinitialisation
    Alors la demande est refusée avec le message: "Veuillez attendre 5 minutes entre chaque demande"
    Et un compteur affiche "Vous pourrez faire une nouvelle demande dans 3 minutes"
    Et un événement "PASSWORD_RESET_COOLDOWN" est enregistré
    Et la métrique "auth.password_reset.cooldown_hit" est incrémentée

  Scénario: Métriques de sécurité pour la réinitialisation de mot de passe
    Étant donné que le système traite 1000 demandes de réinitialisation par jour
    Quand les métriques de sécurité sont collectées
    Alors les indicateurs suivants sont disponibles:
      | Métrique                                      | Valeur cible |
      | Taux de complétion des réinitialisations      | > 75%        |
      | Taux de tokens expirés avant utilisation      | < 20%        |
      | Temps moyen de complétion                     | < 5 min      |
      | Taux de détection de mots de passe compromis  | > 5%         |
      | Nombre de tentatives de brute force bloquées  | Visible      |
    Et les métriques sont exportées vers le système de monitoring
    Et des alertes sont déclenchées si anomalies détectées
