Aller au contenu principal

Table des profils

Créer une table liée à l’authentification utilisateur

Notions théoriques

Pourquoi une table profiles ?

Lorsqu’un utilisateur s’inscrit via le système d’authentification de Supabase (auth.users), il n’a par défaut qu’un identifiant (UUID), un email et quelques métadonnées. Pour enrichir son profil (nom d’utilisateur, avatar, date d’inscription, etc.), il est nécessaire de créer une table supplémentaire appelée profiles.

info

Cette table est liée à la table auth.users via une clé étrangère, ce qui permet de relier chaque profil à un utilisateur authentifié.

Utiliser des UUID comme identifiants

Dans de nombreuses bases de données, on utilise des identifiants numériques (id serial) qui s’incrémentent automatiquement. Mais cela peut poser des problèmes de sécurité :

  • Ils sont prévisibles (1, 2, 3, 4…),
  • Ils permettent des attaques de type énumération d’ID (on teste les ID un par un pour accéder à d'autres utilisateurs).

Supabase utilise par défaut des UUID (identifiants universels uniques) pour les utilisateurs. Un UUID ressemble à ceci :

550e8400-e29b-41d4-a716-446655440000
astuce

Un UUID est très difficile à deviner car il est généré aléatoirement. C’est une bonne pratique pour sécuriser les identifiants.


Contraintes utiles à connaître

Lors de la création de la table profiles, certaines contraintes SQL sont ajoutées pour garantir l’intégrité des données :

  • PRIMARY KEY : identifie de manière unique chaque ligne.
  • FOREIGN KEY : crée un lien entre deux tables.
  • UNIQUE : empêche la duplication d’une valeur (par exemple, un username doit être unique).
  • CHECK : impose une règle logique à une colonne (par exemple, vérifier que le username ne soit pas vide).
info

Supabase permet de gérer ces contraintes directement depuis le SQL Editor ou via l’interface graphique (Table Editor).


Structure de la table profiles

Voici les colonnes à créer :

ColonneTypeDescription
idUUIDIdentifiant unique (lié à auth.users)
usernametextNom d’utilisateur, unique et non vide
avatar_urltextURL de l’avatar (optionnelle)
created_attimestampDate de création automatique

Sécurité des données personnelles

Certaines données comme le username sont visibles par d’autres utilisateurs. Il faut donc :

  • Limiter les accès avec des politiques RLS (séance 9),
  • Chiffrer les données si elles sont sensibles (non couvert ici, mais important en production),
  • Éviter les fuites d’informations en ne rendant visibles que les champs nécessaires.
attention

Ne jamais exposer directement l’ID ou l’email d’un utilisateur sans vérification des permissions.


Exemple pratique

Créer une table profiles

Il est possible de créer la table profiles, dans Supabase via le SQL Editor, liée à auth.users.

Voici le script à exécuter :

create table public.profiles (
id uuid primary key references auth.users(id) on delete cascade,
username text unique not null check (char_length(username) >= 3),
avatar_url text,
created_at timestamp with time zone default timezone('utc'::text, now())
);

Explication du script

  • id uuid primary key : identifiant unique, même que celui de auth.users.
  • references auth.users(id) : crée une clé étrangère vers la table d’authentification.
  • on delete cascade : si un utilisateur est supprimé, son profil l’est aussi.
  • username text unique not null : le nom d’utilisateur est obligatoire et unique.
  • check (char_length(username) >= 3) : empêche les noms trop courts.
  • created_at timestamp ... now() : ajoute automatiquement la date de création.

Vérifier la table dans Table Editor

  1. Aller dans l’onglet Table Editor.
  2. Cliquer sur profiles pour voir les colonnes créées.
  3. Vérifier que les contraintes sont bien visibles (clé étrangère, unique, etc.).
remarque

Les colonnes peuvent aussi être modifiées depuis cette interface, mais il vaut mieux garder une trace des modifications via SQL.


Test de mémorisation/compréhension


Quel type est utilisé pour les identifiants dans la table auth.users ?


Quelle contrainte empêche d’avoir deux fois le même nom d’utilisateur ?


Quel mot-clé permet de créer un lien entre deux tables ?


Que se passe-t-il si on supprime un utilisateur avec ON DELETE CASCADE ?


Quel mot-clé permet de vérifier qu’un champ respecte une règle logique ?


Pourquoi utiliser un UUID plutôt qu’un identifiant auto-incrémenté ?


Quelle colonne est automatiquement remplie à la création d’un profil ?


La contrainte NOT NULL signifie que…


Quel mot-clé permet de définir une clé primaire ?


Quelle est la bonne syntaxe pour créer une contrainte CHECK ?



TP pour réfléchir et résoudre des problèmes

Objectif du TP

Dans ce TP, vous allez créer une table profiles dans Supabase, liée à la table auth.users.

Cette table permettra d’enrichir les informations des utilisateurs (nom d’utilisateur, avatar, date d’inscription).

Ce TP est essentiel pour la suite du projet, car toutes les autres fonctionnalités (messages, classes, rôles, etc.) dépendront de l’existence d’un profil utilisateur correctement structuré.


Étape 1 — Récupérer les infos du projet

  1. Rendez-vous sur https://supabase.com et connectez-vous.
  2. Notez les informations suivantes :
    • URL du projet
    • Clé API publique
    • Clé API secrète
Une solution

Étape 2 — Se rendre dans le SQL Editor

  1. Dans le dashboard Supabase de votre projet, cliquez sur SQL Editor.
  2. Créez un nouveau script que vous nommerez create_profiles_table.
  3. Collez le script SQL suivant, sans le modifier :
create table public.profiles (
id uuid primary key references auth.users(id) on delete cascade,
username text unique not null check (char_length(username) >= 3),
avatar_url text,
created_at timestamp with time zone default timezone('utc'::text, now())
);
  1. Cliquez sur RUN pour exécuter le script.
Une solution

Étape 3 — Vérifier la table dans Table Editor

  1. Allez dans l’onglet Table Editor.
  2. Cliquez sur la table profiles.
  3. Vérifiez que les colonnes suivantes sont présentes :
    • id
    • username
    • avatar_url
    • created_at
  4. Vérifiez que les contraintes suivantes sont bien visibles :
    • Clé primaire sur id
    • Clé étrangère vers auth.users(id)
    • UNIQUE sur username
    • CHECK sur la longueur de username
Une solution

Étape 4 — Ajouter un utilisateur test

  1. Allez dans l’onglet Auth > Users.
  2. Cliquez sur Add User.
  3. Créez un utilisateur avec un email valide (ex: test@example.com) et un mot de passe.
  4. Cliquez sur Invite User ou Create User.
Une solution

Étape 5 — Insérer manuellement un profil

  1. Récupérez l’UUID de l’utilisateur que vous venez de créer :
    • Allez dans Auth > Users
    • Copiez l’UUID du champ ID.
  2. Allez dans SQL Editor et exécutez la requête suivante (en remplaçant l’UUID) :
insert into public.profiles (id, username, avatar_url)
values ('votre-uuid-ici', 'testuser', 'https://avatars.githubusercontent.com/u/583231?v=4');
Services gratuits pour générer des avatars
Une solution

Étape 6 — Tenter une insertion invalide

Tester la contrainte CHECK

Essayez maintenant d’insérer un profil avec un username trop court (par exemple, 1 caractère) :

insert into public.profiles (id, username)
values ('un-autre-uuid', 'a');
Une solution

Étape 7 — Supprimer l’utilisateur

Observer l’effet de ON DELETE CASCADE

  1. Supprimez l’utilisateur créé à l’étape 4 depuis Auth > Users.
  2. Retournez dans Table Editor > profiles ou exécutez :
select * from public.profiles;
  1. Vérifiez que le profil a bien été supprimé automatiquement.
Une solution

Étape 8 — Documenter votre schéma

  1. Dans un document texte (Markdown ou autre), décrivez la structure actuelle de la table profiles.
  2. Pour chaque colonne, indiquez :
    • Le type
    • Les contraintes (NOT NULL, UNIQUE, etc.)
    • Les liens avec d’autres tables
  3. Sauvegardez ce document dans votre dépôt de projet (ou dans un dossier de travail).
Une solution

Étape 9 — Préparer la suite

Vérifier que la table profiles est correctement liée à auth.users

Avant de passer à la prochaine séance (création des classes), assurez-vous que :

  • La table profiles existe avec les bonnes colonnes
  • Elle contient au moins un profil lié à un utilisateur
  • Les contraintes fonctionnent (testées via insertions invalides)
  • La suppression d’un utilisateur supprime bien son profil
Une solution

Fin du TP

Vous avez maintenant une table profiles propre, sécurisée et fonctionnelle, liée à l’authentification Supabase.

Cette base solide vous permettra d’ajouter des rôles, des classes, des messages, etc., dans les prochaines séances.