El enlace de restablecer deja de servir una vez usado

La página pintaba el formulario sin mirar el token: rellenabas la contraseña
nueva y solo al enviarla te enterabas de que el enlace ya no valía. El API sí
marcaba `used = 1` y rechazaba el reintento, pero la pantalla no lo reflejaba.

Ahora la página comprueba el token al abrirse con `isResetTokenValid()` (mismas
condiciones que `resetPassword` —existe, sin usar, dentro de la hora— pero SIN
consumirlo) y, si no vale, muestra el aviso del tema en vez del formulario.

Textos: `invalidLink` pasa a «El enlace de restablecer la contraseña es inválido»
y se añade `needHelp`, como en la página de activación.

Verificado en producción con enlaces reales: válido -> formulario; usado,
caducado, inexistente y sin token -> aviso, sin formulario. Y el ciclo entero:
restablecer con un enlace válido lo marca usado y al reabrirlo ya sale el aviso.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 19:13:06 +00:00
parent fea1316f3c
commit 4ee7d78994
4 changed files with 48 additions and 4 deletions
+3 -2
View File
@@ -276,8 +276,9 @@
"saving": "Saving…",
"success": "Password reset. You can now sign in.",
"goLogin": "Go to sign in",
"invalidLink": "The link is invalid or has already been used.",
"expiredLink": "The link has expired. Please request a new one.",
"invalidLink": "The password reset link is invalid",
"expiredLink": "The password reset link has expired",
"needHelp": "If you need help creating an account, you can contact the {realm} team.",
"passwordMismatch": "Passwords do not match.",
"passwordTooLong": "The password must not exceed 16 characters.",
"accountNotFound": "Account not found.",