Files
taller_automotriz/src/lib/auth-admin.ts
T
Beldor ce7063514c
Revisión con IA / ai-review (pull_request) Successful in 24s
fix(perfil): detalles senalados en la revision
- 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>
2026-08-05 16:09:40 -03:00

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;
}
}