Files
peakskills/NEXTAUTH_MIGRATION.md

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 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:

# 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 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