Aller au contenu

PD-240 — Suppression de compte utilisateur

1. Références

  • EPIC : PD-182 AUTH
  • JIRA : PD-240
  • Repos concernés : ProbatioVault-backend
  • Consommateur : PD-106

2. Objectif

Décrire le contrat canonique de l'endpoint backend permettant à un utilisateur authentifié de supprimer définitivement son compte, avec confirmation renforcée, re-authentification préalable, suppression Keycloak, anonymisation/purge RGPD et invalidation des sessions.

3. Description fonctionnelle

L'utilisateur initie une suppression de compte depuis l'application mobile. Le backend doit exiger une confirmation renforcée et une re-authentification récente avant d'exécuter la suppression. La suppression rend le compte définitivement inutilisable, entraîne l'invalidation de toutes les sessions et déclenche l'anonymisation/purge des données utilisateur selon RGPD.

4. Périmètre

Inclus

  • Endpoint DELETE /user/account.
  • Authentification JWT obligatoire.
  • Re-authentification obligatoire (reauth token PD-238) avant exécution.
  • Confirmation renforcée côté backend (validation d'un jeton/flag de confirmation explicite fourni par le client).
  • Suppression irréversible du compte Keycloak.
  • Anonymisation/suppression des données utilisateur selon RGPD (article 17).
  • Invalidation de toutes les sessions utilisateur.
  • Format d'erreur contractuel : {error: "ERR-240-*", message: "..."}.
  • Inutilisabilité du compte après suppression (toute tentative de réutilisation échoue).
  • Compatibilité contractuelle avec PD-106 (F-106-07, INV-106-14/15, CA-106-15/16).
  • Endpoint admin GET /admin/audit/user/{userId} retournant le statut de purge.

Exclu

  • Suppression sans re-authentification.
  • Gestion MFA (PD-238).
  • Gestion de profil (PD-32).
  • Réinitialisation de mot de passe « oublié ».
  • Suppression partielle (soft delete) non irréversible.

5. Définitions

  • Re-authentification : preuve récente d'identité via reauth token PD-238.
  • Reauth token : JWT signé avec sub, purpose="reauth", exp (TTL 5 minutes).
  • Confirmation renforcée : champ body JSON { "confirm": "DELETE_MY_ACCOUNT" } ; la valeur DOIT être exactement DELETE_MY_ACCOUNT.
  • Suppression Keycloak : suppression définitive de l'utilisateur dans Keycloak.
  • Anonymisation/purge RGPD : traitement des données personnelles conformément à l'article 17 RGPD.
  • Sessions : sessions actives de l'utilisateur (tokens/refresh) à invalider.
  • Message exploitable : message utilisateur contenant un motif actionnable.
  • Hors périmètre : exigence non vérifiable via PD-240 seul et devant être prouvée par un artefact externe.

6. Invariants (non négociables)

ID Règle Justification
INV-240-01 DELETE /user/account DOIT exiger un JWT valide. Empêche l'accès anonyme.
INV-240-02 DELETE /user/account DOIT exiger un reauth token valide. Protège opération critique (INV-106-14).
INV-240-03 DELETE /user/account DOIT exiger une confirmation renforcée valide. Empêche suppression accidentelle (INV-106-14).
INV-240-04 Le compte Keycloak DOIT être supprimé de manière irréversible. Conformité sécurité / PD-106.
INV-240-05 Les données utilisateur DOIVENT être anonymisées/purgées selon RGPD (art. 17). Observable : endpoint admin GET /admin/audit/user/{userId} retournant { "status": "purged", "purgedAt": "<ISO8601>" }. Cet endpoint fait partie du périmètre PD-240. Conformité réglementaire.
INV-240-06 Toutes les sessions utilisateur DOIVENT être invalidées AVANT la suppression du compte. Empêche la persistance de sessions compromises.
INV-240-07 Le compte ne DOIT plus être utilisable après suppression (auth échoue). Exigence PD-106 (INV-106-15).
INV-240-08 Le format d'erreur DOIT être {error: "ERR-240-*", message: "..."}. Compatibilité mobile PD-106.
INV-240-09 Tout refus serveur DOIT retourner un motif exploitable. Exigence PD-106.
INV-240-10 HORS PÉRIMÈTRE PD-240 : preuve juridique exhaustive RGPD doit être fournie par artefacts externes. Non prouvable via endpoints seuls.

7. Flux nominaux

F-240-01 — Suppression de compte nominale

  1. L'utilisateur appelle DELETE /user/account avec JWT valide, reauth token valide et confirmation renforcée valide.
  2. Le système invalide toutes les sessions utilisateur.
  3. Le système anonymise/purge les données utilisateur conformément au RGPD.
  4. Le système supprime le compte dans Keycloak.
  5. Le système retourne un succès explicite.

7bis. Diagrammes Mermaid

Diagramme de séquence — F-240-01 Suppression nominale

sequenceDiagram
    participant Client
    participant API as DELETE /user/account
    participant Auth as Auth Guard (JWT)
    participant Reauth as Reauth Guard (PD-238)
    participant Redis as Redis Sessions
    participant DB as PostgreSQL
    participant KC as Keycloak Admin API

    Client->>API: DELETE /user/account<br/>Authorization: Bearer <JWT><br/>X-Reauth-Token: <reauth><br/>{"confirm":"DELETE_MY_ACCOUNT"}
    API->>Auth: Valider JWT (INV-240-01)
    Auth-->>API: userId

    API->>Reauth: Valider reauth token (INV-240-02)
    Reauth-->>API: OK (purpose=reauth, TTL≤5min)

    API->>API: Vérifier confirm === "DELETE_MY_ACCOUNT" (INV-240-03)

    rect rgb(255, 240, 240)
        Note over API,KC: Zone critique — ordre imposé par INV-240-06
        API->>Redis: Invalider TOUTES les sessions userId (INV-240-06)
        Redis-->>API: OK
        Note right of Redis: Sessions invalidées AVANT suppression

        API->>DB: Anonymiser/purger données utilisateur RGPD art.17 (INV-240-05)
        DB-->>API: OK

        API->>KC: DELETE /admin/realms/{realm}/users/{kcUserId} (INV-240-04)
        KC-->>API: 204 No Content
    end

    API-->>Client: 200 OK (INV-240-07)
    Note right of Client: Toute auth ultérieure échoue (INV-240-07)

Diagramme d'états — Cycle de vie du compte lors de la suppression

stateDiagram-v2
    [*] --> Actif

    Actif --> Validation : DELETE /user/account reçu
    Validation --> Actif : ERR-240-UNAUTHENTICATED<br/>(JWT invalide, INV-240-01)
    Validation --> Actif : ERR-240-UNAUTHORIZED-REAUTH<br/>(reauth invalide, INV-240-02)
    Validation --> Actif : ERR-240-DELETE-CONFIRMATION<br/>(confirm invalide, INV-240-03)

    Validation --> SessionsInvalidées : Validations OK → invalidation sessions (INV-240-06)
    SessionsInvalidées --> Actif : ERR-240-SESSION-INVALIDATION-FAILED<br/>(rollback)

    SessionsInvalidées --> PurgeRGPD : Sessions invalidées → anonymisation (INV-240-05)
    PurgeRGPD --> Dégradé : ERR-240-DELETE-FAILED<br/>(sessions invalidées, compte KC non supprimé)

    PurgeRGPD --> SuppressionKC : Purge OK → suppression Keycloak (INV-240-04)
    SuppressionKC --> Dégradé : ERR-240-DELETE-FAILED<br/>(sessions invalidées, purge OK, KC échoué)

    SuppressionKC --> Supprimé : Suppression KC OK
    Supprimé --> [*]

    Dégradé --> [*] : Réconciliation manuelle

    note right of Supprimé
        Compte inutilisable (INV-240-07)
        Auth ultérieure échoue
        GET /admin/audit/user/{id} → purged (INV-240-05)
    end note

    note right of Dégradé
        Sessions déjà invalidées
        Réconciliation manuelle requise
    end note

8. Cas d'erreur

Code erreur Condition Comportement attendu
ERR-240-UNAUTHENTICATED JWT absent/invalide Refus explicite ; aucune suppression effectuée.
ERR-240-UNAUTHORIZED-REAUTH Reauth token absent/invalide/expiré Refus explicite ; aucune suppression effectuée.
ERR-240-DELETE-CONFIRMATION Confirmation renforcée invalide Refus explicite ; aucune suppression effectuée.
ERR-240-DELETE-FAILED Échec suppression compte (purge RGPD ou Keycloak) après invalidation sessions Refus explicite ; sessions invalidées mais compte Keycloak non supprimé (état dégradé). Message précise la cause. Réconciliation manuelle possible.
ERR-240-SESSION-INVALIDATION-FAILED Invalidation sessions échouée Refus explicite ; aucune suppression effectuée (rollback).
ERR-240-INTERNAL Erreur interne non métier Refus explicite ; aucun succès affiché.

9. Critères d'acceptation (testables)

ID Critère Observable
CA-240-01 DELETE /user/account sans JWT est refusé. Réponse d'erreur auth.
CA-240-02 DELETE /user/account sans reauth token est refusé. Réponse d'erreur reauth.
CA-240-03 Confirmation renforcée invalide est refusée. Code ERR-240-DELETE-CONFIRMATION.
CA-240-04 En succès, le compte Keycloak est supprimé. Échec d'authentification ultérieure.
CA-240-05 En succès, les données utilisateur sont anonymisées/purgées. Endpoint admin GET /admin/audit/user/{userId} retournant { "status": "purged", "purgedAt": "<ISO8601>" }.
CA-240-06 En succès, toutes les sessions sont invalidées. Rejet d'un token précédent.
CA-240-07 Format d'erreur {error, message} respecté. Inspection réponse JSON.
CA-240-08 Les refus serveur renvoient un motif exploitable. Présence message actionnable.
CA-240-09 HORS PÉRIMÈTRE PD-240 : preuve RGPD exhaustive via artefact externe. Présence artefact externe.

10. Hypothèses explicites

ID Hypothèse Impact si faux
H-240-01 Keycloak Admin API permet la suppression définitive d'un compte. Endpoint inopérant.
H-240-02 Le backend peut valider un reauth token PD-238. Opération non sécurisable.
H-240-03 Le mécanisme de confirmation renforcée est disponible côté client et transmissible au backend. INV-240-03 non atteignable.
H-240-04 Le backend peut invalider toutes les sessions utilisateur. INV-240-06 non garanti.
H-240-05 L'artefact RGPD est géré hors PD-240. CA-240-09 non démontrable.

11. Points à clarifier

  1. Modalités d'anonymisation/purge RGPD (périmètre des données, délai de propagation).
  2. Méthode d'observation de la suppression Keycloak pour tests (log, audit, endpoint).