Skip to content

Password Recovery ​

The "I forgot my password" flow. A user who cannot sign in asks for a reset link by email, then chooses a new password.

Driven by the Password reset token type: 30 minute lifetime, 3 attempts.

Pages ​

PagePathPurpose
RequestGET/POST /recoverEnter the account email address
Sentafter POSTAlways shown after submit, to avoid revealing whether the account exists
ResetGET/POST /recover/reset?token=…Choose a new password
Doneafter POSTPassword changed
Invalidon bad tokenLink missing, expired, or already used

Flow ​

The request form takes an email address and nothing else. What happens next depends on whether that address resolves to a user, but the page you see does not — the confirmation is identical either way.

If the address is malformed, the form comes back with Enter a valid email address. and a 400. If the submission looks automated, it is dropped with 204 and no explanation.

Choosing a New Password ​

Opening the link validates the token before rendering anything. A missing, expired, consumed, or over-attempted token gets the invalid page with a link to request a fresh one — the form is never shown for a token that could not be used.

The reset form itself asks for the password twice and displays the requirements from the in-force password policy, so the rules the user sees are the rules that will actually be applied.

Three things can send the form back:

ErrorCause
Passwords do not match.The two fields differ
Password does not meet the security policy.Too short, or missing a required character class
This reset link is invalid or has expired.Token failed revalidation between rendering and submitting

The token is checked again on submit, not just on render. A form left open past the 30 minute window fails at that point rather than rotating the password.

What Changes ​

On success, exactly two things happen: the pwd row's hash is rotated (with pwdUpdatedAt and a fresh pwdExpiry derived from the policy), and the token is consumed so the link cannot be reused.

Note what does not happen. Lockout state is untouched — a locked account is still locked after a password reset, and the user needs Account unlock as well. 2FA is also untouched, so the next sign-in still asks for a code.

Linking to It ​

Add this to your login page:

/api/foxnox/web/recover

For the admin UI shipped with Gatelin, set ADMIN_PASSWORD_RECOVERY_URL=/api/foxnox/web/recover and the "Forgotten password?" link appears on the login form automatically.

Published and maintained by ALTEN