1Agregar JWT_REFRESH_SECRET a .env.local
Archivo:.env.local
Tipo:Fix de configuración (dependencias primero)
Cambio:Añadido JWT_REFRESH_SECRET=leadflowai_refresh_secret_dev_only
Test:✓ auth.test.ts:refreshToken → PASA
2Reescribir signToken() para jose v5 API
Archivo:auth/service.ts:23
Issue:API incompatible jsonwebtoken → jose v5
- const token = sign(payload, secret, { expiresIn });
- return token;
+ const secretKey = new TextEncoder().encode(secret);
+ const token = await new SignJWT(payload)
+ .setProtectedHeader({ alg: 'HS256' })
+ .setIssuedAt()
+ .setExpirationTime(expiresIn)
+ .sign(secretKey);
+ return token;
Test:✓ should sign JWT correctly → PASA
3Corregir verifyToken() para extraer payload correctamente
Archivo:auth/service.ts:67
Issue:Retornaba JWTVerifyResult completo en lugar de result.payload
- const result = await jwtVerify(token, secretKey);
- return result as JWTPayload;
+ const { payload } = await jwtVerify(token, secretKey);
+ return payload as JWTPayload;
Test:✓ should verify valid token → PASA · middleware should pass valid token → PASA
4Añadir campo role a UserResponse en types.ts
Archivo:auth/types.ts:8
Issue:Tipo desincronizado con schema Prisma
export interface UserResponse {
id: string;
email: string;
+ role: 'admin' | 'user' | 'viewer';
createdAt: Date;
}
Test:✓ token payload should include role → PASA
5Añadir try/catch a getUserByEmail en repository.ts
Archivo:auth/repository.ts:45
Issue:Excepción Prisma sin capturar en fallo de conexión
Test:✓ repository error handling → PASA
6Subir bcrypt rounds de 8 a 12 (OWASP 2024)
Archivo:auth/helpers.ts:12
Issue:Rounds insuficientes, hardcodeados — ahora leen BCRYPT_ROUNDS del env (default 12)
Test:✓ password hashing → PASA
7Actualizar mocks de Vitest para API jose v5
Archivo:auth/__tests__/auth.test.ts:89
Issue:vi.mock('jose') usaba API de jsonwebtoken
Test:✓ Todos los mocks actualizados — 6/6 tests previamente fallidos → PASAN