Files
peakskills/NEXTAUTH_MIGRATION.md

175 lines
5.0 KiB
Markdown

# 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 `authorized` pour protéger les routes
- ✅ Créé `app/api/auth/[...nextauth]/route.ts` pour les handlers NextAuth
- ✅ Créé `types/next-auth.d.ts` pour é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` (utiliser `useSession()` côté client)
- ✅ Adapté `app/api/auth/register/route.ts` pour retourner les infos sans créer de session
- ✅ Mis à jour toutes les routes protégées pour utiliser `auth()` au lieu de `AuthService.requireAuthenticatedUser()`
### 5. Services
- ✅ Supprimé `services/auth-service.ts` (remplacé par NextAuth)
- ✅ Mis à jour `services/evaluation-service.ts` pour ne plus utiliser `AuthService`
- ✅ Mis à jour `services/index.ts` pour retirer l'export d'AuthService
### 6. Clients
- ✅ Mis à jour `clients/domains/auth-client.ts` pour utiliser:
- `signIn("credentials")` pour le login
- `signOut()` pour le logout
- Auto-login après register avec `signIn()`
### 7. Frontend
- ✅ Créé `components/auth/session-provider.tsx`
- ✅ Wrapped l'application avec `<SessionProvider>` dans `app/layout.tsx`
- ✅ Mis à jour tous les composants pour utiliser la session NextAuth
- ✅ Mis à jour toutes les pages serveur pour utiliser `auth()` au lieu de `AuthService`
## Configuration requise
### Variables d'environnement
Créer un fichier `.env.local` avec:
```bash
# 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
```bash
openssl rand -base64 32
```
## Utilisation
### Côté serveur (Server Components, API Routes)
```typescript
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)
```typescript
"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
```typescript
// 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 `users` contient déjà `email` et `password_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
1. ✅ Login avec email/password
2. ✅ Logout
3. ✅ Register puis auto-login
4. ✅ Routes protégées redirigent vers /login si non authentifié
5. ✅ /login redirige vers / si déjà authentifié
6. ✅ Les évaluations fonctionnent correctement
7. ✅ 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 `authorized` dans auth.ts gère toute la logique de protection des routes
- Le SessionProvider doit wrapper toute l'application pour que `useSession()` fonctionne