5.8 KiB
06 — Flujo de Autenticación con Doble Factor (2FA / OTP)
Contrato de negocio y reglas de seguridad para el inicio de sesión seguro
Propósito: Esta guía define las reglas de negocio estrictas, los límites de intentos, la validación de campos y el flujo de estados necesarios para implementar el inicio de sesión seguro con Segundo Factor de Autenticación (M2FA / SoftToken).
1. El Flujo de Estados del Login 2FA
El proceso de autenticación consta de dos fases transaccionales para evitar la exposición de credenciales y asegurar que solo dispositivos autorizados completen el acceso.
[POST /api/auth/login]
(userName, password, softToken?)
│
┌─────────────┴─────────────┐
▼ ▼
(Sin SoftToken) (Con SoftToken)
¿Requiere 2FA? ¿Token Válido?
┌───────┴───────┐ ┌───────┴───────┐
▼ ▼ ▼ ▼
[SÍ] [NO] [SÍ] [NO]
Retornar 2FA Login Exitoso Establecer Incrementar
Requerido (401) Establecer Cookies JWT Intento 2FA
Cookies JWT y retornar OK (Máx 3)
2. Reglas de Validación de Entrada
Antes de realizar la llamada al servicio de autenticación, el Route Handler local de Next.js debe validar estrictamente los campos en el servidor:
2.1 Nombre de Usuario (userName):
- Obligatoriedad: Requerido. Si está vacío: retornar código
USERNAME_REQUIREDcon el mensaje:"Este campo es obligatorio"(Status400). - Longitud Mínima: 6 caracteres. Si es menor: retornar código
USERNAME_TOO_SHORTcon el mensaje:"Debe ser mayor o igual a seis caracteres"(Status400). - Longitud Máxima: 12 caracteres. Si es mayor: retornar código
USERNAME_TOO_LONGcon el mensaje:"El sistema solo debe permitir ingresar 12 caracteres"(Status400).
2.2 Contraseña (password):
- Obligatoriedad: Requerido. Si está vacío: retornar código
PASSWORD_REQUIREDcon el mensaje:"Este campo es obligatorio"(Status400).
2.3 Código OTP / SoftToken (softToken):
- Obligatoriedad: Requerido únicamente en la segunda fase del flujo (cuando se envía junto al usuario y clave). Si está vacío en la fase 2: retornar código
TOKEN_REQUIREDcon el mensaje:"Este campo es obligatorio"(Status400).
3. Control de Intentos y Bloqueos de Usuario
Para proteger el sistema contra ataques de fuerza bruta, el Route Handler debe llevar un control estricto de intentos fallidos en memoria y aplicar las siguientes penalizaciones:
3.1 Control de Intentos de Contraseña (Fase 1)
- Límite Máximo: 3 intentos fallidos de clave.
- Acción al llegar al límite: El estado del usuario pasa a
suspendido. - Mensaje de Error:
- Intentos < 3:
"Usuario o Clave Inválida"(Status401). - Intentos = 3:
"Tu usuario ha sido suspendido. Ingresa en la opción Autogestión de Usuario"(Status403).
- Intentos < 3:
3.2 Control de Intentos de Código OTP / SoftToken (Fase 2)
- Límite Máximo: 3 intentos fallidos de token.
- Acción al llegar al límite: El estado del usuario pasa a
bloqueadode forma definitiva en la base de datos y se dispara la alerta de seguridad interna. - Mensajes de Error por Intento:
- 1er Intento Fallido:
"Código inválido"(Status400). - 2do Intento Fallido:
"Código inválido, al tercer intento tu usuario será bloqueado"(Status400). - 3er Intento Fallido (Bloqueo):
"Código inválido, tu usuario ha sido bloqueado. Por favor ingresa a la opción Autogestión de Usuario"(Status403).
- 1er Intento Fallido:
4. Control de Doble Sesión Activa (ACTIVE_SESSION)
Antes de procesar las credenciales en el backend, el sistema verificará si el usuario ya tiene una sesión web activa en otro navegador.
- Validación: Comparar el
x-session-iddel request con las sesiones registradas en memoria. - Acción si está activo en otra sesión: Denegar el login y retornar el mensaje:
"Usuario activo en otra sesión. Por tu seguridad cierra la sesión y vuelve a ingresar tu usuario"(Status403).
5. Estados de Cuenta del Usuario
El backend retornará el estado de cuenta (status / accountStatus) tras procesar las credenciales. Next.js debe denegar el acceso inmediatamente si el estado no es "activo":
| Estado de Cuenta | Acción en Next.js | Mensaje a Retornar al Cliente | Status HTTP |
|---|---|---|---|
bloqueado |
Denegar Acceso | "Tu usuario se encuentra bloqueado. Ingresa en la opción Autogestión de Usuario" (Si es Master: "Usuario bloqueado. Por favor comunícate con Soporte Exterior Empresas a través del (0212-501.5500)") | 403 |
suspendido |
Denegar Acceso | "Tu usuario ha sido suspendido. Ingresa en la opción Autogestión de Usuario" | 403 |
inactivo |
Denegar Acceso | "Usuario inactivo. Por favor comunícate con Soporte Empresas a través del (0212-501.5500)" | 403 |
reiniciado |
Denegar Acceso | "Por favor ingresa a la opción Autogestión de Usuario" | 403 |
6. Manejo Exitoso y Establecimiento de Cookies
Una vez superadas las credenciales y el código 2FA de forma exitosa:
- Resetear Contadores: Poner a
0los intentos de contraseña y token de ese usuario. - Establecer Cookies HTTP-only:
access_token: Token de acceso de corta duración (con flaghttpOnly,secure: trueen prod,sameSite: 'strict', y sumaxAgeprovisto por el backend).refresh_token: Token de refresco de larga duración (configurado con las mismas flags ymaxAgede 7 días).