From 117ac243f5d5c1861732b2d3c346d333ab138949 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 28 Aug 2025 12:07:35 +0200 Subject: [PATCH] refactor: review cookie code for auth --- app/api/auth/login/route.ts | 14 ++---- app/api/auth/logout/route.ts | 12 ++---- app/api/auth/register/route.ts | 14 ++---- services/auth-service.ts | 78 +++++++++++----------------------- 4 files changed, 34 insertions(+), 84 deletions(-) diff --git a/app/api/auth/login/route.ts b/app/api/auth/login/route.ts index a69d4f6..05369ae 100644 --- a/app/api/auth/login/route.ts +++ b/app/api/auth/login/route.ts @@ -1,6 +1,7 @@ import { NextRequest, NextResponse } from "next/server"; import { AuthService, UserService } from "@/services"; + export async function POST(request: NextRequest) { try { const { email, password } = await request.json(); @@ -24,9 +25,6 @@ export async function POST(request: NextRequest) { ); } - // Générer un token de session - const sessionToken = await AuthService.createSession(user.uuid_id); - // Créer la réponse avec le cookie de session const response = NextResponse.json( { @@ -42,14 +40,8 @@ export async function POST(request: NextRequest) { { status: 200 } ); - // Définir le cookie de session - response.cookies.set("session_token", sessionToken, { - httpOnly: true, - secure: process.env.NODE_ENV === "production", - sameSite: "lax", - maxAge: 60 * 60 * 24 * 7, // 7 jours - path: "/", - }); + // Créer la session et définir le cookie + await AuthService.createSession(user.uuid_id, response); return response; } catch (error) { diff --git a/app/api/auth/logout/route.ts b/app/api/auth/logout/route.ts index 0330a98..d1fe202 100644 --- a/app/api/auth/logout/route.ts +++ b/app/api/auth/logout/route.ts @@ -1,4 +1,6 @@ import { NextResponse } from "next/server"; +import { AuthService } from "@/services"; + export async function POST() { try { @@ -8,14 +10,8 @@ export async function POST() { { status: 200 } ); - // Supprimer le cookie de session - response.cookies.set("session_token", "", { - httpOnly: true, - secure: process.env.NODE_ENV === "production", - sameSite: "lax", - maxAge: 0, // Expire immédiatement - path: "/", - }); + // Supprimer la session et le cookie + AuthService.removeSession(response); return response; } catch (error) { diff --git a/app/api/auth/register/route.ts b/app/api/auth/register/route.ts index 782efe3..0f1bd8d 100644 --- a/app/api/auth/register/route.ts +++ b/app/api/auth/register/route.ts @@ -1,5 +1,6 @@ import { NextRequest, NextResponse } from "next/server"; import { AuthService, userService } from "@/services"; + import bcrypt from "bcryptjs"; export async function POST(request: NextRequest) { @@ -44,9 +45,6 @@ export async function POST(request: NextRequest) { ); } - // Générer un token de session - const sessionToken = await AuthService.createSession(newUser.uuid_id); - // Créer la réponse avec le cookie de session const response = NextResponse.json( { @@ -62,14 +60,8 @@ export async function POST(request: NextRequest) { { status: 201 } ); - // Définir le cookie de session - response.cookies.set("session_token", sessionToken, { - httpOnly: true, - secure: process.env.NODE_ENV === "production", - sameSite: "lax", - maxAge: 60 * 60 * 24 * 7, // 7 jours - path: "/", - }); + // Créer la session et définir le cookie + await AuthService.createSession(newUser.uuid_id, response); return response; } catch (error) { diff --git a/services/auth-service.ts b/services/auth-service.ts index 1e30e77..32ebd0f 100644 --- a/services/auth-service.ts +++ b/services/auth-service.ts @@ -1,10 +1,17 @@ import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; import { UserProfile } from "@/lib/types"; import { userService } from "@/services/user-service"; -// Constantes pour les cookies -export const COOKIE_NAME = "session_token"; -export const COOKIE_MAX_AGE = 30 * 24 * 60 * 60; // 30 jours +export const COOKIE_NAME = "session_token" as const; + +export const COOKIE_CONFIG = { + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "lax" as const, + maxAge: 60 * 60 * 24 * 7, // 7 jours + path: "/", +} as const; /** * Service d'authentification côté serveur @@ -17,12 +24,7 @@ export class AuthService { static async getUserUuidFromCookie(): Promise { const cookieStore = await cookies(); const userUuidCookie = cookieStore.get(COOKIE_NAME); - - if (!userUuidCookie?.value) { - return null; - } - - return userUuidCookie.value; + return userUuidCookie?.value || null; } /** @@ -59,57 +61,25 @@ export class AuthService { return { userUuid, userProfile }; } + + /** - * Authentifie un utilisateur et retourne la configuration du cookie - * Note: Cette méthode est maintenant obsolète avec le nouveau système d'auth - * Utilisez login/register à la place + * Crée une nouvelle session pour un utilisateur et retourne la réponse avec le cookie */ - static async authenticateUser(profile: UserProfile): Promise<{ - userUuid: string; - cookieConfig: { - name: string; - value: string; - options: { - maxAge: number; - httpOnly: boolean; - secure: boolean; - sameSite: "lax" | "strict" | "none"; - path: string; - }; - }; - }> { - // Vérifier si l'utilisateur existe déjà avec ces informations - const existingUser = await userService.findUserByProfile(profile); - - if (!existingUser) { - throw new Error( - "Utilisateur non trouvé. Veuillez vous connecter avec votre email et mot de passe." - ); - } - - return { - userUuid: existingUser.uuid, - cookieConfig: { - name: COOKIE_NAME, - value: existingUser.uuid, - options: { - maxAge: COOKIE_MAX_AGE, - httpOnly: true, - secure: process.env.NODE_ENV === "production", - sameSite: "lax", - path: "/", - }, - }, - }; + static async createSession(userUuid: string, response: NextResponse): Promise { + // Pour l'instant, on utilise l'UUID comme token de session + // Plus tard, on pourra implémenter un système de JWT ou de sessions en base + const sessionToken = userUuid; + response.cookies.set(COOKIE_NAME, sessionToken, COOKIE_CONFIG); + return response; } /** - * Crée une nouvelle session pour un utilisateur + * Supprime la session et retourne la réponse avec le cookie expiré */ - static async createSession(userUuid: string): Promise { - // Pour l'instant, on utilise l'UUID comme token de session - // Plus tard, on pourra implémenter un système de JWT ou de sessions en base - return userUuid; + static removeSession(response: NextResponse): NextResponse { + response.cookies.set(COOKIE_NAME, "", { ...COOKIE_CONFIG, maxAge: 0 }); + return response; } /**