La autenticación de La Palabra se basa en un esquema dual-token JWT: un access token de corta duración (8 horas) para autenticar cada request, y un refresh token de larga duración (7 días) para renovarlo de forma transparente sin obligar al usuario a volver a iniciar sesión. Ambos tokens se generan al hacer login y se almacenan en elDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/camiloivcode/biblioteca-la-palabra/llms.txt
Use this file to discover all available pages before exploring further.
localStorage del navegador. El cliente api.js gestiona el refresco automático: al recibir un 401, intenta renovar el access token antes de reintentar la petición original.
Tokens
| Tipo de token | Variable de entorno | Expiración | Almacenamiento |
|---|---|---|---|
| Access token | JWT_SECRET | 8h | localStorage |
| Refresh token | JWT_REFRESH_SECRET | 7d | localStorage |
JWT_EXPIRES_IN y JWT_REFRESH_EXPIRES_IN respectivamente. La configuración se centraliza en backend/src/config/jwt.config.js:
Flujo de autenticación
Login inicial
El cliente envía
POST /api/auth/login con { email, password }. Si las credenciales son válidas, la API responde con { accessToken, refreshToken, user }.Almacenamiento de tokens
El frontend guarda
accessToken, refreshToken y los datos de user en localStorage del navegador.Requests autenticadas
Cada llamada a la API incluye el access token en el encabezado HTTP:
Authorization: Bearer <accessToken>. El cliente api.js lo adjunta automáticamente leyendo localStorage.getItem('accessToken').Detección de token expirado
Si el servidor responde con HTTP
401, el cliente api.js intercepta el error e intenta renovar el access token llamando a POST /api/auth/refresh con el refreshToken almacenado.Renovación exitosa
Si el refresh endpoint responde con
{ success: true, data: { accessToken } }, el cliente reemplaza el token en localStorage y reintenta la petición original con el nuevo access token, de forma completamente transparente para el usuario.Middleware de autenticación
auth.middleware.js protege todas las rutas que requieren un usuario autenticado. Su funcionamiento es el siguiente:
- Lee el encabezado
Authorizationy extrae el token del esquemaBearer. - Verifica la firma y la expiración del JWT usando
jwt.verify()con el secreto configurado. - Si el token es válido, busca al usuario en la base de datos para confirmar que existe y está activo.
- Adjunta el objeto de usuario (
id,nombre,email,role,activo) enreq.userpara que los controllers y servicios posteriores puedan usarlo.
Control de roles
role.middleware.js complementa a auth.middleware.js restringiendo el acceso a rutas específicas según el rol del usuario autenticado. Se usa principalmente para proteger la gestión de usuarios del sistema (/api/users), que solo puede ser administrada por un ADMIN.
El middleware es una función de orden superior que recibe una lista de roles permitidos y devuelve el handler correspondiente:
authMiddleware:
403 Forbidden.
Recuperación de contraseña
El sistema implementa un flujo completo de recuperación de contraseña por correo electrónico mediante Nodemailer:Solicitar recuperación
El usuario envía
POST /api/auth/forgot-password con su email. El backend genera un token seguro aleatorio (32 bytes hex, almacenado como hash SHA-256), lo guarda en los campos passwordResetToken y passwordResetExpires del modelo User con una expiración de 1 hora, y envía un correo con el enlace de recuperación.Restablecer contraseña
El usuario hace clic en el enlace recibido por correo, que lo lleva a la página
/reset-password con el token como parámetro. El frontend envía POST /api/auth/reset-password con el token y la nueva contraseña. El backend valida el token, comprueba que passwordResetExpires no haya vencido (ventana de 1 hora), y actualiza la contraseña del usuario con el hash bcrypt correspondiente.Solicitud de registro
Dado que los usuarios del sistema (bibliotecarios) son creados por el administrador, el sistema provee un flujo de solicitud de registro en lugar de auto-registro directo:POST /api/auth/register-requestrecibe los datos del aspirante y envía una notificación por correo electrónico al administrador con la información del solicitante.- No se crea ninguna cuenta en este paso. El administrador debe aprobar la solicitud y crear el usuario manualmente desde el panel de gestión de usuarios.