DOC
Accueil/ Projets/ MJY Task Platform/ ADR 0002 : Authentification via Supabase Auth natif (abandon de la couche « maison »)

ADR 0002 : Authentification via Supabase Auth natif (abandon de la couche « maison »)

  • Statut : Accepté
  • Décideurs : Marco (Commanditaire), Julien (Commanditaire), Seer (Développeur)
  • Date : 8 juillet 2026

Contexte et Problème

L'ADR 0001 a acté la migration vers Supabase. Lors de la première mise en œuvre, une dérive d'architecture s'est installée, hors du plan validé (voir docs/features/handoff_migration_supabase.md) :

  1. Codes PIN hachés « maison » : colonnes pin_hash et appels à crypt() gérés manuellement.
  2. « Jetons » de connexion (JWT) fabriqués à la main, signés côté application.
  3. Rôles incohérents (admin / employee) ne correspondant pas au brief.
  4. Un membre = un seul projet, alors que le métier exige le multi-projets.

Ce modèle est à la fois moins sûr (un JWT forgé maison peut ouvrir un accès, la vérification des PIN est faite hors du système d'auth) et plus coûteux à maintenir (réimplémentation de briques déjà fournies par Supabase).

Facteurs de Décision

  • Sécurité : le hachage et la vérification des mots de passe doivent reposer sur une brique éprouvée, pas sur du code applicatif.
  • Conformité au brief : rôles réels super_manager / manager / employee, et un membre pouvant appartenir à plusieurs projets.
  • Maintenabilité : minimiser le code de sécurité écrit à la main.
  • Continuité : le PIN à 4 chiffres reste le moyen d'identification côté utilisateur.

Options Envisagées

Option A : Consolider la couche d'authentification « maison »

Conserver pin_hash + crypt() et les JWT signés par l'application, en corrigeant les incohérences de rôles.

  • Avantage : pas de remigration des comptes.
  • Inconvénient : on maintient indéfiniment une brique de sécurité critique réinventée ; surface d'attaque (forge de jeton) ; le hachage manuel duplique ce que Supabase fait déjà.

Option B : Supabase Auth natif (Recommandée)

Utiliser auth.users, signInWithPassword (bcrypt natif géré par Supabase), sessions Supabase natives. Le PIN devient le mot de passe du compte. Rôles réels et pivot project_members (N-N).

  • Avantage : hachage/vérification délégués à Supabase, sessions signées standard, RLS branchée sur auth.uid(), moins de code maison.
  • Inconvénient : nécessite un nettoyage complet de la base et un re-seed des comptes ; le PIN à 4 chiffres impose un ajustement (cf. ADR 0006).

Décision Retenue

L'Option B : Supabase Auth natif a été retenue.

Justification

C'est la seule option qui supprime la dérive sécuritaire (plus de JWT ni de hachage maison) tout en respectant le brief (rôles réels, multi-projets). Le hachage est délégué à une brique standard, et la RLS s'appuie naturellement sur l'identité auth.uid(). Le surcoût (nettoyage + re-seed) est ponctuel.

Conséquences

Positives

  • Aucun code de hachage maison : bcrypt natif Supabase.
  • Sessions standard signées par Supabase (plus de JWT forgeable).
  • Rôles conformes au brief et multi-projets via project_members.
  • Base saine pour la RLS et le contrôle d'accès.

Négatives

  • Migration destructive (base vidée puis re-seedée via scripts/seed-members.js).
  • Le PIN à 4 chiffres < 6 caractères (minimum Supabase) impose une dérivation du mot de passe et des mesures anti brute-force (cf. ADR 0006 et ADR 0007).