Cycle de vie d'un utilisateur : invitation, activation, désactivation
Authentification déléguée, autorisation locale
L'app délÚgue l'authentification à un fournisseur d'identité (ici Logto) : c'est lui qui prouve « tu es bien cette personne » (JWT, MFA, mot de passe). Mais il ne sait rien de ton métier : quel rÎle dans quel tenant, quels comptes affectés, qui a été invité mais pas encore connecté.
D'oĂč une rĂšgle qui surprend : tu possĂšdes ton propre annuaire d'autorisation, une table membership locale, distincte du fournisseur.
Le fournisseur d'identité est le videur (il prouve qui tu es) ; ta table
membershipest la liste des invités (ce que tu as le droit de faire, ton rÎle). On ne sous-traite jamais la liste des invités.
Un membership porte : le tenant, l'email (clé d'invitation), le logto_sub (l'identité cÎté fournisseur, NULL tant que pas activé), le rÎle (admin/standard), le statut.
Trois états
invited ââ(1re connexion : bind logto_sub)âââș active ââ(admin dĂ©sactive)âââș deactivated
â âČ â
âââ(rĂ©vocation)âââș â âââââ(rĂ©active)âââââââ
- invited : l'admin a invité par email + rÎle. La ligne existe, mais
logto_subestNULLâ la personne n'a pas encore d'identitĂ© chez nous. C'est pour ça que la colonne est nullable : on invite avant que l'identitĂ© existe. - active : Ă la 1re connexion rĂ©ussie, on lie le
subdu JWT aumembershipet on passeactive. Ce liage tardif s'appelle le binding JIT (just-in-time). - deactivated : ne peut plus se connecter, son connecteur personnel est coupĂ© â mais ses donnĂ©es restent (voir plus bas).
Le binding paresseux (JIT) plutĂŽt que le webhook
Deux façons de lier l'identité au membership quand l'invité accepte :
- Webhook « utilisateur créé » du fournisseur â on lie Ă la rĂ©ception.
- JIT : Ă la premiĂšre requĂȘte authentifiĂ©e, le middleware voit un
subsansmembershipliĂ© mais avec un email invitĂ© correspondant â il lie et active, Ă la volĂ©e.
Le JIT est prĂ©fĂ©rable : aucune dĂ©pendance Ă la livraison d'un webhook (qui peut se perdre, arriver en retard, ou manquer en environnement de test). Le liage se fait sur le chemin qu'on maĂźtrise â la requĂȘte entrante. Principe gĂ©nĂ©ral : prĂ©fĂšre un mĂ©canisme paresseux et auto-rĂ©parateur Ă un mĂ©canisme Ă©vĂ©nementiel fragile, quand l'Ă©tat peut ĂȘtre reconstruit Ă la demande.
Désactiver n'est pas supprimer
à la désactivation, on conserve : les affectations de comptes, l'attribution d'audit (created_by), l'historique. On coupe seulement l'accÚs (connexion) et le routage (connecteur perso). Raisons : traçabilité, et réversibilité (réactiver sans ré-inviter).
Un cas limite Ă trancher, Ă connaĂźtre : un compte affectĂ© exclusivement Ă un utilisateur dĂ©sactivĂ© devient invisible aux standards (plus personne d'actif n'y est affectĂ©) mais reste visible aux admins (is_admin='on'). Faut-il dĂ©saffecter automatiquement Ă la dĂ©sactivation, ou laisser l'admin rĂ©attribuer ? C'est une dĂ©cision produit, pas technique â mais la mĂ©canique RLS la rend sĂ»re par dĂ©faut (jamais de fuite, au pire une invisibilitĂ© temporaire cĂŽtĂ© standard).
Pourquoi garder une table membership locale alors que l'auth est déléguée ?