resources/views/pages/frontend/docs/uml-actividad-recuperacion-password.md
Última modificación: 24 Oct, 2026

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:

  1. 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.
  2. Filtro de Estatus del Token: El token de 64 caracteres debe encontrarse en estado LP_PENDIENTE en la tabla lost_password.
  3. Filtro Temporal de Expiración: La diferencia entre now() y created_at del token debe ser inferior a 60 minutos.
  4. 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 subgraph delimita la partición lógica de validación atómica del token.

3. Implementación en el Framework Mañuti

  • Puntos de Entrada: ForgotPasswordController@sendResetLinkEmail y ResetPasswordController@reset.
  • Persistencia: Tabla lost_password vinculada al modelo Catalogo.
  • Notificación: Mailable ResetPasswordMail despachado 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

Enlaces Relacionados

Edita este documento en >> uml-actividad-recuperacion-password.md
← Volver a la Landing Page