Initial commit
This commit is contained in:
119
features/authentication/classification-age.feature
Normal file
119
features/authentication/classification-age.feature
Normal file
@@ -0,0 +1,119 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Classification des contenus par âge
|
||||
En tant que plateforme responsable
|
||||
Je veux classifier les contenus par tranche d'âge
|
||||
Afin de protéger les mineurs et respecter les obligations légales
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
|
||||
Scénario: Créateur doit classifier son contenu à la publication
|
||||
Étant donné que je suis un créateur connecté
|
||||
Quand je crée un nouveau contenu audio
|
||||
Alors je dois obligatoirement choisir une classification d'âge parmi:
|
||||
| classification | description |
|
||||
| Tout public | Contenu adapté à tous les âges |
|
||||
| 13+ | Contenu mature léger |
|
||||
| 16+ | Contenu mature |
|
||||
| 18+ | Contenu adulte |
|
||||
|
||||
Scénario: Publication impossible sans classification
|
||||
Étant donné que je crée un contenu audio
|
||||
Quand j'essaie de publier sans sélectionner de classification
|
||||
Alors la publication échoue
|
||||
Et je vois le message "Vous devez sélectionner une classification d'âge"
|
||||
|
||||
Scénario: Utilisateur 13-15 ans voit uniquement du contenu "Tout public"
|
||||
Étant donné que je suis un utilisateur de 14 ans
|
||||
Et qu'il existe des contenus avec les classifications suivantes:
|
||||
| classification | nombre |
|
||||
| Tout public | 20 |
|
||||
| 13+ | 15 |
|
||||
| 16+ | 10 |
|
||||
| 18+ | 5 |
|
||||
Quand je demande des recommandations
|
||||
Alors je vois uniquement les 20 contenus "Tout public"
|
||||
Et les autres contenus ne sont jamais proposés
|
||||
|
||||
Scénario: Utilisateur 16-17 ans voit "Tout public" et "13+"
|
||||
Étant donné que je suis un utilisateur de 17 ans
|
||||
Et qu'il existe des contenus avec les classifications suivantes:
|
||||
| classification | nombre |
|
||||
| Tout public | 20 |
|
||||
| 13+ | 15 |
|
||||
| 16+ | 10 |
|
||||
| 18+ | 5 |
|
||||
Quand je demande des recommandations
|
||||
Alors je vois 35 contenus (Tout public + 13+)
|
||||
Et les contenus 16+ et 18+ ne sont pas proposés
|
||||
|
||||
Scénario: Utilisateur 18+ voit tous les contenus
|
||||
Étant donné que je suis un utilisateur de 25 ans
|
||||
Et qu'il existe des contenus avec toutes les classifications
|
||||
Quand je demande des recommandations
|
||||
Alors je vois tous les contenus sans restriction
|
||||
Et aucun filtre d'âge n'est appliqué
|
||||
|
||||
Scénario: Mode Kids activé automatiquement pour les moins de 13 ans
|
||||
Étant donné que je m'inscris avec une date de naissance "2013-01-21"
|
||||
Alors le mode Kids est activé automatiquement
|
||||
Et je vois uniquement du contenu "Tout public"
|
||||
Et des protections supplémentaires sont appliquées
|
||||
|
||||
Scénario: Modérateur reclassifie un contenu mal catégorisé
|
||||
Étant donné qu'un contenu est publié avec la classification "Tout public"
|
||||
Et que ce contenu contient du langage inapproprié détecté en modération
|
||||
Quand le modérateur reclassifie ce contenu en "16+"
|
||||
Alors la nouvelle classification est appliquée immédiatement
|
||||
Et le contenu n'est plus visible pour les utilisateurs de moins de 16 ans
|
||||
Et le créateur reçoit une notification de reclassification
|
||||
|
||||
Scénario: Strike si classification volontairement incorrecte
|
||||
Étant donné qu'un créateur a publié un contenu "18+" classifié comme "Tout public"
|
||||
Et que ce contenu a été signalé
|
||||
Quand le modérateur confirme la mauvaise classification volontaire
|
||||
Alors le créateur reçoit 1 strike
|
||||
Et le contenu est reclassifié en "18+"
|
||||
Et le créateur reçoit une notification explicative
|
||||
|
||||
Scénario: Créateur peut voir la distribution d'âge de son audience
|
||||
Étant donné que je suis un créateur
|
||||
Et que j'ai publié des contenus avec différentes classifications
|
||||
Quand je consulte mes statistiques
|
||||
Alors je vois la répartition des âges de mes auditeurs:
|
||||
| tranche_age | pourcentage |
|
||||
| 13-15 ans | 15% |
|
||||
| 16-17 ans | 20% |
|
||||
| 18+ ans | 65% |
|
||||
|
||||
Scénario: Recherche filtrée par classification d'âge
|
||||
Étant donné que je suis un utilisateur de 16 ans
|
||||
Quand je recherche des contenus
|
||||
Alors les résultats incluent uniquement:
|
||||
| classification |
|
||||
| Tout public |
|
||||
| 13+ |
|
||||
Et je ne vois pas les contenus 16+ et 18+ dans les résultats
|
||||
|
||||
Scénario: Notification si tentative d'accès à contenu non autorisé
|
||||
Étant donné que je suis un utilisateur de 14 ans
|
||||
Et qu'un contenu "16+" est partagé avec moi via un lien direct
|
||||
Quand j'essaie d'accéder au contenu
|
||||
Alors l'accès est refusé
|
||||
Et je vois le message "Ce contenu est réservé aux utilisateurs de 16 ans et plus"
|
||||
|
||||
Scénario: Validation obligatoire des 3 premiers contenus inclut la classification
|
||||
Étant donné que je suis un nouveau créateur
|
||||
Et que je publie mon premier contenu classifié "18+"
|
||||
Quand le modérateur valide mon contenu
|
||||
Alors il vérifie que la classification "18+" est appropriée
|
||||
Et peut la modifier si nécessaire avant validation
|
||||
|
||||
Scénario: Statistiques de classification dans l'interface créateur
|
||||
Étant donné que je suis un créateur
|
||||
Quand je consulte mes contenus publiés
|
||||
Alors je vois pour chaque contenu:
|
||||
| information | exemple |
|
||||
| Classification actuelle | 13+ |
|
||||
| Nombre de signalements | 2 |
|
||||
| Reclassifications | Aucune / 1× par modérateur |
|
||||
84
features/authentication/connexion.feature
Normal file
84
features/authentication/connexion.feature
Normal file
@@ -0,0 +1,84 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Connexion utilisateur
|
||||
En tant qu'utilisateur existant
|
||||
Je veux me connecter à mon compte
|
||||
Afin d'accéder à mes contenus et paramètres
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
Et qu'un utilisateur existe avec:
|
||||
| email | mot_de_passe |
|
||||
| user@test.fr | Password123 |
|
||||
|
||||
Scénario: Connexion réussie avec identifiants valides
|
||||
Quand je me connecte avec:
|
||||
| email | mot_de_passe |
|
||||
| user@test.fr | Password123 |
|
||||
Alors je suis connecté avec succès
|
||||
Et je reçois un access token valide pour 15 minutes
|
||||
Et je reçois un refresh token valide pour 30 jours
|
||||
|
||||
Scénario: Connexion échouée avec email inexistant
|
||||
Quand je me connecte avec l'email "inexistant@test.fr"
|
||||
Alors la connexion échoue
|
||||
Et je vois le message "Email ou mot de passe incorrect"
|
||||
|
||||
Scénario: Connexion échouée avec mot de passe incorrect
|
||||
Quand je me connecte avec:
|
||||
| email | mot_de_passe |
|
||||
| user@test.fr | MauvaisPass1 |
|
||||
Alors la connexion échoue
|
||||
Et je vois le message "Email ou mot de passe incorrect"
|
||||
|
||||
Scénario: Blocage après 5 tentatives échouées
|
||||
Étant donné que j'ai échoué 4 tentatives de connexion
|
||||
Quand j'échoue une 5ème tentative de connexion
|
||||
Alors mon compte est temporairement bloqué
|
||||
Et je vois le message "Compte bloqué pour 15 minutes après 5 tentatives échouées"
|
||||
Et je reçois un email de notification de blocage
|
||||
|
||||
Scénario: Tentative de connexion pendant le blocage
|
||||
Étant donné que mon compte est bloqué suite à 5 tentatives échouées
|
||||
Et que seulement 5 minutes se sont écoulées
|
||||
Quand j'essaie de me connecter avec les bons identifiants
|
||||
Alors la connexion échoue
|
||||
Et je vois le message "Compte bloqué. Réessayez dans 10 minutes"
|
||||
|
||||
Scénario: Déblocage automatique après 15 minutes
|
||||
Étant donné que mon compte est bloqué suite à 5 tentatives échouées
|
||||
Et que 15 minutes se sont écoulées
|
||||
Quand je me connecte avec les bons identifiants
|
||||
Alors je suis connecté avec succès
|
||||
Et le compteur de tentatives est réinitialisé
|
||||
|
||||
Scénario: Reset du compteur après connexion réussie
|
||||
Étant donné que j'ai échoué 3 tentatives de connexion
|
||||
Quand je me connecte avec les bons identifiants
|
||||
Alors je suis connecté avec succès
|
||||
Et le compteur de tentatives est remis à 0
|
||||
|
||||
Scénario: Reset automatique du compteur après 15 minutes sans blocage
|
||||
Étant donné que j'ai échoué 3 tentatives de connexion
|
||||
Et que 15 minutes se sont écoulées sans nouvelle tentative
|
||||
Quand je consulte mon compteur de tentatives
|
||||
Alors le compteur est réinitialisé à 0
|
||||
|
||||
Scénario: Déblocage via lien "Mot de passe oublié"
|
||||
Étant donné que mon compte est bloqué suite à 5 tentatives échouées
|
||||
Quand j'utilise la fonction "Mot de passe oublié"
|
||||
Et que je réinitialise mon mot de passe
|
||||
Alors le blocage est levé immédiatement
|
||||
Et je peux me connecter avec le nouveau mot de passe
|
||||
|
||||
Scénario: Email de notification lors d'un blocage
|
||||
Étant donné que j'ai échoué 5 tentatives de connexion
|
||||
Alors je reçois un email avec:
|
||||
| sujet | Tentatives de connexion suspectes détectées |
|
||||
| contenu_contient | Votre compte a été temporairement bloqué |
|
||||
| lien_mot_de_passe | présent |
|
||||
|
||||
Scénario: Connexion multi-device simultanée autorisée
|
||||
Étant donné que je suis connecté sur un appareil iOS
|
||||
Quand je me connecte également sur un appareil Android
|
||||
Alors les deux sessions sont actives simultanément
|
||||
Et je peux utiliser l'application sur les deux appareils
|
||||
112
features/authentication/inscription.feature
Normal file
112
features/authentication/inscription.feature
Normal file
@@ -0,0 +1,112 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Inscription utilisateur
|
||||
En tant que nouvel utilisateur
|
||||
Je veux créer un compte avec email et mot de passe
|
||||
Afin d'accéder à l'application RoadWave
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
Et que Zitadel est configuré
|
||||
|
||||
Scénario: Inscription réussie avec données valides
|
||||
Étant donné que l'email "nouveau@example.com" n'existe pas
|
||||
Quand je m'inscris avec les données suivantes:
|
||||
| champ | valeur |
|
||||
| email | nouveau@example.com |
|
||||
| mot_de_passe | Password123 |
|
||||
| pseudo | nouveau_user |
|
||||
| date_naissance | 1995-06-15 |
|
||||
Alors mon compte est créé avec succès
|
||||
Et je reçois un email de vérification
|
||||
Et le lien de vérification expire dans 7 jours
|
||||
Et je suis redirigé vers l'application
|
||||
|
||||
Scénario: Inscription avec email déjà existant
|
||||
Étant donné qu'un utilisateur existe avec l'email "existant@example.com"
|
||||
Quand je m'inscris avec l'email "existant@example.com"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Cet email est déjà utilisé"
|
||||
|
||||
Scénario: Inscription avec mot de passe invalide - trop court
|
||||
Quand je m'inscris avec un mot de passe de moins de 8 caractères "Pass1"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Le mot de passe doit contenir au moins 8 caractères"
|
||||
|
||||
Scénario: Inscription avec mot de passe invalide - sans majuscule
|
||||
Quand je m'inscris avec un mot de passe sans majuscule "password123"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Le mot de passe doit contenir au moins une majuscule"
|
||||
|
||||
Scénario: Inscription avec mot de passe invalide - sans chiffre
|
||||
Quand je m'inscris avec un mot de passe sans chiffre "Password"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Le mot de passe doit contenir au moins un chiffre"
|
||||
|
||||
Scénario: Inscription avec pseudo invalide - trop court
|
||||
Quand je m'inscris avec un pseudo de 2 caractères "ab"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Le pseudo doit contenir entre 3 et 30 caractères"
|
||||
|
||||
Scénario: Inscription avec pseudo invalide - caractères spéciaux
|
||||
Quand je m'inscris avec un pseudo contenant des caractères spéciaux "user@123"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Le pseudo ne peut contenir que des lettres, chiffres et underscores"
|
||||
|
||||
Scénario: Inscription avec email invalide
|
||||
Quand je m'inscris avec un email invalide "email.invalide"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Format d'email invalide"
|
||||
|
||||
Plan du Scénario: Inscription avec âge minimum non respecté
|
||||
Étant donné la date du jour est "2026-01-21"
|
||||
Quand je m'inscris avec une date de naissance "<date_naissance>"
|
||||
Alors l'inscription échoue
|
||||
Et je vois le message "Vous devez avoir au moins 13 ans pour créer un compte"
|
||||
|
||||
Exemples:
|
||||
| date_naissance | age |
|
||||
| 2013-01-22 | 12 |
|
||||
| 2015-06-15 | 10 |
|
||||
| 2020-01-01 | 6 |
|
||||
|
||||
Scénario: Inscription avec âge limite acceptable (13 ans)
|
||||
Étant donné la date du jour est "2026-01-21"
|
||||
Quand je m'inscris avec une date de naissance "2013-01-21"
|
||||
Alors mon compte est créé avec succès
|
||||
Et le mode Kids est activé automatiquement
|
||||
|
||||
Scénario: Inscription avec âge supérieur à 18 ans
|
||||
Étant donné la date du jour est "2026-01-21"
|
||||
Quand je m'inscris avec une date de naissance "1990-06-15"
|
||||
Alors mon compte est créé avec succès
|
||||
Et j'ai accès à tous les contenus sans restriction d'âge
|
||||
|
||||
Scénario: Données minimales requises à l'inscription
|
||||
Quand je m'inscris sans fournir de nom complet
|
||||
Et sans fournir de photo de profil
|
||||
Et sans fournir de bio
|
||||
Alors mon compte est créé avec succès
|
||||
Et un avatar par défaut est généré
|
||||
Et les champs optionnels sont vides
|
||||
|
||||
Scénario: Renvoyer l'email de vérification
|
||||
Étant donné que je me suis inscrit avec l'email "nouveau@example.com"
|
||||
Et que je n'ai pas vérifié mon email
|
||||
Quand je demande à renvoyer l'email de vérification
|
||||
Alors un nouvel email de vérification est envoyé
|
||||
Et le précédent lien est invalidé
|
||||
|
||||
Scénario: Limite de renvoi d'email de vérification
|
||||
Étant donné que je me suis inscrit avec l'email "nouveau@example.com"
|
||||
Et que j'ai déjà renvoyé l'email de vérification 3 fois aujourd'hui
|
||||
Quand je demande à renvoyer l'email de vérification une 4ème fois
|
||||
Alors la demande échoue
|
||||
Et je vois le message "Vous avez atteint la limite de 3 renvois par jour"
|
||||
|
||||
Scénario: Expiration du lien de vérification
|
||||
Étant donné que je me suis inscrit il y a 8 jours
|
||||
Et que je n'ai pas vérifié mon email
|
||||
Quand j'essaie d'utiliser le lien de vérification
|
||||
Alors la vérification échoue
|
||||
Et je vois le message "Ce lien a expiré"
|
||||
Et je peux demander un nouveau lien
|
||||
107
features/authentication/recuperation-compte.feature
Normal file
107
features/authentication/recuperation-compte.feature
Normal file
@@ -0,0 +1,107 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Récupération de compte
|
||||
En tant qu'utilisateur ayant oublié son mot de passe
|
||||
Je veux pouvoir réinitialiser mon mot de passe via email
|
||||
Afin de récupérer l'accès à mon compte
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
Et qu'un utilisateur existe avec l'email "user@test.fr"
|
||||
|
||||
Scénario: Demander la réinitialisation du mot de passe
|
||||
Quand je clique sur "Mot de passe oublié"
|
||||
Et que je saisis mon email "user@test.fr"
|
||||
Alors je reçois un email avec un lien de réinitialisation
|
||||
Et le lien expire dans 1 heure
|
||||
Et je vois le message "Email de réinitialisation envoyé"
|
||||
|
||||
Scénario: Email inexistant lors de la demande de réinitialisation
|
||||
Quand je demande une réinitialisation pour l'email "inexistant@test.fr"
|
||||
Alors je vois le même message "Email de réinitialisation envoyé"
|
||||
Mais aucun email n'est envoyé (sécurité - pas d'énumération d'emails)
|
||||
|
||||
Scénario: Réinitialiser le mot de passe avec un lien valide
|
||||
Étant donné que j'ai demandé une réinitialisation de mot de passe
|
||||
Et que j'ai reçu le lien de réinitialisation
|
||||
Quand je clique sur le lien
|
||||
Et que je saisis un nouveau mot de passe "NouveauPass123"
|
||||
Et que je confirme le nouveau mot de passe "NouveauPass123"
|
||||
Alors mon mot de passe est modifié avec succès
|
||||
Et je suis déconnecté de tous mes appareils sauf celui en cours
|
||||
Et je reçois un email de confirmation de changement
|
||||
|
||||
Scénario: Lien de réinitialisation expiré
|
||||
Étant donné que j'ai demandé une réinitialisation il y a 2 heures
|
||||
Quand j'essaie d'utiliser le lien
|
||||
Alors je vois le message "Ce lien a expiré"
|
||||
Et je peux demander un nouveau lien
|
||||
|
||||
Scénario: Nouveau mot de passe ne respecte pas les règles
|
||||
Étant donné que j'ai un lien de réinitialisation valide
|
||||
Quand je saisis un nouveau mot de passe "faible"
|
||||
Alors la réinitialisation échoue
|
||||
Et je vois le message "Le mot de passe doit contenir au moins 8 caractères, 1 majuscule et 1 chiffre"
|
||||
|
||||
Scénario: Confirmation du mot de passe ne correspond pas
|
||||
Étant donné que j'ai un lien de réinitialisation valide
|
||||
Quand je saisis un nouveau mot de passe "NouveauPass123"
|
||||
Et que je confirme avec un mot de passe différent "AutrePass123"
|
||||
Alors la réinitialisation échoue
|
||||
Et je vois le message "Les mots de passe ne correspondent pas"
|
||||
|
||||
Scénario: Limite de demandes de réinitialisation
|
||||
Étant donné que j'ai déjà demandé 3 réinitialisations dans la dernière heure
|
||||
Quand je demande une 4ème réinitialisation
|
||||
Alors la demande échoue
|
||||
Et je vois le message "Maximum 3 demandes par heure. Réessayez plus tard."
|
||||
|
||||
Scénario: Compteur de demandes se réinitialise après 1 heure
|
||||
Étant donné que j'ai demandé 3 réinitialisations
|
||||
Et que 1 heure s'est écoulée
|
||||
Quand je demande une nouvelle réinitialisation
|
||||
Alors la demande réussit
|
||||
Et je reçois un email avec un nouveau lien
|
||||
|
||||
Scénario: Email de notification de changement de mot de passe
|
||||
Étant donné que je viens de réinitialiser mon mot de passe
|
||||
Alors je reçois un email de confirmation avec:
|
||||
| sujet | Votre mot de passe a été modifié |
|
||||
| contenu_contient | Votre mot de passe a été modifié |
|
||||
| date_heure | présente |
|
||||
| appareil | présent |
|
||||
| localisation | présente |
|
||||
| action_urgence | Lien si ce n'était pas vous |
|
||||
|
||||
Scénario: Notification push si changement depuis appareil non reconnu
|
||||
Étant donné que je me suis toujours connecté depuis mon iPhone
|
||||
Et que je réinitialise mon mot de passe depuis un PC Windows
|
||||
Alors je reçois une notification push sur mon iPhone avec:
|
||||
| titre | Mot de passe modifié |
|
||||
| message | Depuis Windows - Paris, France |
|
||||
| action | Sécuriser le compte si ce n'est pas vous |
|
||||
|
||||
Scénario: Déconnexion de tous les appareils après réinitialisation
|
||||
Étant donné que je suis connecté sur 4 appareils différents
|
||||
Et que je réinitialise mon mot de passe depuis un navigateur web
|
||||
Alors les 3 autres appareils sont déconnectés immédiatement
|
||||
Et seule la session du navigateur web reste active
|
||||
Et je vois le message "Vous avez été déconnecté des autres appareils par sécurité"
|
||||
|
||||
Scénario: Lien de réinitialisation invalide si déjà utilisé
|
||||
Étant donné que j'ai réinitialisé mon mot de passe avec un lien
|
||||
Quand j'essaie de réutiliser le même lien
|
||||
Alors je vois le message "Ce lien a déjà été utilisé"
|
||||
Et je peux demander un nouveau lien si nécessaire
|
||||
|
||||
Scénario: Nouveau lien invalide l'ancien
|
||||
Étant donné que j'ai demandé une réinitialisation et reçu un lien
|
||||
Quand je demande une nouvelle réinitialisation
|
||||
Alors l'ancien lien est invalidé
|
||||
Et seul le nouveau lien fonctionne
|
||||
|
||||
Scénario: Réinitialisation débloque un compte bloqué
|
||||
Étant donné que mon compte est bloqué après 5 tentatives de connexion
|
||||
Quand je réinitialise mon mot de passe via email
|
||||
Alors le blocage est levé immédiatement
|
||||
Et je peux me connecter avec le nouveau mot de passe
|
||||
Et le compteur de tentatives est remis à 0
|
||||
114
features/authentication/sessions-tokens.feature
Normal file
114
features/authentication/sessions-tokens.feature
Normal file
@@ -0,0 +1,114 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Gestion des sessions et tokens
|
||||
En tant qu'utilisateur connecté
|
||||
Je veux que mes sessions soient sécurisées et gérées automatiquement
|
||||
Afin de maintenir l'accès à l'application sans friction
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
Et que je suis connecté avec succès
|
||||
|
||||
Scénario: Access token expire après 15 minutes
|
||||
Étant donné que j'ai reçu un access token
|
||||
Et que 15 minutes se sont écoulées
|
||||
Quand je fais une requête API avec cet access token
|
||||
Alors la requête échoue avec le code 401
|
||||
Et je vois le message "Token expiré"
|
||||
|
||||
Scénario: Refresh automatique du token avec refresh token
|
||||
Étant donné que mon access token a expiré
|
||||
Et que mon refresh token est valide
|
||||
Quand l'application demande un nouveau access token
|
||||
Alors je reçois un nouvel access token valide pour 15 minutes
|
||||
Et je reçois un nouveau refresh token (rotation)
|
||||
Et l'ancien refresh token est invalidé
|
||||
|
||||
Scénario: Refresh token expire après 30 jours d'inactivité
|
||||
Étant donné que je me suis connecté il y a 30 jours
|
||||
Et que je n'ai pas utilisé l'application depuis
|
||||
Quand j'essaie d'utiliser mon refresh token
|
||||
Alors la requête échoue
|
||||
Et je dois me reconnecter avec email/password
|
||||
|
||||
Scénario: Prolongation automatique de la session si l'app est utilisée
|
||||
Étant donné que je me suis connecté il y a 25 jours
|
||||
Et que j'utilise l'application régulièrement
|
||||
Quand je fais une requête API
|
||||
Alors ma session est automatiquement prolongée
|
||||
Et mon refresh token reste valide
|
||||
|
||||
Scénario: Détection de token replay attack
|
||||
Étant donné que j'ai rafraîchi mon token
|
||||
Et que j'ai reçu un nouveau refresh token
|
||||
Quand j'essaie de réutiliser l'ancien refresh token
|
||||
Alors la requête échoue
|
||||
Et je vois le message "Token invalide ou révoqué"
|
||||
Et toutes mes sessions sont révoquées par sécurité
|
||||
|
||||
Scénario: Voir la liste des appareils connectés
|
||||
Étant donné que je suis connecté sur 3 appareils différents
|
||||
Quand je consulte la liste de mes appareils connectés
|
||||
Alors je vois 3 appareils avec les informations suivantes:
|
||||
| information | exemple |
|
||||
| OS | iOS 17.1 |
|
||||
| Navigateur | Safari |
|
||||
| Dernière connexion | Il y a 2 heures |
|
||||
| Localisation | Paris, France (IP visible) |
|
||||
|
||||
Scénario: Révoquer un appareil spécifique
|
||||
Étant donné que je suis connecté sur mon iPhone et mon iPad
|
||||
Quand je révoque la session de mon iPad depuis les paramètres
|
||||
Alors la session iPad est immédiatement déconnectée
|
||||
Et ma session iPhone reste active
|
||||
|
||||
Scénario: Déconnecter tous les appareils sauf celui en cours
|
||||
Étant donné que je suis connecté sur 4 appareils
|
||||
Quand je clique sur "Déconnecter tous les appareils"
|
||||
Alors les 3 autres appareils sont déconnectés
|
||||
Et seul l'appareil actuel reste connecté
|
||||
|
||||
Scénario: Alerte de connexion depuis nouveau device
|
||||
Étant donné que je me suis toujours connecté depuis Paris
|
||||
Quand je me connecte depuis un nouvel appareil à Lyon
|
||||
Alors je reçois une notification push sur mes autres appareils
|
||||
Et je reçois un email avec:
|
||||
| sujet | Nouvelle connexion détectée |
|
||||
| localisation | Lyon, France |
|
||||
| appareil | Android 14 - Chrome |
|
||||
| action | Lien pour révoquer la session |
|
||||
|
||||
Scénario: Alerte de connexion suspecte depuis pays différent
|
||||
Étant donné que je me suis toujours connecté depuis la France
|
||||
Quand je me connecte depuis un appareil aux États-Unis
|
||||
Alors je reçois une notification push immédiate
|
||||
Et je reçois un email d'alerte de sécurité
|
||||
Et la nouvelle session nécessite une validation 2FA même si désactivée
|
||||
|
||||
Scénario: Déconnexion après 30 jours d'inactivité totale
|
||||
Étant donné que je ne me suis pas connecté depuis 30 jours
|
||||
Quand j'ouvre l'application
|
||||
Alors je suis automatiquement déconnecté
|
||||
Et je dois me reconnecter avec email/password
|
||||
Et je vois le message "Session expirée après 30 jours d'inactivité"
|
||||
|
||||
Scénario: Sessions multiples simultanées autorisées
|
||||
Étant donné que je suis connecté sur:
|
||||
| appareil |
|
||||
| iPhone |
|
||||
| iPad |
|
||||
| PC Windows (Web) |
|
||||
Quand je fais des actions sur les 3 appareils simultanément
|
||||
Alors toutes les sessions fonctionnent sans conflit
|
||||
Et chaque appareil maintient sa propre session
|
||||
|
||||
Scénario: Validation de JWT via Zitadel
|
||||
Étant donné que j'ai reçu un access token JWT
|
||||
Quand l'API RoadWave valide le token
|
||||
Alors la validation est faite localement avec la clé publique Zitadel
|
||||
Et aucune requête externe n'est effectuée (performance)
|
||||
Et le token contient les claims suivants:
|
||||
| claim | valeur_exemple |
|
||||
| sub | user-id-123 |
|
||||
| email | user@test.fr |
|
||||
| exp | timestamp + 15 minutes |
|
||||
| iss | zitadel.roadwave.com |
|
||||
132
features/authentication/two-factor-authentication.feature
Normal file
132
features/authentication/two-factor-authentication.feature
Normal file
@@ -0,0 +1,132 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Authentification à deux facteurs (2FA)
|
||||
En tant qu'utilisateur soucieux de sécurité
|
||||
Je veux activer la 2FA sur mon compte
|
||||
Afin de protéger mon accès même si mon mot de passe est compromis
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
Et que je suis connecté à mon compte
|
||||
|
||||
Scénario: Activer la 2FA TOTP (Time-based One-Time Password)
|
||||
Étant donné que la 2FA n'est pas activée sur mon compte
|
||||
Quand je choisis d'activer la 2FA TOTP
|
||||
Alors je vois un QR code à scanner
|
||||
Et je vois le secret partagé en texte clair (backup)
|
||||
Et je dois entrer un code de vérification depuis mon app authenticator
|
||||
Quand je saisis un code TOTP valide
|
||||
Alors la 2FA TOTP est activée avec succès
|
||||
Et je reçois des codes de backup (10 codes)
|
||||
|
||||
Scénario: Connexion avec 2FA TOTP activée
|
||||
Étant donné que la 2FA TOTP est activée sur mon compte
|
||||
Quand je me connecte avec email/password
|
||||
Alors je suis redirigé vers la page de saisie du code 2FA
|
||||
Quand je saisis un code TOTP valide de mon authenticator
|
||||
Alors je suis connecté avec succès
|
||||
|
||||
Scénario: Connexion échouée avec code TOTP invalide
|
||||
Étant donné que la 2FA TOTP est activée
|
||||
Quand je me connecte avec email/password
|
||||
Et que je saisis un code TOTP invalide "000000"
|
||||
Alors la connexion échoue
|
||||
Et je vois le message "Code d'authentification invalide"
|
||||
Et je peux réessayer
|
||||
|
||||
Scénario: Utiliser un code de backup pour 2FA
|
||||
Étant donné que la 2FA TOTP est activée
|
||||
Et que j'ai perdu l'accès à mon authenticator
|
||||
Quand je me connecte avec email/password
|
||||
Et que je clique sur "Utiliser un code de backup"
|
||||
Et que je saisis un code de backup valide
|
||||
Alors je suis connecté avec succès
|
||||
Et le code de backup utilisé est invalidé
|
||||
Et il me reste 9 codes de backup
|
||||
|
||||
Scénario: Activer la 2FA par email
|
||||
Étant donné que la 2FA n'est pas activée
|
||||
Quand je choisis d'activer la 2FA par email
|
||||
Alors la 2FA email est activée immédiatement
|
||||
Et je vois le message "2FA email activée. Vous recevrez un code à chaque connexion"
|
||||
|
||||
Scénario: Connexion avec 2FA email
|
||||
Étant donné que la 2FA email est activée
|
||||
Quand je me connecte avec email/password
|
||||
Alors je reçois un email avec un code à 6 chiffres
|
||||
Et le code expire dans 10 minutes
|
||||
Et je dois saisir ce code pour terminer la connexion
|
||||
|
||||
Scénario: Code 2FA email expiré
|
||||
Étant donné que la 2FA email est activée
|
||||
Et que je me suis connecté avec email/password
|
||||
Et que j'ai reçu un code 2FA par email il y a 11 minutes
|
||||
Quand je saisis ce code
|
||||
Alors la connexion échoue
|
||||
Et je vois le message "Code expiré. Demandez un nouveau code."
|
||||
|
||||
Scénario: Renvoyer le code 2FA email
|
||||
Étant donné que la 2FA email est activée
|
||||
Et que je suis sur la page de saisie du code 2FA
|
||||
Quand je clique sur "Renvoyer le code"
|
||||
Alors je reçois un nouveau code par email
|
||||
Et l'ancien code est invalidé
|
||||
|
||||
Scénario: Ajouter un appareil de confiance (skip 2FA pendant 30 jours)
|
||||
Étant donné que la 2FA TOTP est activée
|
||||
Quand je me connecte avec email/password et code TOTP
|
||||
Et que je coche "Ne plus demander sur cet appareil"
|
||||
Alors je suis connecté avec succès
|
||||
Et cet appareil est enregistré comme "appareil de confiance"
|
||||
Quand je me reconnecte dans les 30 jours suivants sur ce même appareil
|
||||
Alors je ne dois pas saisir de code 2FA
|
||||
|
||||
Scénario: Appareil de confiance expire après 30 jours
|
||||
Étant donné que j'ai enregistré un appareil de confiance il y a 31 jours
|
||||
Quand je me connecte depuis cet appareil
|
||||
Alors je dois saisir un code 2FA
|
||||
Et je vois le message "Appareil de confiance expiré. Veuillez vous authentifier"
|
||||
|
||||
Scénario: Voir la liste des appareils de confiance
|
||||
Étant donné que j'ai enregistré 3 appareils de confiance
|
||||
Quand je consulte mes paramètres de sécurité
|
||||
Alors je vois la liste de mes 3 appareils de confiance avec:
|
||||
| information | exemple |
|
||||
| Nom | iPhone 13 - Safari |
|
||||
| Date ajout | 15 janvier 2026 |
|
||||
| Dernière vue | Il y a 2 heures |
|
||||
| Expire le | 14 février 2026 |
|
||||
|
||||
Scénario: Révoquer un appareil de confiance
|
||||
Étant donné que j'ai un iPhone enregistré comme appareil de confiance
|
||||
Quand je révoque cet appareil depuis les paramètres
|
||||
Alors l'appareil est supprimé de la liste
|
||||
Quand je me reconnecte depuis cet iPhone
|
||||
Alors je dois saisir un code 2FA
|
||||
|
||||
Scénario: Révoquer tous les appareils de confiance
|
||||
Étant donné que j'ai 5 appareils de confiance enregistrés
|
||||
Quand je clique sur "Révoquer tous les appareils de confiance"
|
||||
Alors tous les appareils sont révoqués
|
||||
Et je vois le message "Tous les appareils de confiance ont été révoqués"
|
||||
|
||||
Scénario: 2FA forcée pour connexion suspecte malgré appareil de confiance
|
||||
Étant donné que j'ai un appareil de confiance enregistré en France
|
||||
Et que je me connecte depuis ce même appareil mais avec une IP américaine
|
||||
Quand je tente de me connecter
|
||||
Alors la 2FA est requise malgré l'appareil de confiance
|
||||
Et je vois le message "Connexion suspecte détectée. Authentification requise."
|
||||
|
||||
Scénario: Désactiver la 2FA
|
||||
Étant donné que la 2FA TOTP est activée
|
||||
Quand je désactive la 2FA depuis mes paramètres
|
||||
Et que je confirme avec mon mot de passe
|
||||
Alors la 2FA est désactivée
|
||||
Et tous les codes de backup sont invalidés
|
||||
Et tous les appareils de confiance sont révoqués
|
||||
|
||||
Scénario: Régénérer les codes de backup
|
||||
Étant donné que la 2FA est activée
|
||||
Et que j'ai utilisé 8 codes de backup sur 10
|
||||
Quand je demande à régénérer les codes de backup
|
||||
Alors je reçois 10 nouveaux codes
|
||||
Et tous les anciens codes (utilisés ou non) sont invalidés
|
||||
79
features/authentication/verification-email.feature
Normal file
79
features/authentication/verification-email.feature
Normal file
@@ -0,0 +1,79 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Vérification d'email
|
||||
En tant qu'utilisateur inscrit
|
||||
Je veux vérifier mon adresse email
|
||||
Afin d'accéder à toutes les fonctionnalités selon mon rôle
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
|
||||
Scénario: Auditeur avec email non vérifié - lecture illimitée
|
||||
Étant donné que je suis un auditeur avec email non vérifié
|
||||
Quand j'essaie d'écouter du contenu
|
||||
Alors je peux écouter tous les contenus sans limite
|
||||
|
||||
Scénario: Auditeur avec email non vérifié - création limitée à 5 contenus
|
||||
Étant donné que je suis un auditeur avec email non vérifié
|
||||
Et que j'ai créé 4 contenus
|
||||
Quand je crée un 5ème contenu
|
||||
Alors le contenu est créé avec succès
|
||||
Mais quand j'essaie de créer un 6ème contenu
|
||||
Alors la création échoue
|
||||
Et je vois le message "Vérifiez votre email pour créer plus de contenus"
|
||||
|
||||
Scénario: Rappel de vérification après le 3ème contenu créé
|
||||
Étant donné que je suis un auditeur avec email non vérifié
|
||||
Et que j'ai créé 2 contenus
|
||||
Quand je crée mon 3ème contenu
|
||||
Alors le contenu est créé avec succès
|
||||
Et je vois une notification in-app "Vérifiez votre email pour débloquer la création illimitée"
|
||||
|
||||
Scénario: Auditeur vérifie son email
|
||||
Étant donné que je suis un auditeur avec email non vérifié
|
||||
Et que j'ai reçu un lien de vérification
|
||||
Quand je clique sur le lien de vérification dans l'email
|
||||
Alors mon email est marqué comme vérifié
|
||||
Et je vois le message "Email vérifié avec succès"
|
||||
Et toutes les fonctionnalités sont débloquées
|
||||
|
||||
Scénario: Créateur doit vérifier son email sous 7 jours pour monétisation
|
||||
Étant donné que je suis inscrit comme créateur
|
||||
Et que mon email n'est pas vérifié
|
||||
Et que je remplis les conditions de monétisation
|
||||
Quand j'essaie d'accéder au programme de monétisation
|
||||
Alors l'accès est refusé
|
||||
Et je vois le message "Vérifiez votre email pour accéder à la monétisation"
|
||||
|
||||
Scénario: Créateur ne peut pas publier de contenus illimités sans vérification
|
||||
Étant donné que je suis un créateur avec email non vérifié
|
||||
Et que j'ai créé 5 contenus
|
||||
Quand j'essaie de créer un 6ème contenu
|
||||
Alors la création échoue
|
||||
Et je vois le message "Vérifiez votre email pour publier des contenus illimités"
|
||||
|
||||
Scénario: Créateur vérifie son email et déboque tout
|
||||
Étant donné que je suis un créateur avec email non vérifié
|
||||
Et que j'ai reçu un lien de vérification
|
||||
Quand je clique sur le lien de vérification
|
||||
Alors mon email est marqué comme vérifié
|
||||
Et je peux publier des contenus illimités
|
||||
Et je peux accéder au programme de monétisation si j'en remplis les conditions
|
||||
|
||||
Scénario: KYC impossible sans email vérifié
|
||||
Étant donné que je suis un créateur avec email non vérifié
|
||||
Quand j'essaie de compléter le KYC via Mangopay
|
||||
Alors l'accès au KYC est refusé
|
||||
Et je vois le message "Vérifiez votre email avant de procéder au KYC"
|
||||
|
||||
Scénario: Tentative de vérification avec un lien déjà utilisé
|
||||
Étant donné que j'ai déjà vérifié mon email avec un lien
|
||||
Quand j'essaie de réutiliser le même lien de vérification
|
||||
Alors la vérification échoue
|
||||
Et je vois le message "Ce lien a déjà été utilisé"
|
||||
|
||||
Scénario: Auditeur vérifié peut créer plus de 5 contenus
|
||||
Étant donné que je suis un auditeur avec email vérifié
|
||||
Et que j'ai créé 10 contenus
|
||||
Quand je crée un 11ème contenu
|
||||
Alors le contenu est créé avec succès
|
||||
Et il n'y a pas de limite de création
|
||||
Reference in New Issue
Block a user