Supprimer un compte utilisateur semble simple. En pratique, c'est rarement juste "delete user". Entre l'utilisateur Auth, les donnees liees, le stockage, les sessions et les obligations produit, il faut traiter le sujet proprement.
Avec Supabase et Next.js, le bon objectif n'est pas seulement de supprimer. Le bon objectif est de supprimer sans laisser d'incoherence.
Ce que beaucoup font mal
Le raccourci classique est :
- appeler une suppression sur l'utilisateur
- penser que tout le reste va suivre
Le probleme, c'est qu'un compte peut posseder bien plus que sa ligne dans auth.users :
- des profils
- des messages
- des projets
- des fichiers dans Storage
- des relations metier
- des traces utiles a conserver ou anonymiser
Si vous ne cartographiez pas cela, vous supprimez une identite, mais vous laissez un tas de donnees orphelines.
Ce que dit Supabase
La documentation Supabase est claire sur deux points utiles :
- la suppression admin d'un utilisateur requiert
service_role - vous ne pouvez pas supprimer un utilisateur s'il est proprietaire d'objets dans Supabase Storage
Il faut donc penser la suppression comme un flux serveur et non comme une simple action front-end.
Suppression, anonymisation ou archivage
Avant d'ecrire du code, il faut choisir la bonne action produit.
Selon le contexte, vous pouvez avoir besoin de :
- suppression totale : compte et donnees associees effaces
- anonymisation : les donnees metier restent, mais sans identite directe
- archivage : le compte n'est plus actif, mais les donnees sont conservees pour une raison legale ou operationnelle
Si vous vendez a des entreprises, ce choix a souvent un impact legal, support et reporting. Il faut donc le definir avant de coder.
Le bon flux serveur
Dans un projet Next.js, le schema le plus propre ressemble a ceci :
- l'utilisateur demande la suppression
- une route serveur verifie son identite et ses droits
- le serveur dresse la liste des donnees a traiter
- les fichiers Storage sont supprimes ou reassignes si besoin
- les donnees metier sont supprimees ou anonymisees
- l'utilisateur Auth est supprime en dernier
Ce dernier point est important. Si vous supprimez l'utilisateur Auth trop tot, vous perdez parfois la coherence du flux et le contexte utile pour finir le nettoyage.
Un exemple de sequence
Dans un portail client classique, une suppression propre peut ressembler a ceci :
- suppression ou reassignment des objets Storage
- suppression des lignes enfant qui dependent du compte
- anonymisation eventuelle des historiques a conserver
- suppression du profil
- suppression admin du compte Auth
Supabase propose l'operation de suppression via l'API admin JavaScript :
await supabase.auth.admin.deleteUser(userId)
Cette operation doit rester cote serveur.
Le piege des sessions
Supabase rappelle aussi qu'un JWT peut rester valide jusqu'a son expiration. En pratique, cela veut dire qu'apres suppression, une session peut ne pas disparaitre instantanement du point de vue du navigateur.
Il faut donc prevoir une experience claire :
- invalider l'acces cote app
- rediriger proprement l'utilisateur
- eviter les ecrans ambigus ou les erreurs incomprehensibles
La securite et l'experience utilisateur se rejoignent ici.
Le cas particulier de Storage
C'est un point qu'on oublie souvent.
Si l'utilisateur possede des objets Storage, Supabase peut refuser sa suppression tant que ces objets existent encore. Il faut donc :
- connaitre le bucket
- connaitre la logique de proprietaire
- supprimer ou reassigner les fichiers avant
Si vous sautez cette etape, la suppression echoue et l'equipe pense souvent que "Supabase bug", alors que le comportement est documente.
Une mini checklist avant de brancher le bouton
Avant d'ajouter un bouton "Supprimer mon compte", verifiez :
- quelles tables referencent l'utilisateur
- quels fichiers Storage lui appartiennent
- quelles donnees doivent etre supprimees
- quelles donnees doivent etre anonymisees
- quelle experience l'utilisateur verra apres la demande
Cette checklist parait simple, mais elle evite beaucoup de dette et de stress support.
Ce qu'il faut retenir
Supprimer un compte utilisateur proprement avec Supabase et Next.js, ce n'est pas juste appeler une methode admin. C'est definir un flux serveur propre, traiter les donnees liees, anticiper Storage, puis gerer la sortie utilisateur avec clarte.
Le bon code commence par une bonne decision produit : qu'est-ce qui doit vraiment disparaitre, qu'est-ce qui doit rester, et qui porte la responsabilite du nettoyage.
