[PR #5345] fix: properly encode callbackURL parameters in generated URLs #5945

Open
opened 2026-03-13 12:42:15 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/better-auth/better-auth/pull/5345
Author: @shaug
Created: 10/16/2025
Status: 🔄 Open

Base: canaryHead: canary


📝 Commits (6)

  • 8ae689d fix: properly encode callbackURL parameters in generated URLs
  • 78d8dfd Revert email-verification change
  • a1adf94 Merge branch 'canary' into canary
  • fd3765b Merge branch 'canary' into canary
  • f2ee972 Merge branch 'canary' into canary
  • 6bcfa9a Merge branch 'canary' into canary

📊 Changes

3 files changed (+13 additions, -11 deletions)

View changed files

📝 packages/better-auth/src/api/routes/update-user.ts (+7 -7)
📝 packages/better-auth/src/oauth2/link-account.ts (+3 -1)
📝 packages/better-auth/src/plugins/username/index.ts (+3 -3)

📄 Description

  • Fix callbackURL encoding in username plugin email verification
  • Fix callbackURL encoding in OAuth2 account linking email verification
  • Fix callbackURL encoding in update-user routes (delete user, email verification, change email)

All callbackURL parameters are now properly encoded using encodeURIComponent() to prevent URL breakage when callbackURLs contain special characters like query parameters, fragments, or other reserved URL characters.

This ensures that URLs like:

Are properly encoded as:

  • /verify-email?token=abc&callbackURL=https%3A%2F%2Fexample.com%2Fapp%3Fredirect%3D%2Fdashboard%26tab%3Dsettings
  • /delete-user/callback?token=abc&callbackURL=https%3A%2F%2Fexample.com%2Fapp%3Fredirect%3D%2Fdashboard%26tab%3Dsettings

Fixes callbackURL parameter corruption in authentication flows.


Summary by cubic

Fix broken callbackURL handling by encoding it in generated links, preventing corrupted URLs when the callback includes query strings or special characters. Applies to email verification, delete account, change email, OAuth2 account linking, and the username plugin.

  • Bug Fixes

    • Email verification route now encodes callbackURL.
    • Update-user routes: delete-user callback and change email encode callbackURL.
    • OAuth2 link-account email verification encodes callbackURL.
    • Username plugin email verification encodes callbackURL.
  • Migration

    • Pass plain callbackURL values; do not pre-encode. No other changes needed.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/better-auth/better-auth/pull/5345 **Author:** [@shaug](https://github.com/shaug) **Created:** 10/16/2025 **Status:** 🔄 Open **Base:** `canary` ← **Head:** `canary` --- ### 📝 Commits (6) - [`8ae689d`](https://github.com/better-auth/better-auth/commit/8ae689dcf6879e3dfa2e0e4cac230c0fcb3f78f8) fix: properly encode callbackURL parameters in generated URLs - [`78d8dfd`](https://github.com/better-auth/better-auth/commit/78d8dfd58d9d52380797820963c370bc84532c44) Revert email-verification change - [`a1adf94`](https://github.com/better-auth/better-auth/commit/a1adf941280dd4ec32462480cd9de7bc6356af27) Merge branch 'canary' into canary - [`fd3765b`](https://github.com/better-auth/better-auth/commit/fd3765be0de8a20673bba7508ca6d003b9dcf0b5) Merge branch 'canary' into canary - [`f2ee972`](https://github.com/better-auth/better-auth/commit/f2ee97242ea5fae926a742c1b59e618a28bf9437) Merge branch 'canary' into canary - [`6bcfa9a`](https://github.com/better-auth/better-auth/commit/6bcfa9ab64e1b3e5db6fa2bd980ea8b6bf0561cd) Merge branch 'canary' into canary ### 📊 Changes **3 files changed** (+13 additions, -11 deletions) <details> <summary>View changed files</summary> 📝 `packages/better-auth/src/api/routes/update-user.ts` (+7 -7) 📝 `packages/better-auth/src/oauth2/link-account.ts` (+3 -1) 📝 `packages/better-auth/src/plugins/username/index.ts` (+3 -3) </details> ### 📄 Description - Fix callbackURL encoding in username plugin email verification - Fix callbackURL encoding in OAuth2 account linking email verification - Fix callbackURL encoding in update-user routes (delete user, email verification, change email) All callbackURL parameters are now properly encoded using encodeURIComponent() to prevent URL breakage when callbackURLs contain special characters like query parameters, fragments, or other reserved URL characters. This ensures that URLs like: - /verify-email?token=abc&callbackURL=https://example.com/app?redirect=/dashboard&tab=settings - /delete-user/callback?token=abc&callbackURL=https://example.com/app?redirect=/dashboard&tab=settings Are properly encoded as: - /verify-email?token=abc&callbackURL=https%3A%2F%2Fexample.com%2Fapp%3Fredirect%3D%2Fdashboard%26tab%3Dsettings - /delete-user/callback?token=abc&callbackURL=https%3A%2F%2Fexample.com%2Fapp%3Fredirect%3D%2Fdashboard%26tab%3Dsettings Fixes callbackURL parameter corruption in authentication flows. <!-- This is an auto-generated description by cubic. --> --- ## Summary by cubic Fix broken callbackURL handling by encoding it in generated links, preventing corrupted URLs when the callback includes query strings or special characters. Applies to email verification, delete account, change email, OAuth2 account linking, and the username plugin. - **Bug Fixes** - Email verification route now encodes callbackURL. - Update-user routes: delete-user callback and change email encode callbackURL. - OAuth2 link-account email verification encodes callbackURL. - Username plugin email verification encodes callbackURL. - **Migration** - Pass plain callbackURL values; do not pre-encode. No other changes needed. <!-- End of auto-generated description by cubic. --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-03-13 12:42:15 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#5945