La recuperación tiene tres pantallas: el correo, el código que llega al correo y la contraseña nueva. En ningún paso la respuesta revela si el correo está registrado: un correo desconocido recibe la misma respuesta y, más adelante, el mismo error que un código equivocado.
Paso a paso
- PersonaEscribe su correo en /recuperar
- NavegadorEnvía POST /auth/password/forgot
- API¿Menos de 3 en 15 minutos?
Límite
password-forgot: 3 solicitudes cada 15 minutos por correo + IP. - API¿Es una cuenta activa?
- Base de datosGuarda el código por 15 min y anula el anterior
En
password_reset_codessolo queda el HMAC-SHA256 del código, con la clave de la aplicación. Hay una sola solicitud vigente por persona. - CorreoEnvía el código de 6 dígitos
- APIResponde 202 siempre
La misma respuesta exista o no la cuenta.
- NavegadorPide el código en /recuperar/codigo
El correo vive solo en memoria (
useRecoveryStore). "Reenviar código" se habilita a los 60 segundos. - PersonaEscribe el código del correo
- NavegadorEnvía POST /auth/password/verify-code
Límite
password-reset: 5 por minuto por correo + IP. - API¿Código correcto, vigente y con intentos?
Un correo desconocido, un código vencido o uno equivocado dan el mismo error. Al quinto fallo la solicitud se anula y queda el evento
ResetCodeVoided. - Base de datosEntrega un pase de un solo uso por 10 min
El pase también se guarda como HMAC. La respuesta dice si la cuenta tiene MFA (
mfa_required). - NavegadorPide la contraseña nueva en /recuperar/nueva
Muestra los requisitos. Si la cuenta tiene MFA, pide además el código de la aplicación o uno de recuperación.
- PersonaEscribe la contraseña nueva y su confirmación
- NavegadorEnvía POST /auth/password/reset
- API¿Cumple la política de contraseñas?
De 12 a 128 caracteres, igual a la confirmación, sin patrones predecibles (repetida, en secuencia o con el correo) y que no esté en la lista local de 10.000 comunes ni en Have I Been Pwned, consultado por k-anonimato. Si Have I Been Pwned no responde en 3 s, sigue con la lista local.
- API¿El pase sigue vigente?
- APISi tiene MFA, ¿segundo factor correcto?
Los fallos del segundo factor gastan los mismos 5 intentos de la solicitud. Usar un código de recuperación envía su aviso.
- Base de datosGuarda la contraseña y cierra todas las sesiones
También levanta el bloqueo del login por intentos fallidos y avisa por el canal personal: las pantallas abiertas en otros equipos se cierran al instante.
- CorreoAviso de contraseña cambiada
- NavegadorVuelve al login con el aviso
"Tu contraseña cambió y cerramos tus sesiones abiertas. Ingresa con la contraseña nueva."
Qué ve la persona en cada error
| Código | HTTP | Cuándo | Mensaje en pantalla |
|---|---|---|---|
TOO_MANY_REQUESTS | 429 | Más de 3 solicitudes en 15 minutos, o más de 5 intentos de código en un minuto | Hiciste demasiados intentos seguidos. Espera {wait} y vuelve a intentarlo. |
PASSWORD_RESET_CODE_INVALID | 422 | Código equivocado, vencido o anulado, o correo desconocido | El código no es correcto o ya venció. Revisa el último correo que te enviamos o pide un código nuevo. |
PASSWORD_RESET_EXPIRED | 422 | El pase venció, ya se usó o se agotaron los intentos | Pasó demasiado tiempo o el código ya se usó. Pide un código nuevo para cambiar tu contraseña. |
PASSWORD_BREACHED | 422 | La contraseña es común o aparece en filtraciones | Esta contraseña aparece en filtraciones conocidas o es de las más usadas. Elige una distinta, por ejemplo varias palabras que solo tú relaciones. |
PASSWORD_REPETITIVE | 422 | Menos de 5 caracteres distintos o un bloque repetido | Tu contraseña repite demasiado los mismos caracteres. Usa una frase o mezcla palabras distintas. |
PASSWORD_SEQUENTIAL | 422 | Casi toda la contraseña es una secuencia | Tu contraseña es casi toda una secuencia (como “abcd”, “1234” o “qwerty”). Usa palabras que no vayan seguidas. |
PASSWORD_PERSONAL | 422 | Contiene el correo o el nombre de la aplicación | Tu contraseña contiene tu nombre, tu correo o el nombre de la aplicación. Elige palabras que no se relacionen con tu cuenta. |
MFA_CODE_REQUIRED | 422 | La cuenta tiene MFA y no se envió ningún código | Tu cuenta tiene la verificación en dos pasos: escribe el código de tu aplicación o uno de tus códigos de recuperación. |
MFA_CODE_INVALID | 422 | El código de la aplicación no corresponde | El código no es correcto. Escribe el que muestra ahora tu aplicación de autenticación. |
Dónde está en el código
RequestPasswordReset,VerifyResetCodeyResetPassword: los tres pasos.DatabasePasswordResets: código y pase con HMAC.NewPassword,WeakPasswordPatternsyHibpBreachedPasswords: la política.AuthServiceProvider: límitespassword-forgotypassword-reset, y los tiempos deconfig/trazo.php.ForgotPasswordPage,ResetCodePage,NewPasswordPageyuseRecoveryStore.- Explicación del módulo: Módulo Auth.