Security Signing in safely: 2FA, passkeys and account recovery
How long do password reset links last?
Usually 1 hour, but defaults run from 10 minutes to 5 days. What Okta, Microsoft, Auth0, Zendesk, Plesk, Laravel and Django set, and why only the newest link works.
The short answer
- There is no standard lifetime for a password reset link: each company sets its own, and the published defaults run from 10 minutes to 5 days.
- One hour is the most common default: Okta, Plesk since version 18.0.68, and the Laravel web framework all use it. Zendesk links last 24 hours, Django's 3 days and Auth0's 5 days.
- OWASP's guidance for developers requires that a reset link works only once and expires "after an appropriate period", but sets no number.
- On many systems a new request deletes the earlier link, so always open the newest reset email; no reset link works a second time.
- An expired link cannot be revived and does no harm: request a new one from the sign-in page and use it within the hour, on the same device.
- A reset email you did not request should be left alone; go to the site directly instead of clicking it.
There is no standard length. A password reset link lasts as long as the company that sent it decided, and the published defaults run from 10 minutes to 5 days. Among the identity services and software that send reset emails for other companies, 1 hour is the most common setting: Okta, Plesk and the Laravel web framework all default to it. Zendesk links last 24 hours, Django's last 3 days and Auth0's last 5 days. Microsoft's reset flow for Microsoft 365 administrators allowed only 10 minutes. The security guidance that developers follow, OWASP's Forgot Password Cheat Sheet, says a reset link must work once and expire "after an appropriate period", and gives no number. So if your link is more than an hour old, assume it may be dead and ask for a new one.
What the reset services actually set
Most sites do not build their own password reset. They use an identity service such as Okta or Auth0, a help desk platform such as Zendesk, or the reset feature of the web framework they are built on. The table gathers each one's documented default.
| Who sends the link | How long it lasts by default | Can the site change it? | Detail that changes the answer |
|---|---|---|---|
| Okta | 1 hour | Yes, through Okta's API only, from 60 minutes up to 300,000 minutes (about 208 days) | The admin console fixes it at one hour; anything else has to be set in the password policy by API |
| Microsoft 365, Intune and Azure admin self-service reset | 10 minutes for the emailed link and the texted security code | Not described | The whole reset had to be finished within 60 minutes, in the same browser session it was started in |
| Auth0 | 5 days (432,000 seconds) | Yes, in the "URL Lifetime" field of the Change Password email template | Links created through Auth0's API also get 5 days if the developer sets no lifetime |
| Zendesk | 24 hours | Not described | The same 24 hours applies to account verification emails |
| Plesk hosting control panel | 1 hour from version 18.0.68 | Yes, by the server administrator in panel.ini | It was 24 hours before, and Plesk cut it "due to security reasons" |
| Laravel (web framework) | 60 minutes | Yes, in the app's configuration | Asking again deletes the earlier link, and a new link can be requested only once every 60 seconds by default |
| Django (web framework) | 3 days (259,200 seconds) | Yes, in the app's settings | Earlier links stay valid until the password changes or you sign in |
| OWASP guidance | No number | Not applicable | Requires that links expire "after an appropriate period" and are invalidated once used |
Why you hear both 1 hour and 24 hours
Search for this question and the answers are single products: a help page saying 24 hours, a forum post saying an hour. Each is right about its own product, and none is the general answer, because there is no rule behind them. NIST, the US standards body that sets limits for texted sign-in codes, publishes no equivalent figure for reset links, and OWASP deliberately leaves the number to the developer.
The two figures you see most are both real defaults. 24 hours was common for years, and Plesk's history shows the drift: in 2023 a Plesk staff member told a user on its forum that the link was limited to 24 hours "for security reasons", and from version 18.0.68, released in March 2025, it lasts 1 hour, also "due to security reasons". The same reasoning has moved in one direction. A reset link is a key to the account sitting in an inbox, and the shorter it lives, the less use it is to anyone who reads that inbox later.
Django keeps 3 days, and its documentation explains why a longer window is not the risk it sounds: shortening the timeout makes no difference to how easily a link can be guessed, because the tokens are designed to resist guessing without any timeout. The limit is about stale links lying around, not about someone working out the code.
Why only the newest link works
If you clicked "forgot password" three times and then opened the first email, it may say the link is invalid even though it is only a few minutes old. Many systems keep a single reset token per account, so a new request replaces the old one. Laravel's code does exactly this: before it creates a reset link for an address, it deletes any existing one.
Other systems are built differently. Django does not store the link at all; it calculates it from details of your account, including your current password and the time you last signed in. Every link it has sent stays valid until one is used or you sign in another way, and then all of them stop at once because those details have changed. Either way, the newest email is the safe one to open. OWASP requires that a link is invalidated once used, so an old reset email will fail after a successful reset.
Microsoft's admin reset flow, as its support article described it, added a condition that catches people out: the link had to be opened in the same browser session that started the request. Asking on a laptop and tapping the link on a phone failed, however quickly you did it.
What to do when a link has expired
An expired link cannot be revived, and it does no harm to leave it. Zendesk's own advice works everywhere: generate a new reset link from the sign-in page. Then:
- Request once and wait. Emails can take a minute or two. On systems like Laravel's a second request makes the first email useless, and Laravel refuses one within 60 seconds by default.
- Open the newest email only. Delete the older reset messages so you do not open the wrong one.
- Use the same device and browser. Start the reset where you will finish it.
- Check spam and the address you used. OWASP tells sites to show the same message whether or not an account exists, so "if an account exists, we have sent an email" does not confirm that one does. No email often means the account is under a different address.
- Finish within the hour. Have the new password ready, ideally generated by a password manager that stores it for you, before you click.
If every reset email goes to an address you can no longer open, a fresh link will not help. That is a recovery problem, and the time to fix it is before it happens: setting up account recovery before you need it covers the backup address, phone number and codes that get you back in. An old address can also disappear from under you, since most free providers delete a mailbox after a long spell of no use, and the inactivity deadlines at the big email providers tell you how often to sign in.
A reset email you did not ask for
A reset email is easy to fake, and people expect to act on one quickly. A real one is triggered by a request; if you did not make one, do not click the link. Go to the site by typing its address or using its app. How phishing messages get past careful people covers what makes the fake ones convincing, and the red flags in scam emails lists the checks that still work.
A genuine but unexpected reset email usually means someone typed your address on the site, by mistake or on purpose. The link is no use to them, because it went to you. Leave it to expire. If you clicked a reset link in an email you now doubt and entered anything on the page that opened, what to do after clicking a phishing link takes you through the next steps in order.
The short expiry also protects a reset email sitting in an inbox someone else gets into later. That is why the inbox matters more than the link, and why locking down your email account is the step that protects every reset you will ever receive.
Where these numbers stop applying
Every figure in the table is a default, and every service except Microsoft's and Zendesk's documents a way to change it. A site built on Okta could give you 3 hours or 3 months; a site built on Django could have shortened its 3 days to 1 hour. Few banks, shops or social networks publish their figure.
The Microsoft figure comes from a support article for administrators of Microsoft 365, Intune and Azure that Microsoft has since retired, so it describes how that flow worked when the article was last published, not a current promise. It also does not cover personal Microsoft accounts.
Reset links are also different from the short codes some sites send instead. A six digit reset code sent by text or email follows the rules for one-time codes, which usually last 5 to 10 minutes, not the hours that links get.
These figures are taken from each provider's documentation as published in October 2026.
What to do with this
Treat a reset link as good for about an hour and for one use. Ask once, open only the newest email, finish on the same device, and ask again rather than fighting an old link. If you did not ask for it, leave it alone. Every reset you will ever do runs through your inbox, so the most useful ten minutes after this go on giving that inbox a second sign-in step and a recovery route that still works.
Common questions
Why does my password reset link say it is invalid or expired?
There are three usual reasons. The link is older than the site allows, which is often just one hour. You requested another reset since, and the newer request cancelled this link. Or the link has already been used once, perhaps by you earlier. Request one fresh link, wait for it to arrive, and open that email rather than any older one in your inbox.
Can I make a password reset link last longer?
Not as a user. The lifetime is set by the company running the site, and some of the tools they use let them change it: Okta through its API, Auth0 in an email template setting, Plesk in a server configuration file. If links keep expiring before you can use them, the practical fix is to have your new password ready before you request the link.
Is it dangerous if I get a password reset email I did not request?
Usually not on its own. Someone may have typed your address by mistake, and the link only goes to your inbox, so it is useless to them. The risk is that the email is a fake designed to get you to a lookalike page. Do not click it; if you are worried, open the site yourself and check your security settings there.
Do old password reset links stop working after I change my password?
They should. OWASP's guidance says a reset link must be invalidated once used, and in Django every outstanding link stops working as soon as the password changes. Systems that keep one link per account have already cancelled the older ones when you asked for a new link. An old reset email in your inbox should not be able to change your password again.