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:
@@ -1,7 +1,12 @@
|
||||
import { getTranslations, setRequestLocale } from 'next-intl/server'
|
||||
import { PageShell } from '@/components/PageShell'
|
||||
import { getRealmName } from '@/lib/realm'
|
||||
import { isResetTokenValid } from '@/lib/recover'
|
||||
import { ResetForm } from './ResetForm'
|
||||
|
||||
// Consulta el token en la BD al abrirse: no se puede prerenderizar.
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
export default async function ResetPasswordPage({
|
||||
params,
|
||||
searchParams,
|
||||
@@ -14,6 +19,23 @@ export default async function ResetPasswordPage({
|
||||
const { token } = await searchParams
|
||||
const t = await getTranslations('Reset')
|
||||
|
||||
// El enlace es de un solo uso y dura 1 hora. Antes el formulario se pintaba
|
||||
// igualmente y solo al enviarlo te enterabas de que el enlace ya no servía.
|
||||
if (!(await isResetTokenValid(token ?? ''))) {
|
||||
const realm = await getRealmName()
|
||||
return (
|
||||
<PageShell title={t('title')}>
|
||||
<div className="box-content">
|
||||
<div className="body-box-content centered">
|
||||
<p className="red-info2">{t('invalidLink')}</p>
|
||||
<br />
|
||||
<p>{t('needHelp', { realm })}</p>
|
||||
</div>
|
||||
</div>
|
||||
</PageShell>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<PageShell title={t('title')}>
|
||||
<div className="box-content">
|
||||
|
||||
Reference in New Issue
Block a user