5.0 KiB
5.0 KiB
Migration vers NextAuth v5 - Résumé
Changements effectués
1. Installation
- ✅ Installé
next-auth@5.0.0-beta.29
2. Configuration NextAuth
-
✅ Créé
auth.tsà la racine avec:- Credentials provider utilisant
userService.verifyCredentials() - Stratégie JWT
- Callbacks pour enrichir la session avec
userId,teamId,firstName,lastName - Pages custom (
/login) - Middleware callback
authorizedpour protéger les routes
- Credentials provider utilisant
-
✅ Créé
app/api/auth/[...nextauth]/route.tspour les handlers NextAuth -
✅ Créé
types/next-auth.d.tspour étendre les types Session et User
3. Middleware
- ✅ Remplacé le middleware custom par
export { auth as middleware } from "@/auth" - ✅ Les redirections sont gérées dans le callback
authorized
4. Routes API
- ✅ Supprimé
app/api/auth/login/route.ts(géré par NextAuth) - ✅ Supprimé
app/api/auth/logout/route.ts(géré par NextAuth) - ✅ Supprimé
app/api/auth/profile/route.ts(utiliseruseSession()côté client) - ✅ Adapté
app/api/auth/register/route.tspour retourner les infos sans créer de session - ✅ Mis à jour toutes les routes protégées pour utiliser
auth()au lieu deAuthService.requireAuthenticatedUser()
5. Services
- ✅ Supprimé
services/auth-service.ts(remplacé par NextAuth) - ✅ Mis à jour
services/evaluation-service.tspour ne plus utiliserAuthService - ✅ Mis à jour
services/index.tspour retirer l'export d'AuthService
6. Clients
- ✅ Mis à jour
clients/domains/auth-client.tspour utiliser:signIn("credentials")pour le loginsignOut()pour le logout- Auto-login après register avec
signIn()
7. Frontend
- ✅ Créé
components/auth/session-provider.tsx - ✅ Wrapped l'application avec
<SessionProvider>dansapp/layout.tsx - ✅ Mis à jour tous les composants pour utiliser la session NextAuth
- ✅ Mis à jour toutes les pages serveur pour utiliser
auth()au lieu deAuthService
Configuration requise
Variables d'environnement
Créer un fichier .env.local avec:
# Générer un secret avec: openssl rand -base64 32
AUTH_SECRET=your-generated-secret-here
# Pour la production
# AUTH_URL=https://your-domain.com
Pour générer AUTH_SECRET
openssl rand -base64 32
Utilisation
Côté serveur (Server Components, API Routes)
import { auth } from "@/auth";
export default async function Page() {
const session = await auth();
if (!session?.user) {
redirect("/login");
}
const userId = session.user.id;
const teamId = session.user.teamId;
const firstName = session.user.firstName;
// ...
}
Côté client (Client Components)
"use client";
import { useSession } from "next-auth/react";
import { signIn, signOut } from "next-auth/react";
export function MyComponent() {
const { data: session, status } = useSession();
if (status === "loading") return <div>Loading...</div>;
if (!session) return <div>Not authenticated</div>;
return (
<div>
<p>Welcome {session.user.firstName}!</p>
<button onClick={() => signOut()}>Logout</button>
</div>
);
}
Login/Register
// Login
const result = await signIn("credentials", {
email,
password,
redirect: false,
});
if (result?.error) {
// Handle error
}
// Register (via API puis auto-login)
const response = await fetch("/api/auth/register", {
method: "POST",
body: JSON.stringify(data),
});
if (response.ok) {
await signIn("credentials", { email, password, redirect: false });
}
// Logout
await signOut({ redirect: false });
Compatibilité
Utilisateurs existants
✅ Tous les utilisateurs existants sont compatibles car:
- La table
userscontient déjàemailetpassword_hash - La méthode
userService.verifyCredentials()vérifie les mots de passe hashés avec bcrypt - Les UUID sont préservés
Sessions
- ⚠️ Les anciennes sessions (cookie
session_token) ne sont plus valides - Les utilisateurs devront se reconnecter une fois
- NextAuth utilise ses propres cookies de session
Testing
Vérifications à faire
- ✅ Login avec email/password
- ✅ Logout
- ✅ Register puis auto-login
- ✅ Routes protégées redirigent vers /login si non authentifié
- ✅ /login redirige vers / si déjà authentifié
- ✅ Les évaluations fonctionnent correctement
- ✅ Les pages admin fonctionnent correctement
Rollback (si nécessaire)
Si des problèmes surviennent, voici les commits importants:
- Installation de NextAuth
- Création de auth.ts et configuration
- Mise à jour des routes et services
- Suppression de auth-service.ts
Pour rollback: git revert <commit-hash> des commits concernés.
Notes
- NextAuth v5 utilise des cookies signés et sécurisés automatiquement
- Les sessions JWT sont stateless (pas de stockage en base)
- La configuration
authorizeddans auth.ts gère toute la logique de protection des routes - Le SessionProvider doit wrapper toute l'application pour que
useSession()fonctionne