Saltar al contenido principal
Versión: 2.0

Módulo: Recuperación de Contraseña

Scope

Tipo de organizaciónAcceso
Empresa
Agencia
Reclutador independiente
Usuario sin organización

Permisos por rol

AcciónDisponiblePermiso
Solicitar correo de recuperaciónPúblico (no requiere autenticación)
Reenviar correo de recuperaciónPúblico
Cambiar contraseña (vía link web)Token del email

¿Qué es?

Flujo de recuperación de contraseña mediante envío de correo electrónico. El usuario solicita un email con instrucciones y el cambio real de contraseña se completa a través de un link web que envía el backend, no dentro de la app Flutter.

¿Qué puede hacer el usuario?

  • Solicitar un correo de recuperación ingresando su email
  • Ver confirmación de envío con el email al que se mandó
  • Reenviar el correo después de un cooldown de 60 segundos
  • Editar el email si se equivocó (después del cooldown)
  • Volver al login en cualquier momento

Flujo del usuario

1. Presiona "¿Olvidaste tu contraseña?" desde la pantalla de login
2. Ingresa su correo electrónico
3. Presiona "Enviar instrucciones"
4. Se muestra pantalla de éxito:
- Ícono de correo enviado
- Mensaje "Correo enviado"
- "Revisa tu bandeja de entrada y spam"
- Chip con el email al que se envió
- Botón de reenvío (con cooldown 60s)
5. Puede reenviar después del cooldown
6. Puede editar el email (tap en chip después del cooldown)
7. Presiona "Volver al inicio de sesión" → regresa a login
8. Recibe email → abre link web → escribe nueva contraseña (fuera de Flutter)

Reglas de negocio

  • Email debe ser válido (validación regex en el formulario)
  • Cooldown de 60 segundos entre reenvíos
  • El backend envía el correo sin importar si el email existe (seguridad — no revela si hay cuenta)
  • El cambio real de contraseña se ejecuta vía link web del backend
  • No hay pantalla in-app para escribir la nueva contraseña

Requisitos para solicitar reset

CampoTipoRequeridoNotas
emailStringValidado con regex (isValidEmail extension)

Arquitectura

lib/features/auth/
├── application/
│ ├── reset_password_cubit.dart # Lógica de envío de email
│ └── reset_password_state.dart # ResetPasswordStatus enum
├── domain/
│ └── usecases/
│ └── reset_password_usecase.dart
└── presentation/
└── pages/
└── reset_password_page.dart # Formulario + estado de éxito

Endpoints API

MétodoEndpointAutenticaciónDescripción
POST/api/auth/request-password-resetPúblicoEnvía correo de recuperación

Request body

{
"email": "usuario@ejemplo.com"
}

Response

200 OK (sin body relevante — éxito silencioso por seguridad)

Registro DI

  • UseCase: LazySingleton<ResetPasswordUseCase>
  • Cubit: Factory<ResetPasswordCubit> (nueva instancia por pantalla)
getIt.registerFactory<ResetPasswordCubit>(
() => ResetPasswordCubit(resetPasswordUseCase: getIt<ResetPasswordUseCase>()),
);

Localización

✅ Completa — todos los strings usan context.l10n:

ClaveEspañolInglés
forgotPassword¿Olvidaste tu contraseña?Forgot your password?
resetPasswordSubtitleIngresa tu correo electrónico y te enviaremos las instrucciones...Enter your email address and we will send you instructions...
sendInstructionsEnviar instruccionesSend instructions
resetPasswordSuccessSe ha enviado un correo con las instrucciones...An email with instructions... has been sent
resetPasswordEmailSentCorreo enviadoEmail sent
resetPasswordCheckInboxRevisa tu bandeja de entrada y spamCheck your inbox and spam folder
resetPasswordDidntReceive¿No lo recibiste?Didn't receive it?
resetPasswordResendReenviar correoResend email
resetPasswordResendInReenviar en {seconds}sResend in {seconds}s
resetPasswordBackToLoginVolver al inicio de sesiónBack to login

Tests

ArchivoTests
reset_password_cubit_test.dart5 — initial state, success, ServerFailure, NetworkFailure, email verification
reset_password_usecase_test.dart3 — success, ServerFailure, NetworkFailure

Estados de la UI

EstadoComportamiento
InitialFormulario de email visible
LoadingBotón muestra spinner, deshabilitado
SuccessCambia a vista de éxito con email chip + reenvío + cooldown
ErrorMuestra notificación con el mensaje del failure

Pendientes

Ninguno — el flujo está completo. El cambio de contraseña se resuelve vía link web del backend.