Auth0 avec Next.js : App Router, SSR et Server Components
Intégrer Auth0 dans une application Next.js 14+ avec le SDK @auth0/nextjs-auth0. App Router, Server Components, middleware et protection des routes API.
Par Auth0.Expert · 2025-02-18 · 12 min de lecture
Auth0 avec Next.js 14 : guide complet App Router
TL;DR
Le SDK @auth0/nextjs-auth0 supporte nativement le App Router de Next.js 14. Ce guide couvre la configuration, les Server Components, les Server Actions et la protection des routes API.
---
Installation
Ce bloc permet d’installer le SDK Auth0 pour Next.js et de configurer les variables d’environnement nécessaires à l’intégration Auth0.
npm install @auth0/nextjs-auth0
Ce fichier d’exemple montre comment définir les variables d’environnement indispensables à la connexion Auth0 sur votre application Next.js.
# .env.local
AUTH0_SECRET='use [openssl rand -hex 32] to generate a 32 bytes value'
AUTH0_BASE_URL='http://localhost:3000'
AUTH0_ISSUER_BASE_URL='https://YOUR_DOMAIN.auth0.com'
AUTH0_CLIENT_ID='YOUR_CLIENT_ID'
AUTH0_CLIENT_SECRET='YOUR_CLIENT_SECRET'
AUTH0_AUDIENCE='https://api.yourapp.com'
AUTH0_SCOPE='openid profile email offline_access'
---
Route Handler : /api/auth/[auth0]
Ici, nous mettons en place le gestionnaire de routes Auth0 pour toutes les actions liées à l’authentification (login, logout, callback, profil).
// app/api/auth/[auth0]/route.ts
import { handleAuth } from '@auth0/nextjs-auth0';
export const GET = handleAuth();
// Gère automatiquement : /api/auth/login, /api/auth/callback, /api/auth/logout, /api/auth/me
---
Middleware : protéger des routes
Ce middleware vérifie automatiquement que l'utilisateur est authentifié avant d'accéder aux pages ou APIs sensibles.
// middleware.ts
import { withMiddlewareAuthRequired } from '@auth0/nextjs-auth0/edge';
export default withMiddlewareAuthRequired();
export const config = {
matcher: [
'/dashboard/:path*',
'/settings/:path*',
'/api/protected/:path*',
],
};
---
Server Component : afficher l'utilisateur
Ce composant serveur affiche le profil utilisateur Auth0 connecté ou redirige vers la page de login si l'utilisateur n'est pas authentifié.
// app/dashboard/page.tsx
import { getSession } from '@auth0/nextjs-auth0';
import { redirect } from 'next/navigation';
export default async function DashboardPage() {
const session = await getSession();
if (!session) {
redirect('/api/auth/login');
}
const { user } = session;
return (
<div>
<h1>Bienvenue, {user.name}</h1>
<img src={user.picture} alt={user.name} />
<p>Email: {user.email}</p>
</div>
);
}
Ce composant sécurise la page dashboard et affiche les informations de l'utilisateur Auth0.
---
Appeler une API depuis un Server Component
Voici comment obtenir un accessToken côté serveur et appeler une API externe sécurisée depuis un Server Component Next.js.
// app/dashboard/data/page.tsx
import { getAccessToken } from '@auth0/nextjs-auth0';
export default async function DataPage() {
const { accessToken } = await getAccessToken();
const data = await fetch('https://api.yourapp.com/data', {
headers: { Authorization: `Bearer ${accessToken}` },
cache: 'no-store', // SSR : toujours frais
}).then(r => r.json());
return <DataDisplay data={data} />;
}
Cette approche permet de sécuriser vos échanges API avec un token Auth0 et d’afficher le résultat côté serveur.
---
Route API protégée
Cette API sécurisée côté serveur valide le plan de l'utilisateur via les claims Auth0 avant d'autoriser l'accès aux données.
// app/api/protected/data/route.ts
import { withApiAuthRequired, getSession } from '@auth0/nextjs-auth0';
import { NextResponse } from 'next/server';
export const GET = withApiAuthRequired(async function handler(request) {
const session = await getSession();
const user = session!.user;
// Vérifier le plan depuis les custom claims
const plan = user['https://yourapp.com/plan'];
if (plan !== 'pro' && plan !== 'enterprise') {
return NextResponse.json(
{ error: 'Pro plan required' },
{ status: 403 }
);
}
const data = await fetchUserData(user.sub);
return NextResponse.json(data);
});
Ce code protège l’API par Auth0 et filtre l’accès en fonction des droits utilisateur personnalisés.
---
Client Component : hook useUser
Ce composant React côté client permet d'afficher dynamiquement les infos de l'utilisateur Auth0 ou de proposer la connexion.
// components/UserMenu.tsx
'use client';
import { useUser } from '@auth0/nextjs-auth0/client';
export default function UserMenu() {
const { user, isLoading, error } = useUser();
if (isLoading) return <Skeleton />;
if (error) return <div>Erreur: {error.message}</div>;
if (!user) {
return <a href="/api/auth/login">Se connecter</a>;
}
return (
<div>
<span>{user.name}</span>
<a href="/api/auth/logout">Se déconnecter</a>
</div>
);
}
---
UserProvider pour les Client Components
Ce wrapper React fournit le contexte utilisateur Auth0 à tous les composants enfants côté client.
// app/layout.tsx
import { UserProvider } from '@auth0/nextjs-auth0/client';
export default function RootLayout({ children }) {
return (
<html lang="fr">
<body>
<UserProvider>
{children}
</UserProvider>
</body>
</html>
);
}
---
Personnaliser le login avec afterCallback
Ici, vous pouvez enrichir la session utilisateur Auth0 avec des données provenant de votre base de données lors du callback.
// app/api/auth/[auth0]/route.ts
import { handleAuth, handleCallback } from '@auth0/nextjs-auth0';
export const GET = handleAuth({
callback: handleCallback({
afterCallback: async (req, session) => {
// Enrichir la session après le callback
// session.user contient le profil Auth0
const userData = await fetchUserFromDB(session.user.sub);
return {
...session,
user: {
...session.user,
db_id: userData.id,
subscription: userData.subscription,
},
};
},
}),
});
Ce code ajoute dynamiquement des attributs personnalisés au profil utilisateur stocké en session lors du login.
---
Refresh automatique des tokens
Voici comment gérer l’actualisation automatique des tokens d’accès via la configuration de session Auth0.
// next.config.js
module.exports = {
// Le SDK gère automatiquement le refresh via les sessions côté serveur
// Configurer la durée de vie des sessions :
// AUTH0_SESSION_ROLLING_DURATION=86400 (1 jour)
// AUTH0_SESSION_ABSOLUTE_DURATION=604800 (7 jours)
};
---
> ⚡ Auth0 + Next.js : nos équipes livrent des applications Next.js 14 avec Auth0 intégré, SSR, ISR et protection complète des routes en 1 à 2 semaines.
Autres articles
- Auth0 et OAuth 2.0 : architecture complète pour comprendre les flux d'autorisation
- OpenID Connect sur Auth0 : ID Token, UserInfo et discovery endpoint expliqués
- Configurer SAML 2.0 avec Auth0 : guide complet pour l'entreprise
- Migrer des Rules vers les Auth0 Actions : guide pas à pas
- Architecture multi-tenant avec Auth0 : organisations, isolation et bonnes pratiques
- Validation des JWT Auth0 : RS256 vs HS256, JWKS et pièges communs
- Concevoir son architecture de tenants Auth0 : dev, staging, prod
- Configurer un domaine personnalisé Auth0 : login.votredomaine.com étape par étape