Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend. **Structure cible:** ``` docs/domains/ ├── README.md (Context Map) ├── _shared/ (Core Domain) ├── recommendation/ (Supporting Subdomain) ├── content/ (Supporting Subdomain) ├── moderation/ (Supporting Subdomain) ├── advertising/ (Generic Subdomain) ├── premium/ (Generic Subdomain) └── monetization/ (Generic Subdomain) ``` **Changements effectués:** Phase 1: Création de l'arborescence des 7 bounded contexts Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/ Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/ Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/ Phase 5: Création des README.md pour chaque domaine Phase 6: Déplacement des features Gherkin vers domains/*/features/ Phase 7: Création du Context Map (domains/README.md) Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh) Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/) **Configuration des tests:** - Makefile: godog run docs/domains/*/features/ - scripts/generate-bdd-docs.py: features_dir → docs/domains **Avantages:** ✅ Cohésion forte: toute la doc d'un domaine au même endroit ✅ Couplage faible: domaines indépendants, dépendances explicites ✅ Navigabilité améliorée: README par domaine = entrée claire ✅ Alignement code/docs: miroir de backend/internal/ ✅ Onboarding facilité: exploration domaine par domaine ✅ Tests BDD intégrés: features au plus près des règles métier Voir docs/REFACTOR-DDD.md pour le plan complet.
201 lines
12 KiB
Gherkin
201 lines
12 KiB
Gherkin
# language: fr
|
|
|
|
@api @authentication @2fa @security @mvp
|
|
Fonctionnalité: Appareils de confiance et authentification à deux facteurs
|
|
|
|
En tant qu'utilisateur soucieux de la sécurité
|
|
Je veux gérer mes appareils de confiance et activer l'authentification à deux facteurs
|
|
Afin de protéger mon compte contre les accès non autorisés
|
|
|
|
Contexte:
|
|
Étant donné que le système supporte les méthodes 2FA suivantes:
|
|
| Méthode | Disponibilité | Recommandée |
|
|
| Application TOTP | Oui | Oui |
|
|
| SMS | Oui | Non |
|
|
| Email | Oui | Non |
|
|
| Clés de sécurité USB | Phase 2 | Oui |
|
|
|
|
Scénario: Activation de l'authentification à deux facteurs par TOTP
|
|
Étant donné un utilisateur "alice@roadwave.fr" sans 2FA activé
|
|
Quand l'utilisateur accède à "Mon compte > Sécurité > Authentification à deux facteurs"
|
|
Et clique sur "Activer l'authentification à deux facteurs"
|
|
Alors le système génère un QR code avec secret TOTP
|
|
Et affiche le secret en texte clair pour saisie manuelle
|
|
Et affiche les instructions: "Scannez ce QR code avec Google Authenticator, Authy ou Microsoft Authenticator"
|
|
Et l'utilisateur scanne le QR code avec son application TOTP
|
|
Et saisit le code à 6 chiffres généré par l'application
|
|
Alors le 2FA est activé
|
|
Et 10 codes de récupération à usage unique sont générés
|
|
Et les codes de récupération sont affichés avec avertissement: "Conservez ces codes en lieu sûr"
|
|
Et un événement "2FA_ENABLED" est enregistré
|
|
Et un email de confirmation est envoyé
|
|
Et la métrique "auth.2fa.enabled" est incrémentée
|
|
|
|
Scénario: Connexion avec 2FA depuis un nouvel appareil
|
|
Étant donné un utilisateur "bob@roadwave.fr" avec 2FA activé
|
|
Et aucun appareil de confiance enregistré
|
|
Quand l'utilisateur se connecte depuis un iPhone avec email/mot de passe corrects
|
|
Alors une page de vérification 2FA s'affiche
|
|
Et l'utilisateur saisit le code à 6 chiffres de son application TOTP
|
|
Et coche l'option "Faire confiance à cet appareil pour 30 jours"
|
|
Alors la connexion est réussie
|
|
Et l'iPhone est enregistré comme appareil de confiance
|
|
Et un token d'appareil de confiance est stocké localement (durée: 30 jours)
|
|
Et un événement "2FA_SUCCESS_NEW_TRUSTED_DEVICE" est enregistré
|
|
Et un email est envoyé: "Nouvel appareil de confiance ajouté: iPhone"
|
|
Et la métrique "auth.2fa.trusted_device.added" est incrémentée
|
|
|
|
Scénario: Connexion depuis un appareil de confiance existant
|
|
Étant donné un utilisateur "charlie@roadwave.fr" avec 2FA activé
|
|
Et un iPhone enregistré comme appareil de confiance il y a 10 jours
|
|
Quand l'utilisateur se connecte depuis cet iPhone avec email/mot de passe corrects
|
|
Alors la connexion est réussie immédiatement sans demander le code 2FA
|
|
Et un événement "LOGIN_TRUSTED_DEVICE" est enregistré
|
|
Et la date de dernière utilisation de l'appareil de confiance est mise à jour
|
|
Et la métrique "auth.2fa.trusted_device.used" est incrémentée
|
|
|
|
Scénario: Expiration automatique d'un appareil de confiance après 30 jours
|
|
Étant donné un utilisateur "david@roadwave.fr" avec 2FA activé
|
|
Et un iPad enregistré comme appareil de confiance il y a 31 jours
|
|
Quand l'utilisateur se connecte depuis cet iPad avec email/mot de passe corrects
|
|
Alors une page de vérification 2FA s'affiche
|
|
Et l'utilisateur doit saisir le code TOTP
|
|
Et un message s'affiche: "Votre appareil de confiance a expiré après 30 jours. Veuillez vous authentifier à nouveau."
|
|
Et l'ancien token d'appareil de confiance est révoqué
|
|
Et un événement "TRUSTED_DEVICE_EXPIRED" est enregistré
|
|
Et la métrique "auth.2fa.trusted_device.expired" est incrémentée
|
|
|
|
Scénario: Gestion de la liste des appareils de confiance
|
|
Étant donné un utilisateur "eve@roadwave.fr" avec 2FA activé
|
|
Et 3 appareils de confiance enregistrés
|
|
Quand l'utilisateur accède à "Mon compte > Sécurité > Appareils de confiance"
|
|
Alors l'utilisateur voit la liste suivante:
|
|
| Appareil | Ajouté le | Dernière utilisation | Expire le | Actions |
|
|
| iPhone 14 Pro | 2026-01-15 | Il y a 2 heures | 2026-02-14 | [Révoquer] |
|
|
| iPad Air | 2026-01-10 | Il y a 5 jours | 2026-02-09 | [Révoquer] |
|
|
| MacBook Pro | 2026-01-05 | Il y a 10 jours | 2026-02-04 | [Révoquer] |
|
|
Et un bouton "Révoquer tous les appareils de confiance" est disponible
|
|
Et un compteur affiche "3 appareils de confiance actifs"
|
|
|
|
Scénario: Révocation manuelle d'un appareil de confiance
|
|
Étant donné un utilisateur "frank@roadwave.fr" avec 2FA activé
|
|
Et un MacBook Pro enregistré comme appareil de confiance
|
|
Quand l'utilisateur clique sur "Révoquer" pour le MacBook Pro
|
|
Alors l'appareil de confiance est immédiatement révoqué
|
|
Et le token d'appareil de confiance est invalidé
|
|
Et un événement "TRUSTED_DEVICE_REVOKED_MANUAL" est enregistré
|
|
Et un email est envoyé: "Vous avez révoqué l'appareil de confiance: MacBook Pro"
|
|
Et lors de la prochaine connexion, le code 2FA sera demandé
|
|
Et la métrique "auth.2fa.trusted_device.revoked" est incrémentée
|
|
|
|
Scénario: Utilisation d'un code de récupération en cas de perte de l'application TOTP
|
|
Étant donné un utilisateur "grace@roadwave.fr" avec 2FA activé
|
|
Et l'utilisateur a perdu l'accès à son application TOTP
|
|
Et il possède ses codes de récupération
|
|
Quand l'utilisateur se connecte avec email/mot de passe corrects
|
|
Et clique sur "Utiliser un code de récupération"
|
|
Et saisit l'un des 10 codes de récupération
|
|
Alors la connexion est réussie
|
|
Et le code de récupération utilisé est marqué comme consommé
|
|
Et il reste 9 codes de récupération disponibles
|
|
Et un événement "2FA_RECOVERY_CODE_USED" est enregistré
|
|
Et un email d'alerte est envoyé: "Un code de récupération a été utilisé. Il vous reste 9 codes."
|
|
Et l'utilisateur est invité à reconfigurer son 2FA
|
|
Et la métrique "auth.2fa.recovery_code.used" est incrémentée
|
|
|
|
Scénario: Régénération des codes de récupération
|
|
Étant donné un utilisateur "henry@roadwave.fr" avec 2FA activé
|
|
Et 3 codes de récupération ont été utilisés
|
|
Quand l'utilisateur accède à "Mon compte > Sécurité > Codes de récupération"
|
|
Et clique sur "Régénérer les codes de récupération"
|
|
Alors un message d'avertissement s'affiche: "Les anciens codes seront invalidés. Êtes-vous sûr ?"
|
|
Et après confirmation, 10 nouveaux codes de récupération sont générés
|
|
Et les anciens codes sont invalidés immédiatement
|
|
Et les nouveaux codes sont affichés une seule fois
|
|
Et un événement "2FA_RECOVERY_CODES_REGENERATED" est enregistré
|
|
Et un email est envoyé avec les nouveaux codes (chiffrés)
|
|
Et la métrique "auth.2fa.recovery_codes.regenerated" est incrémentée
|
|
|
|
Scénario: Désactivation du 2FA avec vérification renforcée
|
|
Étant donné un utilisateur "iris@roadwave.fr" avec 2FA activé
|
|
Quand l'utilisateur accède à "Mon compte > Sécurité > Authentification à deux facteurs"
|
|
Et clique sur "Désactiver l'authentification à deux facteurs"
|
|
Alors un message d'avertissement s'affiche: "Cela réduira la sécurité de votre compte"
|
|
Et l'utilisateur doit saisir son mot de passe actuel
|
|
Et l'utilisateur doit saisir un code 2FA valide
|
|
Et l'utilisateur doit confirmer par email via un lien sécurisé
|
|
Alors le 2FA est désactivé
|
|
Et tous les appareils de confiance sont révoqués
|
|
Et tous les codes de récupération sont invalidés
|
|
Et un événement "2FA_DISABLED" est enregistré
|
|
Et un email de confirmation est envoyé
|
|
Et la métrique "auth.2fa.disabled" est incrémentée
|
|
|
|
Scénario: Authentification 2FA par SMS en méthode de secours
|
|
Étant donné un utilisateur "jack@roadwave.fr" avec 2FA par TOTP activé
|
|
Et l'utilisateur a également configuré un numéro de téléphone de secours
|
|
Quand l'utilisateur se connecte et clique sur "Recevoir un code par SMS"
|
|
Alors un code à 6 chiffres est envoyé au numéro +33612345678
|
|
Et l'utilisateur saisit le code reçu par SMS
|
|
Alors la connexion est réussie
|
|
Et un événement "2FA_SMS_FALLBACK_USED" est enregistré
|
|
Et un email d'alerte est envoyé: "Vous avez utilisé la méthode SMS de secours"
|
|
Et la métrique "auth.2fa.sms.used" est incrémentée
|
|
|
|
Scénario: Limitation des tentatives de codes 2FA
|
|
Étant donné un utilisateur "kate@roadwave.fr" avec 2FA activé
|
|
Quand l'utilisateur se connecte avec email/mot de passe corrects
|
|
Et saisit 5 codes 2FA incorrects consécutivement
|
|
Alors le compte est temporairement bloqué pour 15 minutes
|
|
Et un message s'affiche: "Trop de tentatives échouées. Veuillez réessayer dans 15 minutes."
|
|
Et un email d'alerte est envoyé: "Multiples tentatives échouées de codes 2FA détectées"
|
|
Et un événement "2FA_TOO_MANY_ATTEMPTS" est enregistré avec niveau "HIGH"
|
|
Et la métrique "auth.2fa.blocked.too_many_attempts" est incrémentée
|
|
|
|
Scénario: Détection de connexion suspecte malgré 2FA valide
|
|
Étant donné un utilisateur "luke@roadwave.fr" avec 2FA activé
|
|
Et toutes ses connexions habituelles sont depuis la France
|
|
Quand l'utilisateur se connecte avec email/mot de passe corrects depuis la Russie
|
|
Et saisit un code 2FA valide
|
|
Alors la connexion est réussie mais marquée comme suspecte
|
|
Et l'utilisateur reçoit immédiatement un email: "Connexion inhabituelle depuis Russie"
|
|
Et une notification push est envoyée sur tous les appareils de confiance
|
|
Et l'accès aux fonctionnalités sensibles (paiement, changement de mot de passe) est temporairement bloqué
|
|
Et l'utilisateur doit confirmer son identité par email avant accès complet
|
|
Et un événement "2FA_SUSPICIOUS_LOCATION" est enregistré avec niveau "HIGH"
|
|
Et la métrique "auth.2fa.suspicious_login" est incrémentée
|
|
|
|
Scénario: Révocation de tous les appareils de confiance en cas de compromission
|
|
Étant donné un utilisateur "mary@roadwave.fr" avec 2FA activé
|
|
Et 5 appareils de confiance enregistrés
|
|
Et l'utilisateur suspecte une compromission de son compte
|
|
Quand l'utilisateur clique sur "Révoquer tous les appareils de confiance"
|
|
Alors tous les appareils de confiance sont immédiatement révoqués
|
|
Et tous les tokens d'appareils de confiance sont invalidés
|
|
Et toutes les sessions actives sont fermées (sauf la session actuelle)
|
|
Et un événement "ALL_TRUSTED_DEVICES_REVOKED" est enregistré avec niveau "HIGH"
|
|
Et un email de confirmation est envoyé
|
|
Et l'utilisateur devra saisir un code 2FA à chaque nouvelle connexion
|
|
Et la métrique "auth.2fa.trusted_device.bulk_revoked" est incrémentée
|
|
|
|
Scénario: Métriques de sécurité pour le 2FA
|
|
Étant donné que le système gère 50 000 utilisateurs avec 2FA activé
|
|
Quand les métriques de sécurité sont collectées
|
|
Alors les indicateurs suivants sont disponibles:
|
|
| Métrique | Valeur cible |
|
|
| Pourcentage d'utilisateurs avec 2FA | > 60% |
|
|
| Taux de succès de validation 2FA | > 98% |
|
|
| Temps moyen de saisie du code 2FA | < 15s |
|
|
| Nombre d'appareils de confiance par user | Moyenne: 2.5 |
|
|
| Taux d'utilisation des codes de récup. | < 0.5% |
|
|
Et les métriques sont exportées vers le système de monitoring
|
|
Et des alertes sont déclenchées si le taux de succès < 95%
|
|
|
|
Scénario: Badge de sécurité pour utilisateurs avec 2FA activé
|
|
Étant donné un utilisateur "nathan@roadwave.fr" avec 2FA activé depuis 30 jours
|
|
Quand l'utilisateur consulte son profil public
|
|
Alors un badge "Compte sécurisé" s'affiche sur son profil
|
|
Et le badge indique: "Cet utilisateur a activé l'authentification à deux facteurs"
|
|
Et le badge améliore la visibilité et la crédibilité du créateur de contenu
|
|
Et la métrique "profile.badge.2fa_secured" est visible
|