refactor: migrate authentication to NextAuth and clean up related services
This commit is contained in:
174
NEXTAUTH_MIGRATION.md
Normal file
174
NEXTAUTH_MIGRATION.md
Normal file
@@ -0,0 +1,174 @@
|
||||
# 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
|
||||
|
||||
Reference in New Issue
Block a user