-
-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: Remove username from email verification and password reset process #8488
Conversation
I will reformat the title to use the proper commit message syntax. |
Thanks for opening this pull request! |
How should this handle expired tokens? With the old implementation the I'm also wondering if removing the |
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## alpha #8488 +/- ##
==========================================
+ Coverage 93.53% 93.55% +0.02%
==========================================
Files 186 186
Lines 14831 14834 +3
==========================================
+ Hits 13872 13878 +6
+ Misses 959 956 -3 ☔ View full report in Codecov by Sentry. |
What is the purpose of token expiration for email verification? If an expired token leads to a website where one can request a new token (sent via verification email) without login, the expiration seems useless. Is there any scenario in which expiration makes sense? Maybe the existing tests related to token expiration give clues about the intentions of expiration?
The difference of brute forcing two fields (email + token) vs one field (token) is just the amount of possible combinations. If we make the token a longer string, the difficulty should be the same. What happens in the following scenario:
|
This PR:
This all feels like pretty breaking changes to me, which I think we would have to phase in @mtrezza thoughts? |
Did you find out any hinds regarding:
Regarding breaking change:
|
@mtrezza , if there isn't any code that specifically checks that the username is not in the link, and if tokens still work the same way, passing an old link to a new server will succeed. That is, if all cases of |
@mathieulb That makes sense. Given that the existing tests have been changed, we'd need to maintain a test legacy test that uses the old link with username query parameter in the URL. Even though the param should be ignored, it would be good to test it. |
When you attempt to reset with an expired token, the server will throw. It's up to the client to request a renewal - previously you could do it with the email that is in the query params, but now that will no longer work (there is a new mechanism where you can submit the expired token for renewal) |
I'm wondering; how long until an expired token is deleted from the DB? Or isn't it deleted at all? If it is deleted, then this logic probably fails and the correct approach would be to present a form with an email field where the user has to enter the email address. Or, just show a website which instructs the user on how to request a new verification email from within the app, if login with unverified email is enabled. |
The expired token isn't deleted, it is just overriden by a new token. So it will only succeed the first time a resend is request, but will fail the next time (unless with the newer expired token) |
We have talked about the impact on email verification, but this PR removes the username also from the password reset process, right? Changed the PR title. Are there any additions in the migration guide necessary? Any additional HTML page form changes? Could you please take a look at the migration guide, I've made some changes, if that all makes sense? |
Looks good. Only thing I would add is it only stores the most recent expired token. Previously with the username, multiple "expired links" could be re-validated. Now, we can only trigger the resend if the token was the most recent (as it is stored as a string) |
Good point, that means with this change it is also recommended to set |
Updated docs |
Signed-off-by: Manuel <[email protected]>
BREAKING CHANGE: This removes the username from the email verification and password reset process. If you are using customized HTML pages or emails related to email verification and password reset, they may need to be adapted accordingly. See the migration guide for more details. Migration GuideThis is a major release with breaking changes. We prepared a migration guide to help you migrating from Parse Server 8. For the full list of breaking changes see the section below. |
# [8.0.0-alpha.13](8.0.0-alpha.12...8.0.0-alpha.13) (2025-03-02) ### Bug Fixes * Remove username from email verification and password reset process ([#8488](#8488)) ([d21dd97](d21dd97)) ### BREAKING CHANGES * This removes the username from the email verification and password reset process to prevent storing personally identifiable information (PII) in server and infrastructure logs. Customized HTML pages or emails related to email verification and password reset may need to be adapted accordingly. See the new templates that come bundled with Parse Server and the [migration guide](https://github.com/parse-community/parse-server/blob/alpha/8.0.0.md) for more details. ([d21dd97](d21dd97))
🎉 This change has been released in version 8.0.0-alpha.13 |
# [8.0.0](7.4.0...8.0.0) (2025-03-04) ### Bug Fixes * LiveQueryServer crashes using cacheAdapter on disconnect from Redis 4 server ([#9616](#9616)) ([bbc6bd4](bbc6bd4)) * Push adapter not loading on some versions of Node 22 ([#9524](#9524)) ([ff7f671](ff7f671)) * Remove username from email verification and password reset process ([#8488](#8488)) ([d21dd97](d21dd97)) * Security upgrade node from 20.17.0-alpine3.20 to 20.18.2-alpine3.20 ([#9583](#9583)) ([8f85ae2](8f85ae2)) ### Features * Add dynamic master key by setting Parse Server option `masterKey` to a function ([#9582](#9582)) ([6f1d161](6f1d161)) * Add support for MongoDB `databaseOptions` keys `autoSelectFamily`, `autoSelectFamilyAttemptTimeout` ([#9579](#9579)) ([5966068](5966068)) * Add support for MongoDB `databaseOptions` keys `minPoolSize`, `connectTimeoutMS`, `socketTimeoutMS` ([#9522](#9522)) ([91618fe](91618fe)) * Add TypeScript support ([#9550](#9550)) ([59e46d0](59e46d0)) * Change default value of Parse Server option `encodeParseObjectInCloudFunction` to `true` ([#9527](#9527)) ([5c5ad69](5c5ad69)) * Deprecate `PublicAPIRouter` in favor of `PagesRouter` ([#9526](#9526)) ([7f66629](7f66629)) * Increase required minimum MongoDB versions to `6.0.19`, `7.0.16`, `8.0.4` ([#9531](#9531)) ([871e508](871e508)) * Increase required minimum Node versions to `18.20.4`, `20.18.0`, `22.12.0` ([#9521](#9521)) ([4e151cd](4e151cd)) * Increase required minimum versions to Postgres `15`, PostGIS `3.3` ([#9538](#9538)) ([89c9b54](89c9b54)) * Upgrade to express 5.0.1 ([#9530](#9530)) ([e0480df](e0480df)) * Upgrade to Parse JS SDK 6.0.0 ([#9624](#9624)) ([bf9db75](bf9db75)) ### BREAKING CHANGES * This upgrades the internally used Express framework from version 4 to 5, which may be a breaking change. If Parse Server is set up to be mounted on an Express application, we recommend to also use version 5 of the Express framework to avoid any compatibility issues. Note that even if there are no issues after upgrading, future releases of Parse Server may introduce issues if Parse Server internally relies on Express 5-specific features which are unsupported by the Express version on which it is mounted. See the Express [migration guide](https://expressjs.com/en/guide/migrating-5.html) and [release announcement](https://expressjs.com/2024/10/15/v5-release.html#breaking-changes) for more info. ([e0480df](e0480df)) * This upgrades to the Parse JS SDK 6.0.0. See the [change log](https://github.com/parse-community/Parse-SDK-JS/releases/tag/6.0.0) of the Parse JS SDK for breaking changes and more details. ([bf9db75](bf9db75)) * This removes the username from the email verification and password reset process to prevent storing personally identifiable information (PII) in server and infrastructure logs. Customized HTML pages or emails related to email verification and password reset may need to be adapted accordingly. See the new templates that come bundled with Parse Server and the [migration guide](https://github.com/parse-community/parse-server/blob/alpha/8.0.0.md) for more details. ([d21dd97](d21dd97)) * This releases increases the required minimum versions to Postgres `15`, PostGIS `3.3` and removes support for Postgres `13`, `14`, PostGIS `3.1`, `3.2`. ([89c9b54](89c9b54)) * The default value of Parse Server option `encodeParseObjectInCloudFunction` changes to `true`; the option has been deprecated and will be removed in a future version. ([5c5ad69](5c5ad69)) * This releases increases the required minimum MongoDB versions to `6.0.19`, `7.0.16`, `8.0.4` and removes support for MongoDB `4`, `5`. ([871e508](871e508)) * This releases increases the required minimum Node versions to 18.20.4, 20.18.0, 22.12.0 and removes unofficial support for Node 19. ([4e151cd](4e151cd))
Pull Request
Issue
Currently, Parse Server exposes
username
via verification email urls. All that should be needed to perform a reset request is a valid tokenCloses: #7137
Approach
Tasks