Supabase Auth en pratique : vérification e-mail, OAuth et gestion de session

J’ai ouvert le Supabase Dashboard, cliqué sur Authentication, et j’ai été dépassé. Vérification e-mail, Magic Link, OAuth, config SSR… trop d’options. Laquelle choisir ? Comment configurer ?
Si vous êtes dans le même cas, pas de panique. En ajoutant la connexion à un petit projet, j’ai perdu une demi-journée avant de comprendre que chaque mode a son usage. Cet article enchaîne les trois piliers de Supabase Auth : vérification e-mail, intégration OAuth, et la gestion de session qui embrouille souvent. À la fin, vous devriez pouvoir mettre en place une authentification complète en une trentaine de minutes.
Vérification e-mail — le mode le plus basique
Franchement, la vérification e-mail est la partie la plus simple de Supabase Auth, et aussi celle qu’on néglige le plus.
Dans le Dashboard, Authentication → Providers → Email, vous verrez l’interrupteur « Confirm Email ». Il détermine si l’utilisateur doit valider son e-mail après inscription pour se connecter. Sur un projet hébergé, c’est activé par défaut : un e-mail de confirmation arrive, le lien active le compte.
La première fois, je l’avais désactivé par erreur. Résultat : n’importe quelle adresse suffisait, et les comptes spam ont afflué. En production, cet interrupteur doit rester activé.
Le code est simple :
// Inscription avec déclenchement de la vérification e-mail
const { data, error } = await supabase.auth.signUp({
email: '[email protected]',
password: 'secure-password',
options: {
emailRedirectTo: 'https://yourapp.com/auth/callback'
}
})
Un détail important : le paramètre emailRedirectTo. Après le clic sur le lien de l’e-mail, l’utilisateur est redirigé vers cette URL — page d’accueil ou page de bienvenue dédiée.
Côté modèles, Supabase fournit confirmation d’e-mail, réinitialisation de mot de passe et Magic Link. Vous les éditez dans Email Templates du Dashboard. Pour un SMTP perso (Resend, SendGrid), configurez Auth Hooks — c’est du niveau avancé ; les modèles par défaut suffisent au départ.
Piège que j’ai connu : en local, la vérification peut sembler bloquée, car l’instance locale n’envoie pas de vrais e-mails. Utilisez Mailcatcher pour les tests, ou désactivez Confirm Email en dev et réactivez-le avant la mise en production.
Intégration OAuth — connexion en un clic
OAuth améliore nettement l’expérience : pas de mot de passe à retenir, un clic GitHub ou Google, et la conversion dépasse souvent l’inscription par e-mail.
Supabase couvre de nombreux providers : GitHub, Google, Facebook, Apple, Azure, Twitter, Discord… plus de 15 au total. J’utilise surtout GitHub et Google, les flux les plus clairs.
Pour GitHub OAuth, créez d’abord une OAuth App (Settings → Developer settings → OAuth Apps → New OAuth App). La Callback URL doit être exacte :
https://<votre-ref-projet>.supabase.co/auth/v1/callback
En local :
http://localhost:54321/auth/v1/callback
Copiez Client ID et Client Secret dans le Dashboard (Authentication → Providers → GitHub). Côté client :
// Connexion GitHub OAuth
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'github',
options: {
redirectTo: 'https://yourapp.com/auth/callback'
}
})
Google suit le même schéma, avec une nuance : des Client ID distincts pour Web, iOS et Android. Multi-plateforme implique plusieurs configs.
Après OAuth, Supabase fournit un provider token utilisable pour les API tierces — lister les dépôts GitHub, accéder à Google Drive, etc. Très pratique quand l’app s’appuie sur des services externes.
Piège fréquent en local : mauvaise callback URL. J’avais mis le port 3000 (frontend) ; l’erreur venait de là. La callback doit viser le port Supabase, pas celui du frontend.
Gestion de session — JWT et flux PKCE
C’est souvent la section la plus confuse. Au début, je ne voyais pas clairement comment JWT, refresh token et PKCE s’enchaînent.
Une session Supabase combine un access token (JWT court) et un refresh token (longue durée). L’access token expire par défaut après 1 heure ; la doc recommande de ne pas descendre sous 5 minutes (décalage d’horloge). Le refresh token est à usage unique et sert à obtenir un nouvel access token.
Point important : fenêtre de réutilisation de 10 secondes sur le refresh token. En SSR, si plusieurs requêtes rafraîchissent en parallèle, Supabase accepte les rafraîchissements répétés dans cette fenêtre sans couper la session — utile quand front et back manipulent la session en même temps.
PKCE : avec Next.js ou tout framework SSR, c’est indispensable. Le flux implicite expose le token dans l’URL, ce qui est risqué en SSR. PKCE protège l’échange via un code verifier.
À l’initialisation client, deux paramètres :
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
auth: {
detectSessionInUrl: true,
flowType: 'pkce'
}
})
Puis une route callback pour l’échange du code :
// Next.js App Router - app/auth/callback/route.ts
import { NextResponse } from 'next/server'
import { createClient } from '@/utils/supabase/server'
export async function GET(request: Request) {
const { searchParams, origin } = new URL(request.url)
const code = searchParams.get('code')
if (code) {
const supabase = await createClient()
const { error } = await supabase.auth.exchangeCodeForSession(code)
if (!error) {
return NextResponse.redirect(`${origin}/dashboard`)
}
}
return NextResponse.redirect(`${origin}/auth/error`)
}
L’auth code dure 5 minutes et ne s’échange qu’une fois. Échec au debug : souvent timeout ou réutilisation.
Supabase propose aussi trois modes de limitation : Time-boxed (expiration fixe), Inactivity timeout (inactivité prolongée), Single session per user (une session active par compte). Utile pour la conformité SOC 2 ou HIPAA.
Conseils pratiques et questions fréquentes
Quel mode choisir ?
En bref : e-mail pour une inscription avec profil complet ; OAuth pour une connexion rapide (outils dev, B2B) ; Magic Link pour le sans mot de passe (accès temporaire, mobile-first).
Comparaison :
| Mode | Cas d’usage | Avantages | Inconvénients |
|---|---|---|---|
| Vérification e-mail | Inscription formelle | Données complètes, contrôle fort | L’utilisateur mémorise un mot de passe |
| OAuth | Connexion rapide | Sans mot de passe, bon taux de conversion | Dépendance au tiers |
| Magic Link | Sans mot de passe | Simple, sécurisé | Consulter la boîte mail à chaque connexion |
Avec Next.js ou autre SSR, checklist :
detectSessionInUrl: true— Supabase extrait la session depuis l’URLflowType: 'pkce'— force le flux PKCEredirectTocorrect — la route callback gère l’auth code- Variables d’environnement —
NEXT_PUBLIC_SUPABASE_URLetNEXT_PUBLIC_SUPABASE_ANON_KEYrenseignées
Questions courantes :
Q : Pourquoi OAuth échoue en local ?
Souvent une mauvaise callback URL. Vérifiez le Provider dans le Dashboard : localhost, pas le domaine de production.
Q : Déconnexion forcée à l’expiration du JWT ?
Assurez un rafraîchissement automatique. onAuthStateChange gère le refresh sans logique manuelle.
Q : La session disparaît soudainement ?
Fréquent en SSR. Vérifiez l’initialisation du client serveur et navigateur, surtout la transmission des cookies.
Conclusion
Les trois modes Supabase Auth ont chacun leur place. E-mail pour l’inscription formelle ; OAuth pour l’expérience rapide ; la gestion de session (JWT, PKCE) pour que tout tienne en SSR.
Mes erreurs étaient simples : mauvaise callback URL, Confirm Email oublié, PKCE absent. Une fois ces détails réglés, l’authentification tourne de façon stable.
Étape suivante : après Auth, protégez les données avec Row Level Security (RLS). RLS et Auth sont liés — chaque utilisateur n’accède qu’à ses données ; c’est la boucle complète de l’authentification.
Configurer le flux complet Supabase Auth
De la vérification e-mail à l'intégration OAuth, jusqu'à PKCE en environnement SSR
⏱️ Estimated time: 30 min
- 1
Step 1: Activer la vérification e-mail
Dans le Supabase Dashboard :
• Allez dans Authentication → Providers → Email
• Activez l'interrupteur Confirm Email
• Configurez emailRedirectTo vers l'URL de callback de votre application
• En local, testez les e-mails avec Mailcatcher - 2
Step 2: Configurer GitHub OAuth
Établissez la connexion OAuth entre GitHub et Supabase :
• Créez une OAuth App sur GitHub (Settings → Developer settings → OAuth Apps)
• Callback URL : https://<ref>.supabase.co/auth/v1/callback
• En local : http://localhost:54321/auth/v1/callback
• Copiez Client ID et Client Secret dans le Supabase Dashboard - 3
Step 3: Configurer le flux PKCE
Pour un flux d'authentification sécurisé en SSR (Next.js) :
• À l'initialisation client, définissez flowType: 'pkce'
• Activez detectSessionInUrl: true
• Créez une route /auth/callback pour l'échange du code
• L'auth code est valide 5 minutes et ne peut être utilisé qu'une fois - 4
Step 4: Gérer le rafraîchissement de session
Maintenez une session active :
• L'access token expire par défaut après 1 heure
• Le refresh token est à usage unique, fenêtre de réutilisation de 10 secondes
• Le client écoute onAuthStateChange pour rafraîchir automatiquement
• En SSR, vérifiez que les cookies sont correctement transmis
FAQ
Quels OAuth Providers Supabase Auth prend-il en charge ?
Quelle est la durée d'expiration par défaut du JWT access token ?
Pourquoi le flux PKCE est-il obligatoire en SSR ?
Le callback OAuth échoue toujours en développement local, que faire ?
Qu'est-ce que la fenêtre de réutilisation du refresh token ?
Comment choisir entre les trois modes d'authentification ?
6 min de lecture · Publié le: 8 avr. 2026 · Mis à jour le: 27 juil. 2026
Supabase en pratique
Si vous arrivez depuis la recherche, le plus rapide est de passer à l’article précédent ou suivant de cette série.
Précédent
Conception de base de données Supabase : schéma, relations et Row Level Security
Guide complet des bonnes pratiques de conception de base de données Supabase : conventions de nommage, trois modèles relationnels, stratégies Row Level Security et optimisation des performances, avec cas pratiques.
Partie 2 sur 10
Suivant
Supabase Storage en pratique : upload, contrôle d'accès et accélération CDN
Maîtrisez Supabase Storage de bout en bout : upload de fichiers, configuration des permissions, intégration CDN, politiques RLS, isolation par utilisateur, Smart CDN et transformation d'images.
Partie 4 sur 10



Commentaires
Connectez-vous avec GitHub pour laisser un commentaire