learn.chetana.fr

Cycle de vie d'un utilisateur : invitation, activation, désactivation

12 min de lectureAvancé

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 membership est 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_sub est NULL — 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 sub du JWT au membership et on passe active. 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 :

  1. Webhook « utilisateur créé » du fournisseur → on lie Ă  la rĂ©ception.
  2. JIT : Ă  la premiĂšre requĂȘte authentifiĂ©e, le middleware voit un sub sans membership liĂ© 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).

đŸ§© Quiz1/4

Pourquoi garder une table membership locale alors que l'auth est déléguée ?

🃏 Flashcards1/5