Supabase
Le mémo de Supabase avec Nuxt : clés, configuration, requêtes, authentification, RLS, stockage et temps réel.
Ce mémo résume l'essentiel de Supabase dans un projet Nuxt. Chaque section renvoie au cours qui l'explique.
Les clés
| Clé | Préfixe | Où |
|---|---|---|
Publishable (ancien anon) | sb_publishable_ | Navigateur, protégée par la RLS |
Secrète (ancien service_role) | sb_secret_ | Serveur uniquement, jamais commitée |
Détails : Découvrir Supabase.
Configuration Nuxt
npx nuxi@latest module add supabase
.env
NUXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NUXT_PUBLIC_SUPABASE_KEY=sb_publishable_...
| Fonction | Usage |
|---|---|
useSupabaseClient() | Client dans les pages et composants. |
useSupabaseUser() | Utilisateur connecté (claims : sub, email) ou null. |
serverSupabaseClient(event) | Client dans server/ (#supabase/server). |
Détails : Brancher Supabase à Nuxt.
Lire et écrire
await supabase.from('recettes').select('id, titre').eq('id', 1).order('created_at').limit(10)
await supabase.from('recettes').insert({ titre: 'Crêpes' }).select()
await supabase.from('recettes').update({ titre: 'Galettes' }).eq('id', 1)
await supabase.from('recettes').delete().eq('id', 1)
Chaque appel renvoie { data, error }. Détails : Lire et écrire des données.
Authentification
| Appel | Effet |
|---|---|
auth.signUp({ email, password }) | Crée un compte. |
auth.signInWithPassword({ email, password }) | Connecte. |
auth.signOut() | Déconnecte (tous les appareils par défaut). |
nuxt.config.ts
supabase: { redirectOptions: { login: '/login', callback: '/confirm', exclude: ['/', '/recettes'] } }
Détails : Authentification.
Row Level Security
alter table recettes enable row level security;
create policy "Lire"
on recettes for select to anon, authenticated using ( true );
create policy "Supprimer ses recettes"
on recettes for delete to authenticated
using ( (select auth.uid()) = user_id );
| Clause | Teste |
|---|---|
using | Les lignes existantes. |
with check | Les lignes écrites. |
Détails : Row Level Security.
Stockage
await supabase.storage.from('photos-recettes').upload('dossier/photo.jpg', fichier)
supabase.storage.from('photos-recettes').getPublicUrl('dossier/photo.jpg').data.publicUrl
(await supabase.storage.from('photos-recettes').createSignedUrl('dossier/photo.jpg', 3600)).data?.signedUrl
Détails : Stockage et temps réel.
Temps réel
const canal = supabase.channel('nom')
.on('postgres_changes', { event: '*', schema: 'public', table: 'recettes' }, (p) => console.log(p))
.subscribe()
supabase.removeChannel(canal)
alter publication supabase_realtime add table recettes;
Détails : Stockage et temps réel.
Sécurité
- RLS activée sur chaque table exposée.
- Clé secrète jamais dans le navigateur ni dans Git,
.envdans.gitignore. - Une redirection de page ne protège pas les données : seule la RLS le fait.
Sources officielles
Ensuite
- Projet
- Lignes de code
- Niveau
- Cave
- Appartement
- Supabase
- Pièce
- 7/7
- Plan n°
- supabase/index