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
.
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
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, unusername
doit être unique).CHECK
: impose une règle logique à une colonne (par exemple, vérifier que leusername
ne soit pas vide).
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 :
Colonne | Type | Description |
---|---|---|
id | UUID | Identifiant unique (lié à auth.users) |
username | text | Nom d’utilisateur, unique et non vide |
avatar_url | text | URL de l’avatar (optionnelle) |
created_at | timestamp | Date 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.
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 deauth.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
- Aller dans l’onglet Table Editor.
- Cliquer sur
profiles
pour voir les colonnes créées. - Vérifier que les contraintes sont bien visibles (clé étrangère, unique, etc.).
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
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
- Rendez-vous sur https://supabase.com et connectez-vous.
- Notez les informations suivantes :
- URL du projet
- Clé API publique
- Clé API secrète
Une solution
Vous devez être connecté pour voir le contenu.
Étape 2 — Se rendre dans le SQL Editor
- Dans le dashboard Supabase de votre projet, cliquez sur SQL Editor.
- Créez un nouveau script que vous nommerez
create_profiles_table
. - 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())
);
- Cliquez sur RUN pour exécuter le script.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 3 — Vérifier la table dans Table Editor
- Allez dans l’onglet Table Editor.
- Cliquez sur la table
profiles
. - Vérifiez que les colonnes suivantes sont présentes :
id
username
avatar_url
created_at
- Vérifiez que les contraintes suivantes sont bien visibles :
- Clé primaire sur
id
- Clé étrangère vers
auth.users(id)
UNIQUE
surusername
CHECK
sur la longueur deusername
- Clé primaire sur
Une solution
Vous devez être connecté pour voir le contenu.
Étape 4 — Ajouter un utilisateur test
- Allez dans l’onglet Auth > Users.
- Cliquez sur Add User.
- Créez un utilisateur avec un email valide (ex:
test@example.com
) et un mot de passe. - Cliquez sur Invite User ou Create User.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 5 — Insérer manuellement un profil
- Récupérez l’UUID de l’utilisateur que vous venez de créer :
- Allez dans Auth > Users
- Copiez l’UUID du champ
ID
.
- 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
Vous devez être connecté pour voir le contenu.
É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
Vous devez être connecté pour voir le contenu.
Étape 7 — Supprimer l’utilisateur
Observer l’effet de
ON DELETE CASCADE
- Supprimez l’utilisateur créé à l’étape 4 depuis Auth > Users.
- Retournez dans Table Editor > profiles ou exécutez :
select * from public.profiles;
- Vérifiez que le profil a bien été supprimé automatiquement.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 8 — Documenter votre schéma
- Dans un document texte (Markdown ou autre), décrivez la structure actuelle de la table
profiles
. - Pour chaque colonne, indiquez :
- Le type
- Les contraintes (NOT NULL, UNIQUE, etc.)
- Les liens avec d’autres tables
- Sauvegardez ce document dans votre dépôt de projet (ou dans un dossier de travail).
Une solution
Vous devez être connecté pour voir le contenu.
É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
Vous devez être connecté pour voir le contenu.
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.