3.3 Actividad: Recuperación de Acceso
Este diagrama modela la lógica de decisión, validación de estados y bifurcaciones de error durante el ciclo de vida de la recuperación de contraseña por enlace transaccional.
1. Explicación y Semántica del Diagrama
El flujo ilustra los tres filtros de seguridad que deben cumplirse para autorizar el restablecimiento de credenciales:
- Filtro de Existencia: Se verifica que la dirección de correo coincida con una cuenta activa. Para evitar la enumeración de usuarios, las respuestas de cara al cliente son genéricas.
- Filtro de Estatus del Token: El token de 64 caracteres debe encontrarse en estado
LP_PENDIENTEen la tablalost_password. - Filtro Temporal de Expiración: La diferencia entre
now()ycreated_atdel token debe ser inferior a 60 minutos. - Actualización Atómica: La actualización exitosa de la contraseña en MariaDB transiciona automáticamente el token a estado
LP_USADO, impidiendo ataques de repetición.
2. Cómo se Lee este Diagrama
- Los nodos redondeados representan acciones de procesamiento o interacción.
- Los rombos
{}representan puntos de decisión condicional (Decisions/Branches) que bifurcan el flujo entre rutas de éxito y salidas de error controladas. - El contenedor
subgraphdelimita la partición lógica de validación atómica del token.
3. Implementación en el Framework Mañuti
- Puntos de Entrada:
ForgotPasswordController@sendResetLinkEmailyResetPasswordController@reset. - Persistencia: Tabla
lost_passwordvinculada al modeloCatalogo. - Notificación: Mailable
ResetPasswordMaildespachado a la cola de Redis.
4. Diagrama Mermaid
flowchart TD
%% Nodos de inicio y fin
Start([Inicio])
StopError([Fin: Error])
StopExpirado([Fin: Expirado])
StopUsado([Fin: Ya Usado])
StopInvalido([Fin: Token Inválido])
StopExito([Fin: Éxito])
%% Flujo inicial
Start --> A["Usuario solicita recuperación"]
A --> B["Ingresa Correo Electrónico"]
B --> C{"¿Existe usuario<br>activo?"}
%% Condición: Usuario Activo
C -->|Sí| D["Generar Token (Str::random 64)"]
D --> E["Consultar ID de Estatus 'LP_PENDIENTE'"]
E --> F["Guardar en tabla lost_password"]
F --> G["Enviar Email (Mailable Queue)"]
C -->|No| H["Retornar error genérico (Seguridad)"]
H --> StopError
G --> I["Usuario recibe email y da clic"]
I --> J
%% Partición: Validación del Token
subgraph ValidacionToken ["Validación del Token"]
J{"¿Token existe<br>en BD?"}
J -->|Sí| K{"¿Estatus ==<br>LP_PENDIENTE?"}
J -->|No| P["Error: Token Inválido"]
K -->|Sí| L{"¿Tiempo < 60 min?"}
K -->|No| O["Error: Token ya usado"]
L -->|Sí| M["Mostrar Formulario 'Nueva Contraseña'"]
L -->|No| N["Error: Token Expirado"]
end
%% Salidas de error de la validación
P --> StopInvalido
O --> StopUsado
N --> StopExpirado
%% Continuación del flujo de éxito
M --> Q["Usuario envía nueva contraseña"]
Q --> R["Validar confirmación y longitud"]
R --> S["Actualizar usuarios (Hash Password)"]
S --> T["Actualizar lost_password (Estatus = LP_USADO)"]
T --> U["Redirigir al Login con mensaje de éxito"]
U --> StopExito