refactor: review cookie code for auth

This commit is contained in:
Julien Froidefond
2025-08-28 12:07:35 +02:00
parent 725a368b7e
commit 117ac243f5
4 changed files with 34 additions and 84 deletions

View File

@@ -1,6 +1,7 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { AuthService, UserService } from "@/services"; import { AuthService, UserService } from "@/services";
export async function POST(request: NextRequest) { export async function POST(request: NextRequest) {
try { try {
const { email, password } = await request.json(); 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 // Créer la réponse avec le cookie de session
const response = NextResponse.json( const response = NextResponse.json(
{ {
@@ -42,14 +40,8 @@ export async function POST(request: NextRequest) {
{ status: 200 } { status: 200 }
); );
// Définir le cookie de session // Créer la session et définir le cookie
response.cookies.set("session_token", sessionToken, { await AuthService.createSession(user.uuid_id, response);
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "lax",
maxAge: 60 * 60 * 24 * 7, // 7 jours
path: "/",
});
return response; return response;
} catch (error) { } catch (error) {

View File

@@ -1,4 +1,6 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { AuthService } from "@/services";
export async function POST() { export async function POST() {
try { try {
@@ -8,14 +10,8 @@ export async function POST() {
{ status: 200 } { status: 200 }
); );
// Supprimer le cookie de session // Supprimer la session et le cookie
response.cookies.set("session_token", "", { AuthService.removeSession(response);
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "lax",
maxAge: 0, // Expire immédiatement
path: "/",
});
return response; return response;
} catch (error) { } catch (error) {

View File

@@ -1,5 +1,6 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { AuthService, userService } from "@/services"; import { AuthService, userService } from "@/services";
import bcrypt from "bcryptjs"; import bcrypt from "bcryptjs";
export async function POST(request: NextRequest) { 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 // Créer la réponse avec le cookie de session
const response = NextResponse.json( const response = NextResponse.json(
{ {
@@ -62,14 +60,8 @@ export async function POST(request: NextRequest) {
{ status: 201 } { status: 201 }
); );
// Définir le cookie de session // Créer la session et définir le cookie
response.cookies.set("session_token", sessionToken, { await AuthService.createSession(newUser.uuid_id, response);
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "lax",
maxAge: 60 * 60 * 24 * 7, // 7 jours
path: "/",
});
return response; return response;
} catch (error) { } catch (error) {

View File

@@ -1,10 +1,17 @@
import { cookies } from "next/headers"; import { cookies } from "next/headers";
import { NextResponse } from "next/server";
import { UserProfile } from "@/lib/types"; import { UserProfile } from "@/lib/types";
import { userService } from "@/services/user-service"; import { userService } from "@/services/user-service";
// Constantes pour les cookies export const COOKIE_NAME = "session_token" as const;
export const COOKIE_NAME = "session_token";
export const COOKIE_MAX_AGE = 30 * 24 * 60 * 60; // 30 jours 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 * Service d'authentification côté serveur
@@ -17,12 +24,7 @@ export class AuthService {
static async getUserUuidFromCookie(): Promise<string | null> { static async getUserUuidFromCookie(): Promise<string | null> {
const cookieStore = await cookies(); const cookieStore = await cookies();
const userUuidCookie = cookieStore.get(COOKIE_NAME); const userUuidCookie = cookieStore.get(COOKIE_NAME);
return userUuidCookie?.value || null;
if (!userUuidCookie?.value) {
return null;
}
return userUuidCookie.value;
} }
/** /**
@@ -59,57 +61,25 @@ export class AuthService {
return { userUuid, userProfile }; return { userUuid, userProfile };
} }
/** /**
* Authentifie un utilisateur et retourne la configuration du cookie * Crée une nouvelle session pour un utilisateur et retourne la réponse avec le cookie
* Note: Cette méthode est maintenant obsolète avec le nouveau système d'auth
* Utilisez login/register à la place
*/ */
static async authenticateUser(profile: UserProfile): Promise<{ static async createSession(userUuid: string, response: NextResponse): Promise<NextResponse> {
userUuid: string; // Pour l'instant, on utilise l'UUID comme token de session
cookieConfig: { // Plus tard, on pourra implémenter un système de JWT ou de sessions en base
name: string; const sessionToken = userUuid;
value: string; response.cookies.set(COOKIE_NAME, sessionToken, COOKIE_CONFIG);
options: { return response;
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: "/",
},
},
};
} }
/** /**
* 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<string> { static removeSession(response: NextResponse): NextResponse {
// Pour l'instant, on utilise l'UUID comme token de session response.cookies.set(COOKIE_NAME, "", { ...COOKIE_CONFIG, maxAge: 0 });
// Plus tard, on pourra implémenter un système de JWT ou de sessions en base return response;
return userUuid;
} }
/** /**