đ SPĂCIFICATION CANONIQUE CONTRACTUELLE¶
đ Navigation User Story
| Document | | | ---------- | -- | | đ **SpĂ©cification** | *(ce document)* | | đ ïž [Plan d'implĂ©mentation](PD-23-plan.md) | | | â [CritĂšres d'acceptation](PD-23-acceptability.md) | *(Ă venir)* | | đ [Retour d'expĂ©rience](PD-23-rex.md) | *(Ă venir)* | [â Retour Ă auth-identity](../PD-182-epic.md) · [â Index User Story](index.md)PD-23 â Inscription utilisateur Zero-Knowledge (SRP-6a) avec validation email
đ EPIC âĄïž PD-182 â AUTH
đ Artefact produit âĄïž PD-23-spec.md
1. Objectif¶
Définir de maniÚre formelle, exhaustive et testable les exigences relatives à l'inscription d'un nouvel utilisateur via un endpoint exposé par le systÚme, incluant :
- la validation des données d'entrée ;
- la mise en place d'un mécanisme d'authentification zero-knowledge basé sur SRP-6a, sans transmission du mot de passe ;
- la création d'un compte utilisateur dans un état initial maßtrisé (validation email) ;
- la prévention anti-spam et anti-automatisation ;
- la traçabilité minimale conforme RGPD.
Cette spécification constitue une référence contractuelle. Toute implémentation doit s'y conformer strictement.
2. PĂ©rimĂštre / Hors pĂ©rimĂštre¶
2.1 PĂ©rimĂštre¶
La présente spécification couvre exclusivement :
- l'exposition d'un endpoint d'inscription utilisateur
POST /auth/register; - la validation syntaxique et sémantique des champs fournis ;
- la génération et la persistance des artefacts nécessaires à SRP-6a sans réception du mot de passe ;
- la création atomique d'un utilisateur dans le systÚme ;
- la gestion des erreurs liées à l'inscription ;
- la génération d'un lien de validation email à durée de vie limitée ;
- la traçabilité minimale de l'opération d'inscription.
2.2 Hors pĂ©rimĂštre¶
- authentification (login) et émission de session/token ;
- authentification multi-facteur (MFA) ;
- récupération ou réinitialisation de mot de passe ;
- intégration à des fournisseurs d'identité tiers ;
- politiques long-terme de rotation ou gestion des clés utilisateur (hors création) ;
- tout mécanisme impliquant la connaissance serveur du mot de passe.
3. DĂ©finitions¶
| Terme | Définition |
|---|---|
| Utilisateur | Entité représentant une personne disposant d'un compte. |
| Inscription | Processus de création initiale du compte et de préparation de l'authentification. |
| Identifiant utilisateur exprimé sous forme d'adresse électronique. | |
| Mot de passe | Secret choisi par l'utilisateur, jamais transmis au serveur. |
| SRP-6a | Protocole d'authentification permettant de prouver la connaissance d'un secret sans le révéler. |
| Salt SRP | Valeur aléatoire unique par utilisateur utilisée pour dériver le verifier SRP. |
| Verifier SRP | Valeur persistée cÎté serveur permettant l'authentification SRP sans détenir le mot de passe. |
| PII | Données personnelles identifiantes. |
4. Invariants (non nĂ©gociables)¶
- Le mot de passe ne doit jamais ĂȘtre transmis au serveur, mĂȘme sur TLS, sous quelque forme que ce soit.
- Le serveur ne doit jamais ĂȘtre capable de restituer le mot de passe original.
- L'inscription ne doit persister cÎté serveur que les artefacts strictement nécessaires à SRP-6a (salt, verifier, paramÚtres SRP) et des métadonnées de compte.
- Chaque utilisateur est identifié par un email unique.
- Les donnĂ©es reçues doivent ĂȘtre validĂ©es avant tout traitement persistant.
- La création d'un utilisateur est atomique (succÚs complet ou aucun effet).
- Toute tentative d'inscription est traçable via des événements minimisés, sans PII en clair.
- Le comportement du systÚme ne doit pas permettre l'énumération fiable des emails existants.
- à l'issue de l'inscription, le compte est créé en état
PENDING_VALIDATION. L'activation du compte dépend d'un flux de validation email défini dans une spécification dédiée (US Validation email, à créer). Cette spécification définit notamment l'usage d'un jeton à usage unique d'une durée de validité de 1 heure. - Sans validation à expiration, le compte est supprimé automatiquement avec trace minimale de purge.
- Un mécanisme d'anti-automatisation est appliqué à l'inscription utilisateur. Ce mécanisme est défini contractuellement dans une spécification dédiée (US Anti-abus, à créer), incluant notamment :
- des rĂšgles de rate limiting (seuils et fenĂȘtres),
- les conditions d'activation d'un challenge (CAPTCHA ou équivalent),
- les codes de réponse HTTP associés,
- la journalisation et la détection des abus.
- Conformité RGPD : aucune PII en clair dans les logs, purge des comptes non validés et minimisation des traces.
5. Contrat d'API¶
5.1 Endpoint¶
POST /auth/register
5.2 Payload d'entrĂ©e (contractuel)¶
Le payload NE DOIT PAS contenir le mot de passe.
Champs attendus :
email: stringsrp_salt: string (hex/base64)srp_verifier: string (hex/base64)srp_params: identifiant ou objet décrivant les paramÚtres SRPclient_metadata: optionnel, sans PII
Si un champ password (ou Ă©quivalent) est prĂ©sent, la requĂȘte doit ĂȘtre rejetĂ©e.
5.3 RĂ©ponse de succĂšs¶
- HTTP 200
- Body générique :
{ "status": "OK" }
La rĂ©ponse doit ĂȘtre indiscernable quel que soit l'Ă©tat rĂ©el de l'email (anti-Ă©numĂ©ration).
6. Flux nominaux¶
6.1 Inscription nominale¶
- Le client appelle
POST /auth/registeravecemail + artefacts SRP. - Le systÚme valide la conformité des champs.
- Le systÚme crée atomiquement :
- un utilisateur en état
PENDING_VALIDATION; - les artefacts SRP persistés ;
- un jeton de validation Ă usage unique (TTL 1h).
- L'envoi de l'email de validation est déclenché.
- Une réponse générique de succÚs est retournée.
6bis. Diagrammes¶
6bis.1 Diagramme d'Ă©tats du compte utilisateur¶
Ce diagramme modĂ©lise le cycle de vie du compte depuis la requĂȘte d'inscription jusqu'Ă l'activation ou la purge automatique. Les transitions rĂ©fĂ©rencent les invariants correspondants.
stateDiagram-v2
[*] --> PENDING_VALIDATION : POST /auth/register\n[INV-6 : création atomique]
PENDING_VALIDATION --> ACTIVE : Validation email\n(jeton usage unique, TTL 1h)\n[INV-9]
PENDING_VALIDATION --> PURGED : Expiration jeton (>1h)\n[INV-10 : suppression + trace minimale]
PURGED --> [*]
ACTIVE --> [*]
note right of PENDING_VALIDATION
INV-1 : mot de passe jamais transmis
INV-3 : seuls artefacts SRP persistés
INV-8 : anti-énumération
end note
note right of PURGED
INV-12 : conformité RGPD
Aucune PII en clair conservée
end note 6bis.2 Diagramme de sĂ©quence â Inscription nominale¶
Ce diagramme détaille les interactions entre le client, l'API, la base de données et le service d'email lors d'une inscription réussie. Les artefacts SRP sont dérivés cÎté client (INV-1, INV-2) puis persistés cÎté serveur (INV-3) dans une transaction atomique (INV-6).
sequenceDiagram
autonumber
participant C as Client
participant A as API /auth/register
participant DB as PostgreSQL
participant E as Email Service
Note over C: Dérivation locale SRP-6a<br/>[INV-1 : mot de passe jamais transmis]<br/>[INV-2 : serveur ne peut restituer le mdp]
C->>A: POST /auth/register<br/>{email, srp_salt, srp_verifier, srp_params}
A->>A: Validation payload<br/>[INV-5 : validation avant persistance]<br/>Rejet si champ "password" présent [INV-1]
A->>A: Anti-automatisation<br/>[INV-11 : rate limiting / CAPTCHA]
rect rgb(230, 245, 255)
Note over A,DB: Transaction atomique [INV-6]
A->>DB: INSERT utilisateur (status = PENDING_VALIDATION)<br/>[INV-4 : email unique]<br/>[INV-9 : état initial PENDING_VALIDATION]
A->>DB: INSERT artefacts SRP (salt, verifier, params)<br/>[INV-3 : seuls artefacts SRP]
A->>DB: INSERT jeton validation (usage unique, TTL 1h)<br/>[INV-9]
end
A->>E: Envoi email validation (async)<br/>[INV-7 : traçabilité sans PII]
A-->>C: HTTP 200 { "status": "OK" }<br/>[INV-8 : réponse indiscernable]
Note over DB: Si TTL expirĂ© â purge automatique<br/>[INV-10 : suppression + trace minimale]<br/>[INV-12 : conformitĂ© RGPD] 7. Cas d'erreur¶
7.1 Erreurs de validation¶
- email manquant ou invalide ;
- artefacts SRP manquants ou invalides ;
- présence d'un champ interdit (ex.
password) ; - dépassement des seuils de rate limiting.
Les réponses visibles cÎté client doivent rester compatibles avec la politique anti-énumération.
7.2 Erreurs internes¶
- échec de persistance ;
- échec de génération du jeton ;
- échec temporaire d'envoi d'email (retraitable).
8. CritĂšres d'acceptation¶
- Le serveur ne reçoit jamais de mot de passe.
- Aucun hash de mot de passe classique n'est stocké.
- Une inscription valide crée exactement un compte
PENDING_VALIDATION. - Deux inscriptions avec le mĂȘme email retournent une rĂ©ponse indiscernable.
- Les comptes non validés sont automatiquement purgés aprÚs expiration.
- Les journaux ne contiennent aucune PII en clair.
9. ScĂ©narios de test¶
ScĂ©nario 1 â Inscription valide¶
Given un email valide et des artefacts SRP valides When l'endpoint est appelé Then un compte PENDING_VALIDATION est créé
ScĂ©nario 2 â PrĂ©sence d'un mot de passe¶
Given un payload contenant password When l'endpoint est appelĂ© Then la requĂȘte est rejetĂ©e
ScĂ©nario 3 â Email dĂ©jĂ existant¶
Given un utilisateur existant When une nouvelle inscription est tentée Then la réponse est identique à une inscription nominale
ScĂ©nario 4 â Expiration validation¶
Given un compte non validé depuis plus d'1 heure When la tùche planifiée s'exécute Then le compte est supprimé et une trace minimale est conservée
10. HypothĂšses explicites¶
- Le client sait produire les artefacts SRP-6a localement.
- Les échanges réseau sont protégés par TLS.
- Le systĂšme d'envoi d'email peut ĂȘtre asynchrone.
11. Points Ă clarifier¶
- Format exact accepté pour l'email.
- Politique de complexité du mot de passe cÎté client.
- ParamĂštres SRP canoniques (groupes, hash).
- Seuils exacts de rate limiting et CAPTCHA.
- Politique de rétention et purge des traces.
Fin de la spécification canonique.