Exercice - Better Auth — Courriel et mot de passe¶
Créer une application de gestion de notes personnelles avec authentification par courriel et mot de passe :
Mise en contexte¶
Le code de départ ci-dessous contient une application Next.js qui gère des notes pour un utilisateur. Le but de l'exercice est de rendre l'application multi-utilisateurs en ajoutant l'authentification.
Étape 1 — Code de départ¶
Clonez le code de départ, une application complète que vous allez modifier :
Étape 2 -- Configurer Better Auth¶
- Installer
better-authet@better-auth/prisma-adapter - Générer
BETTER_AUTH_SECRETavecnpx auth@latest secretet ajouterBETTER_AUTH_URLdans.env - Créer
lib/auth.tsavecemailAndPassword.enabled: trueet le plugicielnextCookies - Créer le gestionnaire de route
app/api/auth/[...all]/route.ts - Créer le client
lib/auth-client.ts - Générer les tables avec
npx auth@latest generate, puis appliquer la migration Prisma
Étape 3 - Créer les pages d'authentification¶
app/inscription/page.tsx: formulaire avec nom, courriel et mot de passe ; la Server Action appelleauth.api.signUpEmail, puis redirige vers/connexionapp/connexion/page.tsx: formulaire dont la Server Action appelleauth.api.signInEmail; afficher un message d'erreur si les identifiants sont invalides (capturer l'APIError)
Étape 4 - Protéger les pages¶
- Vérifier manuellement la session avec
auth.api.getSession({ headers: await headers() })et rediriger si absente :app/notes/page.tsx: liste des notes de l'utilisateur connecté (filtrer parutilisateurId)app/notes/nouvelle/page.tsx: formulaire de création de note avec une Server Actionapp/notes/[id]/page.tsx: affichage d'une note, s'assurer que la note appartient à l'utilisateur connecté
- Ajouter un composant de navigation qui affiche le nom de l'utilisateur et un bouton « Se déconnecter » (le bouton est un composant client qui appelle
authClient.signOut())
Identifiants des utilisateurs
Better Auth génère des id de type texte (chaîne) plutôt que des entiers auto-incrémentés. Adaptez le type de utilisateurId dans votre modèle Prisma Note en conséquence.