175 lines
5.0 KiB
Markdown
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
|
|
|