better-auth
Features
- Added server-side
accountInfocalls without requiring session headers (#9813)
Bug Fixes
- Fixed
getMigrationfield index order (#9691) - Fixed acceptance of hashed nonces for native iOS Sign in with Apple (#8870)
- Added error code to the change-email-disabled response (#8948)
- Fixed synthetic user construction to avoid including extra fields (#9347)
- Fixed forwarding of session cookie refresh headers (#9667)
- Fixed invalid instrumentation import list (#9582)
- Fixed
changeEmailconfig gate and URL-encoded thecallbackURL(#9614) - Fixed URL-encoding of
callbackURLin verify-email links (#9792) - Fixed role statement types to preserve exact type information (#9507)
- Fixed access control to reject empty action lists and continue OR evaluation on unknown resources (#9603)
- Fixed
storeStateStrategyto default to"database"when usingsecondaryStorage(#9591) - Fixed missing exports for
AdminClientOptionsandOrganizationClientOptions(#9642) - Fixed
onLinkAccountcallback not being called during email verification sign-in (#9548) - Fixed captcha enforcement to exempt the
/sign-in/email-otpendpoint (#9596) - Fixed
parseJSONto correctly decode escape sequences in quoted strings (#9617) - Fixed cookie parsing to handle relaxed separators (#9543)
- Fixed redirect URI validation to be runtime-safe and reject fragment components (#9845)
- Fixed
getTrustedOriginsto respect the dynamicbaseURLprotocol option (#9644) - Fixed
consumeOnefallback to throw on non-numericdeleteManyresults (#9831) - Fixed device authorization to bind approval to the verifier session (#9573)
- Fixed
sendVerificationEmailcallback to receive a cloned request (#9619) - Fixed
accessTokenExpiresInfor OAuth providers that omitexpires_in(#9799) - Fixed magic link verification to consume the token atomically (#9572)
- Fixed OAuth proxy to forward
result.errorverbatim in callback redirects (#9723) - Fixed missing state-cookie skip in the OAuth proxy flow (#9385)
- Fixed
updateUserInfoOnLinknot being applied during OAuth account linking (#8758) - Fixed OAuth callback to forward specific error codes via
redirectOnError(#9788) - Fixed OAuth to honor the per-flow
errorCallbackURLwhen state validation fails (#9789) - Fixed mapping of
josetoken verification errors (#9655) - Fixed confidential client authentication on the
refresh_tokengrant (#9576) - Fixed OIDC provider to drop the
nonealgorithm, disable plain PKCE by default, and reject requests missing a PKCE method (#9575) - Fixed OpenAPI spec to emit unique
operationIds for multi-method endpoints (#9721) - Fixed organization creation and update to allow a
nulllogo (#9842) - Fixed organization invitations to reject team IDs containing a comma (#9616)
- Fixed organization deletion to wrap cascade deletes in a transaction (#9630)
- Fixed
ipv6Subnettype to accept wider values (#9545) - Fixed session expiry to be preserved correctly during stateless cache refresh (#8817)
- Fixed two-factor authentication to clear the session cookie cache on response (#9639)
- Fixed username validation on the admin
createUserendpoint (#9464)
For detailed changes, see CHANGELOG
@better-auth/oauth-provider
❗ Breaking Changes
- Bound RFC 8707 resource indicators to the authorization grant (#9836)
Migration: The
customAccessTokenClaimscallback now receives aresourcesarray instead of aresourcestring. Runnpx @better-auth/cli migrate(orgenerateif you manage the schema yourself) to add the new resource columns.
Features
- Added token endpoint client authentication support (#9625)
Bug Fixes
- Fixed
consumeVerificationValueto return null for expired rows (#9624) - Fixed dynamic client registration to enforce
clientPrivileges(#9837) - Fixed DCR endpoint to be hidden unless explicitly enabled (#9448)
- Fixed Basic Auth to preserve colons in client secrets (#9601)
- Fixed consent update to return
NOT_FOUNDwhen referencing a missing client (#9600) - Fixed issuer metadata aliases to be served at path-prefixed URLs (#9668)
- Fixed OAuth linking to block connections to unverified local accounts (#9578)
- Fixed
redirect_urischeme validation in OIDC provider and MCP (#9838) - Refactored Basic credential handling to use a single source of truth (#9657)
For detailed changes, see CHANGELOG
@better-auth/sso
❗ Breaking Changes
- Added support for multiple IdP signing certificates (#8805)
Migration:
samlConfig.certificatefromgetSSOProvider,listSSOProviders, andupdateSSOProvidernow always returns an array, even when a single certificate is configured. Update consumers to read an array unconditionally.
Features
- Added support for IDP-initiated OAuth flows via a secure server-side bounce (#9301)
- Added per-request
additionalParamsandloginHinttosignIn.social,linkSocial, andsignIn.sso(#9305)
Bug Fixes
- Fixed hook rejections to redirect to
errorCallbackURLacross auth callback flows (#9702) - Fixed OAuth account identity scoping and corrected buggy
internalAdapterhelpers (#9818) - Fixed security vulnerabilities flagged by Dependabot (#9662)
- Fixed SSO provider registration to require the org admin role (#9220)
- Fixed signed-assertion XML injection vulnerability by updating samlify to 2.13.1 (#9821)
- Fixed URL-encoding of error values in OIDC callback redirects (#9722)
- Fixed OIDC endpoint URL validation at provider registration and update (#9574)
For detailed changes, see CHANGELOG
@better-auth/scim
❗ Breaking Changes
- Fixed personal SCIM connections to always be bound to their creator (#9840)
Migration: The
providerOwnershipoption has been removed and owner binding is now always enforced. Runnpx auth migrateornpx auth generateto add thescimProvider.userIdcolumn. Connections created before this release with no owner are no longer reachable via management endpoints; reclaim them by settinguserIdat the database level, then regenerate tokens as needed.
Bug Fixes
- Fixed user deletion to clean up associated sessions (#9162)
- Fixed SCIM token issuance to reject collisions with built-in provider IDs (#9579)
For detailed changes, see CHANGELOG
@better-auth/stripe
❗ Breaking Changes
- Made
onSubscriptionCanceleventparameter required (#9531)
Migration: Update your
onSubscriptionCancelcallback to declareeventas a required parameter and remove anyundefinedguards around it.
Bug Fixes
- Fixed URL and Stripe value escaping (#9661)
For detailed changes, see CHANGELOG
@better-auth/api-key
Bug Fixes
- Synced changes from main to next (#9533)
- Fixed TypeScript declaration emit errors (TS4023) by adding
better-callas a peer dependency (#9759) - Fixed rate-limited API key requests to return
429instead of401(#9505) - Fixed verification of non-default API keys when
configIdis omitted (#9794) - Fixed
requireEmailVerificationOnInvitationto be enabled by default and extended the gate togetandlistendpoints (#9577)
For detailed changes, see CHANGELOG
auth
Features
- Added
create-adminCLI command for creating an initial admin user (#9547) - Added string case conversion utilities (#9727)
- Added atomic
claimOneadapter primitive (#9560)
Bug Fixes
- Renamed
claimOneadapter primitive toconsumeOne(#9568)
For detailed changes, see CHANGELOG
@better-auth/drizzle-adapter
Bug Fixes
- Fixed mixed
AND/ORquery handling in the Drizzle adapter (#9756) - Fixed MySQL adapter to fail fast on unsafe insert return values (#9665)
For detailed changes, see CHANGELOG
@better-auth/passkey
Bug Fixes
- Fixed passkey handling of undefined transports (#9746)
- Fixed passkey challenge consumption to be atomic and propagate inner verification errors (#9622)
For detailed changes, see CHANGELOG
@better-auth/electron
Bug Fixes
- Fixed cookie header serialization to percent-encode values (#9631)
For detailed changes, see CHANGELOG
@better-auth/expo
Bug Fixes
- Fixed large account cookies to be persisted by chunking device storage (#9815)
For detailed changes, see CHANGELOG
@better-auth/kysely-adapter
Bug Fixes
- Fixed Kysely introspector to report SQLite tables as non-views (#9615)
For detailed changes, see CHANGELOG
Contributors
Thanks to everyone who contributed to this release:
@app/better-release, @bytaesu, @chdanielmueller, @cyphercodes, @dipan-ck, @GautamBytes, @gustavovalverde, @ItalyPaleAle, @jsj, @kgarg2468, @Kvizas, @OscarCornish, @Paola3stefania, @ping-maxwell, @reslear, @stewartjarod, @Vishesh-Verma-07
Full changelog: v1.7.0-beta.3...v1.7.0-beta.4