ce7063514c
Revisión con IA / ai-review (pull_request) Successful in 24s
- verificarSesion acepta el rol esperado. Las tres sesiones (admin, cliente, jefe) se firman con el mismo secreto, asi que un token de jefe puesto en la cookie cliente_session pasaba la verificacion de firma; ahora el rol se comprueba. Verificado: con un JWT de jefe, /api/cliente/perfil da 401. - El update traduce el P2002 de los indices unicos a un 409 legible, por si otra request toma el mismo email o telefono entre la comprobacion y el update. - La pantalla ya no queda en "Cargando..." para siempre si falla el pedido. - Si la sesion vence mientras edita, el PATCH manda a entrar de nuevo en vez de mostrar un error suelto. Queda como mejora aparte pasarle el rol esperado al resto de las rutas del area del cliente, que hoy solo validan la firma. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
import { cookies } from "next/headers";
|
|
import { SignJWT, jwtVerify } from "jose";
|
|
|
|
const SECRET = new TextEncoder().encode(process.env.NEXTAUTH_SECRET || "dev-secret");
|
|
|
|
export async function crearSesionAdmin(adminId: string): Promise<string> {
|
|
const token = await new SignJWT({ sub: adminId, role: "admin" })
|
|
.setProtectedHeader({ alg: "HS256" })
|
|
.setExpirationTime("8h")
|
|
.sign(SECRET);
|
|
return token;
|
|
}
|
|
|
|
export async function crearSesionCliente(clienteId: string): Promise<string> {
|
|
const token = await new SignJWT({ sub: clienteId, role: "cliente" })
|
|
.setProtectedHeader({ alg: "HS256" })
|
|
.setExpirationTime("24h")
|
|
.sign(SECRET);
|
|
return token;
|
|
}
|
|
|
|
export async function crearSesionJefe(jefeId: string): Promise<string> {
|
|
const token = await new SignJWT({ sub: jefeId, role: "jefe" })
|
|
.setProtectedHeader({ alg: "HS256" })
|
|
.setExpirationTime("8h")
|
|
.sign(SECRET);
|
|
return token;
|
|
}
|
|
|
|
export async function verificarSesion(
|
|
cookieName: string,
|
|
rolEsperado?: "admin" | "cliente" | "jefe"
|
|
): Promise<{ sub: string; role: string } | null> {
|
|
const cookieStore = await cookies();
|
|
const token = cookieStore.get(cookieName)?.value;
|
|
if (!token) return null;
|
|
try {
|
|
const { payload } = await jwtVerify(token, SECRET);
|
|
const sesion = payload as { sub: string; role: string };
|
|
// Los tres tipos de sesión se firman con el mismo secreto, así que un token de
|
|
// admin o de jefe puesto en la cookie del cliente pasa la verificación de firma.
|
|
// Cuando el rol importa, se comprueba acá.
|
|
if (rolEsperado && sesion.role !== rolEsperado) return null;
|
|
return sesion;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|