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
- L'utilisateur appelle
DELETE /user/account avec JWT valide, reauth token valide et confirmation renforcée valide. - Le système invalide toutes les sessions utilisateur.
- Le système anonymise/purge les données utilisateur conformément au RGPD.
- Le système supprime le compte dans Keycloak.
- 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
- Modalités d'anonymisation/purge RGPD (périmètre des données, délai de propagation).
- Méthode d'observation de la suppression Keycloak pour tests (log, audit, endpoint).