đ Authentification avec NextAuth.js et gestion des sessions dans Next.js 13+
NextAuth.js est une solution dâauthentification simple et sĂ©curisĂ©e pour Next.js. Il prend en charge plusieurs fournisseurs (OAuth, Credentials, JWT, etc.) et sâintĂšgre parfaitement avec lâarchitecture App Router (app/
) de Next.js 13+.
1ïžâŁ Installation de NextAuth.js
Avant de commencer, installons la bibliothĂšque :
npm install next-auth
2ïžâŁ Configuration de NextAuth.js avec un fournisseur (Google)
đ DĂ©finition du routeur dâauthentification (/app/api/auth/[...nextauth]/route.ts
)
NextAuth.js fonctionne via une API route qui gĂšre lâauthentification.
import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
export const authOptions = {
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
}),
],
secret: process.env.NEXTAUTH_SECRET, // Clé secrÚte pour sécuriser les sessions
callbacks: {
async session({ session, token }) {
session.user.id = token.sub; // Ajout de l'ID utilisateur Ă la session
return session;
},
},
};
const handler = NextAuth(authOptions);
export { handler as GET, handler as POST };
â Explication :
- DĂ©clare Google comme fournisseur OAuth.
- Utilise
callbacks.session
pour stocker lâID utilisateur dans la session. - DĂ©finit lâAPI route
auth/
qui gÚre la connexion et la déconnexion.
3ïžâŁ Ajout des variables dâenvironnement (.env.local
)
Créez un fichier .env.local
Ă la racine du projet et ajoutez :
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
NEXTAUTH_SECRET=your-random-secret-key
NEXTAUTH_URL=http://localhost:3000
Remplacez your-google-client-id
et your-google-client-secret
par vos clĂ©s Google OAuth (disponibles dans Google Cloud Consoleâ).
4ïžâŁ Interface utilisateur : Connexion & DĂ©connexion
Maintenant, créons un bouton de connexion/déconnexion pour gérer les sessions.
"use client";
import { signIn, signOut, useSession } from "next-auth/react";
export default function AuthButton() {
const { data: session } = useSession();
if (session) {
return (
<div>
<p>Connecté en tant que {session.user?.email}</p>
<button onClick={() => signOut()} className="bg-red-500 text-white px-4 py-2 rounded">
Se déconnecter
</button>
</div>
);
}
return (
<button onClick={() => signIn("google")} className="bg-blue-500 text-white px-4 py-2 rounded">
Se connecter avec Google
</button>
);
}
â Explication :
useSession()
: RĂ©cupĂšre lâĂ©tat de lâutilisateur connectĂ©.signIn("google")
: DĂ©marre lâauthentification avec Google.signOut()
: DĂ©connecte lâutilisateur.
5ïžâŁ Protection des pages (Middleware & Server Components)
đč Middleware : ProtĂ©ger lâensemble du site
Si vous voulez restreindre lâaccĂšs aux pages aux utilisateurs connectĂ©s, utilisez un middleware.
đ Fichier : middleware.ts
import { withAuth } from "next-auth/middleware";
export default withAuth({
pages: {
signIn: "/login", // Redirection si l'utilisateur n'est pas authentifié
},
});
Ce middleware empĂȘche les utilisateurs non authentifiĂ©s dâaccĂ©der Ă certaines pages.
đč Protection des pages avec Server Components
Vous pouvez également protéger une page spécifique en récupérant la session cÎté serveur.
import { getServerSession } from "next-auth";
import { authOptions } from "../api/auth/[...nextauth]/route";
export default async function Dashboard() {
const session = await getServerSession(authOptions);
if (!session) {
return <p>AccÚs refusé. Veuillez vous connecter.</p>;
}
return <h1>Bienvenue sur le Dashboard, {session.user?.name} !</h1>;
}
â Explication :
getServerSession(authOptions)
rĂ©cupĂšre la session cĂŽtĂ© serveur.- Si lâutilisateur nâest pas connectĂ©, un message dâerreur sâaffiche.
6ïžâŁ GĂ©rer la session dans un Layout global
Vous pouvez afficher lâĂ©tat de lâauthentification dans un layout global.
import { getServerSession } from "next-auth";
import { authOptions } from "./api/auth/[...nextauth]/route";
import AuthButton from "@/components/AuthButton";
export default async function RootLayout({ children }) {
const session = await getServerSession(authOptions);
return (
<html lang="fr">
<body>
<nav>
{session ? (
<p>Bienvenue, {session.user?.name}!</p>
) : (
<p>Vous n'ĂȘtes pas connectĂ©.</p>
)}
<AuthButton />
</nav>
{children}
</body>
</html>
);
}
â Avantage : La session est accessible partout dans lâapplication.
đŻ Conclusion
đ Avec NextAuth.js, lâauthentification dans Next.js 13+ devient simple et sĂ©curisĂ©e :
â
Gestion native des sessions avec useSession()
et getServerSession()
.
â
Support de plusieurs fournisseurs OAuth (Google, GitHub, etc.).
â
Sécurité renforcée avec JWT et cookies sécurisés.
đ Prochaine Ă©tape ? Ajouter une base de donnĂ©es pour gĂ©rer les utilisateurs avec Prisma ! đ„