Autenticación con JWT
Usamos JSON Web Tokens (JWT) para autenticación. Cuando un usuario se loguea con email y contraseña, el servidor verifica las credenciales, genera un token firmado con una clave secreta y lo devuelve al cliente.
El token contiene: el ID del usuario, su rol, y el tenant al que pertenece. Esa información está codificada en el payload del JWT y firmada criptográficamente — no puede modificarse sin que la firma quede inválida.
En cada request subsiguiente, el cliente incluye el token en el header `Authorization: Bearer <token>`. El middleware de autenticación verifica la firma, extrae el payload, y pone la información del usuario en `req.user`. Si el token es inválido, está expirado o está malformado, el request se rechaza con 401.
Ventajas de JWT sobre sesiones clásicas: los tokens son stateless — el servidor no necesita almacenar estado de sesión. Escalan horizontalmente sin infraestructura de sesiones compartida. La expiración está en el token mismo.
El costo: si un token es robado antes de expirar, es válido hasta que expire. Lo mitigamos con tiempos de expiración cortos (7 días por defecto) y sin refresh tokens de larga duración.