Aller au contenu

📄 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.
Email 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)

  1. Le mot de passe ne doit jamais ĂȘtre transmis au serveur, mĂȘme sur TLS, sous quelque forme que ce soit.
  2. Le serveur ne doit jamais ĂȘtre capable de restituer le mot de passe original.
  3. 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.
  4. Chaque utilisateur est identifié par un email unique.
  5. Les donnĂ©es reçues doivent ĂȘtre validĂ©es avant tout traitement persistant.
  6. La création d'un utilisateur est atomique (succÚs complet ou aucun effet).
  7. Toute tentative d'inscription est traçable via des événements minimisés, sans PII en clair.
  8. Le comportement du systÚme ne doit pas permettre l'énumération fiable des emails existants.
  9. À 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.
  10. Sans validation à expiration, le compte est supprimé automatiquement avec trace minimale de purge.
  11. 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.
  12. 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 : string
  • srp_salt : string (hex/base64)
  • srp_verifier : string (hex/base64)
  • srp_params : identifiant ou objet dĂ©crivant les paramĂštres SRP
  • client_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

  1. Le client appelle POST /auth/register avec email + artefacts SRP.
  2. Le systÚme valide la conformité des champs.
  3. Le systÚme crée atomiquement :
  4. un utilisateur en état PENDING_VALIDATION ;
  5. les artefacts SRP persistés ;
  6. un jeton de validation Ă  usage unique (TTL 1h).
  7. L'envoi de l'email de validation est déclenché.
  8. 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

  1. Format exact accepté pour l'email.
  2. Politique de complexité du mot de passe cÎté client.
  3. ParamĂštres SRP canoniques (groupes, hash).
  4. Seuils exacts de rate limiting et CAPTCHA.
  5. Politique de rétention et purge des traces.

Fin de la spécification canonique.