refactor: review cookie code for auth
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
|
||||||
* 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<{
|
|
||||||
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: "/",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Crée une nouvelle session pour un utilisateur
|
* Crée une nouvelle session pour un utilisateur et retourne la réponse avec le cookie
|
||||||
*/
|
*/
|
||||||
static async createSession(userUuid: string): Promise<string> {
|
static async createSession(userUuid: string, response: NextResponse): Promise<NextResponse> {
|
||||||
// Pour l'instant, on utilise l'UUID comme token de session
|
// 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
|
// Plus tard, on pourra implémenter un système de JWT ou de sessions en base
|
||||||
return userUuid;
|
const sessionToken = userUuid;
|
||||||
|
response.cookies.set(COOKIE_NAME, sessionToken, COOKIE_CONFIG);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supprime la session et retourne la réponse avec le cookie expiré
|
||||||
|
*/
|
||||||
|
static removeSession(response: NextResponse): NextResponse {
|
||||||
|
response.cookies.set(COOKIE_NAME, "", { ...COOKIE_CONFIG, maxAge: 0 });
|
||||||
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user