chore(deps): bump the npm_and_yarn group across 1 directory with 1 update
Bumps the npm_and_yarn group with 1 update in the / directory: better-auth.
Updates better-auth from 1.4.22 to 1.6.11
Release notes
Sourced from better-auth's releases.
v1.6.11
better-authBug Fixes
- Added an error code to the
change-email-disabledresponse to help clients identify the rejection reason (#8948)- Fixed access-control role statement types so predefined organization roles expose only their configured permissions in TypeScript (#9507)
- Fixed the anonymous plugin to correctly call
onLinkAccountwhen email verification triggers auto sign-in (#9548)- Fixed device authorization to bind pending codes to the verifying session, preventing any authenticated user from approving or denying another user's device code (#9573)
- Fixed a race condition in the magic-link plugin that allowed concurrent requests to mint multiple sessions from the same single-use token (#9572)
- Fixed the
oidc-providerandmcpplugins to requireclient_secretfor confidential clients on refresh token grants and use constant-time secret comparison (#9576)- Hardened
oidc-providerandmcpplugins to follow OAuth 2.1: removed"none"from advertised signing algorithms, defaulted plain PKCE off, and rejected incomplete PKCE parameters (#9575)- Fixed an invitation takeover vulnerability by enabling
requireEmailVerificationOnInvitationby default and extending the verification gate togetInvitationandlistUserInvitations(#9577)For detailed changes, see
CHANGELOG
@better-auth/oauth-providerBug Fixes
- Fixed a race condition in the OAuth authorization-code grant that allowed concurrent token-exchange requests to mint multiple token sets from the same authorization code
- Fixed a race condition in OAuth refresh-token rotation that allowed concurrent requests to fork refresh token families, and added a
uniqueconstraint onoauthRefreshToken.token- Fixed OAuth account linking to require a verified local email before linking an OAuth identity to a local account (#9578)
For detailed changes, see
CHANGELOG
@better-auth/coreBug Fixes
- Fixed an invalid import list in the instrumentation module (#9582)
- Widened
advanced.ipAddress.ipv6Subnetto accept any valid IPv6 prefix length (0-128) instead of a narrow set of values (#9545)For detailed changes, see
CHANGELOG
@better-auth/scimBug Fixes
- Fixed session cleanup to run when admin, anonymous, or SCIM operations delete a user (#9162)
- Fixed
generateSCIMTokento rejectproviderIdvalues that collide with built-in account providers, preventing tokens from authenticating against unintended accounts (#9579)For detailed changes, see
CHANGELOG
@better-auth/ssoBug Fixes
- Fixed SSO provider registration to require an org admin or owner role, preventing any organization member from registering providers (#9220)
- Fixed an SSRF vulnerability by validating user-supplied OIDC endpoint URLs against a public-routable host allowlist at provider registration and update (#9574)
... (truncated)
Changelog
Sourced from better-auth's changelog.
1.6.11
Patch Changes
#9568
0cbddb8Thanks@gustavovalverde! - AddinternalAdapter.consumeVerificationValue(identifier): atomically consume a verification row keyed by identifier. The first concurrent caller receives the row; later racers receivenull. Backed by a newDBAdapter.consumeOneprimitive implemented natively per adapter (memory, mongo, drizzle, kysely, prisma), with atransaction(findMany + delete)factory fallback.SecondaryStorage.getAndDeleteis added as an optional companion; Redis ships it via an atomic Lua get-and-delete operation for compatibility with Redis versions before 6.2.#9162
a26333bThanks@ping-maxwell! - fix: cleanup sessions when admin, anonymous, or SCIM deletes a user#9573
99a254aThanks@gustavovalverde! - fix(device-authorization): require verify-time ownership claim for approve/denyPending device codes were not bound to the user who entered the code on the verification page until approval, leaving a window where any authenticated user could approve or deny another user's pending code by knowing the
user_code.GET /devicenow claims the pending row for the calling session, andPOST /device/approveandPOST /device/denyrequire the calling session to match the claimed owner. Custom verification pages must be served to an authenticated session for the flow to succeed.#8948
ee93485Thanks@ping-maxwell! - fix: add error code to change-email-disabled#9572
5f09d56Thanks@gustavovalverde! - Fix race condition in themagic-linkplugin's verify handler that allowed two concurrent requests to mint two sessions from the same single-use token. The handler now consumes the verification row atomically viainternalAdapter.consumeVerificationValue, so a given magic link mints at most one session regardless of concurrency. TheallowedAttemptsoption is retained for backward compatibility but no longer multiplies successful redemptions; tokens are single-use. The second-redeem error code changes fromATTEMPTS_EXCEEDEDtoINVALID_TOKEN(the token no longer exists after consumption).
b4bc65aThanks@gustavovalverde! - Fix race condition in the OAuth authorization-code grant: two concurrent token-exchange requests sharing the samecodecould both pass the find step before either delete completed and each mint an independent access/refresh/id token set. Theauthorization_codehandler in@better-auth/oauth-provider, plus the legacyoidc-providerandmcpplugins inbetter-auth, now consume the verification row atomically viainternalAdapter.consumeVerificationValue. The first caller mints tokens; concurrent racers receiveinvalid_grant(RFC 6749 §5.2). Malformed-verification-value branches in@better-auth/oauth-providerpreviously returned a project-specificinvalid_verificationcode; those are nowinvalid_grantso spec-compliant clients can branch on the standard code.#9578
da7e50bThanks@gustavovalverde! -handleOAuthUserInfo(used by every social provider, generic-oauth, oauth-proxy, SSO OIDC and SAML, and idToken sign-in) implicitly linked a returning OAuth identity into a local user row whenever the IdP'semail_verifiedclaim was true or the provider was trusted. The local row's ownemailVerifiedflag was read only to flip it after linking, never as a precondition.POST /sign-up/emailcreates rows withemailVerified: falsefor any caller, so an attacker who pre-registered a victim's email at the application could wait for the legitimate user's first OAuth sign-in: the IdP's verified claim was treated as ownership proof, and the victim's IdP identity was linked into the attacker-owned row.The implicit-link gate now requires
dbUser.user.emailVerified === truein addition to the provider trust check by default. A newaccount.accountLinking.requireLocalEmailVerifiedoption (defaulttrue) is the public surface for this gate. Apps whose users sign up via OAuth without verifying their email locally can opt back into the legacy behavior withaccount: { accountLinking: { requireLocalEmailVerified: false } }; understand the takeover risk before doing so. The option is@deprecated; a FIXME at each gate site points at the next-minor follow-up onnextthat drops the option and makes the gate unconditional.The
one-tapplugin honored its own copy of the gate and was updated identically:requireLocalEmailVerifiedandaccountLinking.disableImplicitLinkingboth apply on/one-tap/callback. Theemail_verifiedclaim from the Google ID token is now normalized viatoBooleanso a string"false"is treated as falsy.Test fixtures across
admin,oidc-provider,mcp,generic-oauth,last-login-method, andoauth-providersuites now mark usersemailVerified: truevia adatabaseHooks.user.create.beforehook (or thedisableTestUseropt-in on the oauth-provider RP) so the suites continue to exercise their role/flow logic rather than the new gate.#9507
a1c9f3cThanks@GautamBytes! - Preserve exact access-control role statement types so predefined organization roles expose only their configured permissions in TypeScript.#9577
23094a6Thanks@gustavovalverde! - The organization plugin's invitation recipient endpoints (acceptInvitation,rejectInvitation,getInvitation,listUserInvitations) treatedinvitation.email.toLowerCase() === session.user.email.toLowerCase()as proof that the calling user owned the invited address. A session-authenticated user whose email matched but was never verified passed the gate, so anyone who could pre-register an unverified account at a victim's email could accept invitations addressed to that email. TherequireEmailVerificationOnInvitationopt-in option closed the gap only when explicitly enabled and did not protectgetInvitationorlistUserInvitationsat all.The gate is now applied on all four recipient endpoints and the
requireEmailVerificationOnInvitationoption default flips fromfalsetotrueso existing apps are secure by default. Apps that intentionally accept invitations from unverified accounts can keep the legacy permissive behavior withorganization({ requireEmailVerificationOnInvitation: false }), but they should understand the takeover risk before doing so. Server-side calls tolistUserInvitationswithctx.query.emailand no session continue to bypass the gate (the caller is trusted).The option is
@deprecated. The next-minor release onnextremoves it entirely and makes the gate unconditional.#9548
142b86cThanks@dipan-ck! - anonymous plugin now correctly calls onLinkAccount when email verification triggers auto sign-in#9576
1f2ff42Thanks@gustavovalverde! - fix(oidc-provider, mcp): authenticate confidential clients on refresh_token grant and harden secret comparisonRefresh-token grants on the legacy
oidc-providerandmcpplugins now require the registeredclient_secretfrom confidential clients, matching theauthorization_codepath. Public clients (wherecode_verifiersubstitutes for the secret on the auth-code grant) continue to skip secret validation. Secret comparisons across both plugins now use constant-time equality. The/mcp/tokenendpoint no longer emits a wildcard CORSAccess-Control-Allow-Origin: *header.These plugins are deprecated in favor of
@better-auth/oauth-provider, which is unaffected. New deployments should adopt the replacement; this patch keeps existing deployments protected while migrating.#9575
699b09aThanks@gustavovalverde! - fix(oidc-provider, mcp): drop"none"from advertised signing algorithms, defaultallowPlainCodeChallengeMethodtofalse, and reject missing PKCE methodThe legacy
oidc-providerandmcpplugins now follow OAuth 2.1 (RFC 9700) on three protocol gates:
id_token_signing_alg_values_supported(oidc-provider, mcp) andresource_signing_alg_values_supported(mcp) no longer include"none". Relying parties that negotiate from this list will no longer be steered toward unsigned tokens.allowPlainCodeChallengeMethoddefaults tofalse. Callers who needplainPKCE must opt in explicitly.- Under the secure default the authorize endpoint no longer silently rewrites a missing
code_challenge_methodto"plain"before the allowlist check. A request that providescode_challengewithoutcode_challenge_methodis now rejected withinvalid_request; the inverse case (code_challenge_methodwithoutcode_challenge) is also rejected so no inconsistent PKCE state is persisted on the authorization code record.Non-breaking for callers who never relied on
"none"advertisement or the plain default. Callers who explicitly setallowPlainCodeChallengeMethod: truekeepplainon the allowlist and retain the legacy "missing method defaults to plain" behavior for backward compatibility, so existing integrations that opted into plain PKCE continue to work. The next-minor onnextwill drop both theplainallowlist entry and this fallback; until then, the option is the single explicit knob for legacy behavior. Migrate to@better-auth/oauth-providerfor the canonical, spec-aligned implementation.
... (truncated)
Commits
f41514echore: release v1.6.11 (#9532)699b09afix(oidc-provider, mcp): drop "none" alg, default plain PKCE off, reject miss...b4bc65aMerge commit from forka1c9f3cfix(access): preserve exact role statement types (#9507)da7e50bfix(oauth): block OAuth linking to unverified local accounts (#9578)23094a6fix(organization): default-onrequireEmailVerificationOnInvitation& extend...1f2ff42fix(oidc-provider, mcp): authenticate confidential clients on refresh_token g...5f09d56fix(magic-link): consume verification token atomically on verify (#9572)99a254afix(device-authorization): bind approval to verifier session (#9573)0cbddb8refactor(db): renameclaimOneadapter primitive toconsumeOne(#9568)- Additional commits viewable in compare view
Maintainer changes
This version was pushed to npm by GitHub Actions, a new releaser for better-auth since your current version.
Updates better-auth from 1.4.22 to 1.6.11
Release notes
Sourced from better-auth's releases.
v1.6.11
better-authBug Fixes
- Added an error code to the
change-email-disabledresponse to help clients identify the rejection reason (#8948)- Fixed access-control role statement types so predefined organization roles expose only their configured permissions in TypeScript (#9507)
- Fixed the anonymous plugin to correctly call
onLinkAccountwhen email verification triggers auto sign-in (#9548)- Fixed device authorization to bind pending codes to the verifying session, preventing any authenticated user from approving or denying another user's device code (#9573)
- Fixed a race condition in the magic-link plugin that allowed concurrent requests to mint multiple sessions from the same single-use token (#9572)
- Fixed the
oidc-providerandmcpplugins to requireclient_secretfor confidential clients on refresh token grants and use constant-time secret comparison (#9576)- Hardened
oidc-providerandmcpplugins to follow OAuth 2.1: removed"none"from advertised signing algorithms, defaulted plain PKCE off, and rejected incomplete PKCE parameters (#9575)- Fixed an invitation takeover vulnerability by enabling
requireEmailVerificationOnInvitationby default and extending the verification gate togetInvitationandlistUserInvitations(#9577)For detailed changes, see
CHANGELOG
@better-auth/oauth-providerBug Fixes
- Fixed a race condition in the OAuth authorization-code grant that allowed concurrent token-exchange requests to mint multiple token sets from the same authorization code
- Fixed a race condition in OAuth refresh-token rotation that allowed concurrent requests to fork refresh token families, and added a
uniqueconstraint onoauthRefreshToken.token- Fixed OAuth account linking to require a verified local email before linking an OAuth identity to a local account (#9578)
For detailed changes, see
CHANGELOG
@better-auth/coreBug Fixes
- Fixed an invalid import list in the instrumentation module (#9582)
- Widened
advanced.ipAddress.ipv6Subnetto accept any valid IPv6 prefix length (0-128) instead of a narrow set of values (#9545)For detailed changes, see
CHANGELOG
@better-auth/scimBug Fixes
- Fixed session cleanup to run when admin, anonymous, or SCIM operations delete a user (#9162)
- Fixed
generateSCIMTokento rejectproviderIdvalues that collide with built-in account providers, preventing tokens from authenticating against unintended accounts (#9579)For detailed changes, see
CHANGELOG
@better-auth/ssoBug Fixes
- Fixed SSO provider registration to require an org admin or owner role, preventing any organization member from registering providers (#9220)
- Fixed an SSRF vulnerability by validating user-supplied OIDC endpoint URLs against a public-routable host allowlist at provider registration and update (#9574)
... (truncated)
Changelog
Sourced from better-auth's changelog.
1.6.11
Patch Changes
#9568
0cbddb8Thanks@gustavovalverde! - AddinternalAdapter.consumeVerificationValue(identifier): atomically consume a verification row keyed by identifier. The first concurrent caller receives the row; later racers receivenull. Backed by a newDBAdapter.consumeOneprimitive implemented natively per adapter (memory, mongo, drizzle, kysely, prisma), with atransaction(findMany + delete)factory fallback.SecondaryStorage.getAndDeleteis added as an optional companion; Redis ships it via an atomic Lua get-and-delete operation for compatibility with Redis versions before 6.2.#9162
a26333bThanks@ping-maxwell! - fix: cleanup sessions when admin, anonymous, or SCIM deletes a user#9573
99a254aThanks@gustavovalverde! - fix(device-authorization): require verify-time ownership claim for approve/denyPending device codes were not bound to the user who entered the code on the verification page until approval, leaving a window where any authenticated user could approve or deny another user's pending code by knowing the
user_code.GET /devicenow claims the pending row for the calling session, andPOST /device/approveandPOST /device/denyrequire the calling session to match the claimed owner. Custom verification pages must be served to an authenticated session for the flow to succeed.#8948
ee93485Thanks@ping-maxwell! - fix: add error code to change-email-disabled#9572
5f09d56Thanks@gustavovalverde! - Fix race condition in themagic-linkplugin's verify handler that allowed two concurrent requests to mint two sessions from the same single-use token. The handler now consumes the verification row atomically viainternalAdapter.consumeVerificationValue, so a given magic link mints at most one session regardless of concurrency. TheallowedAttemptsoption is retained for backward compatibility but no longer multiplies successful redemptions; tokens are single-use. The second-redeem error code changes fromATTEMPTS_EXCEEDEDtoINVALID_TOKEN(the token no longer exists after consumption).
b4bc65aThanks@gustavovalverde! - Fix race condition in the OAuth authorization-code grant: two concurrent token-exchange requests sharing the samecodecould both pass the find step before either delete completed and each mint an independent access/refresh/id token set. Theauthorization_codehandler in@better-auth/oauth-provider, plus the legacyoidc-providerandmcpplugins inbetter-auth, now consume the verification row atomically viainternalAdapter.consumeVerificationValue. The first caller mints tokens; concurrent racers receiveinvalid_grant(RFC 6749 §5.2). Malformed-verification-value branches in@better-auth/oauth-providerpreviously returned a project-specificinvalid_verificationcode; those are nowinvalid_grantso spec-compliant clients can branch on the standard code.#9578
da7e50bThanks@gustavovalverde! -handleOAuthUserInfo(used by every social provider, generic-oauth, oauth-proxy, SSO OIDC and SAML, and idToken sign-in) implicitly linked a returning OAuth identity into a local user row whenever the IdP'semail_verifiedclaim was true or the provider was trusted. The local row's ownemailVerifiedflag was read only to flip it after linking, never as a precondition.POST /sign-up/emailcreates rows withemailVerified: falsefor any caller, so an attacker who pre-registered a victim's email at the application could wait for the legitimate user's first OAuth sign-in: the IdP's verified claim was treated as ownership proof, and the victim's IdP identity was linked into the attacker-owned row.The implicit-link gate now requires
dbUser.user.emailVerified === truein addition to the provider trust check by default. A newaccount.accountLinking.requireLocalEmailVerifiedoption (defaulttrue) is the public surface for this gate. Apps whose users sign up via OAuth without verifying their email locally can opt back into the legacy behavior withaccount: { accountLinking: { requireLocalEmailVerified: false } }; understand the takeover risk before doing so. The option is@deprecated; a FIXME at each gate site points at the next-minor follow-up onnextthat drops the option and makes the gate unconditional.The
one-tapplugin honored its own copy of the gate and was updated identically:requireLocalEmailVerifiedandaccountLinking.disableImplicitLinkingboth apply on/one-tap/callback. Theemail_verifiedclaim from the Google ID token is now normalized viatoBooleanso a string"false"is treated as falsy.Test fixtures across
admin,oidc-provider,mcp,generic-oauth,last-login-method, andoauth-providersuites now mark usersemailVerified: truevia adatabaseHooks.user.create.beforehook (or thedisableTestUseropt-in on the oauth-provider RP) so the suites continue to exercise their role/flow logic rather than the new gate.#9507
a1c9f3cThanks@GautamBytes! - Preserve exact access-control role statement types so predefined organization roles expose only their configured permissions in TypeScript.#9577
23094a6Thanks@gustavovalverde! - The organization plugin's invitation recipient endpoints (acceptInvitation,rejectInvitation,getInvitation,listUserInvitations) treatedinvitation.email.toLowerCase() === session.user.email.toLowerCase()as proof that the calling user owned the invited address. A session-authenticated user whose email matched but was never verified passed the gate, so anyone who could pre-register an unverified account at a victim's email could accept invitations addressed to that email. TherequireEmailVerificationOnInvitationopt-in option closed the gap only when explicitly enabled and did not protectgetInvitationorlistUserInvitationsat all.The gate is now applied on all four recipient endpoints and the
requireEmailVerificationOnInvitationoption default flips fromfalsetotrueso existing apps are secure by default. Apps that intentionally accept invitations from unverified accounts can keep the legacy permissive behavior withorganization({ requireEmailVerificationOnInvitation: false }), but they should understand the takeover risk before doing so. Server-side calls tolistUserInvitationswithctx.query.emailand no session continue to bypass the gate (the caller is trusted).The option is
@deprecated. The next-minor release onnextremoves it entirely and makes the gate unconditional.#9548
142b86cThanks@dipan-ck! - anonymous plugin now correctly calls onLinkAccount when email verification triggers auto sign-in#9576
1f2ff42Thanks@gustavovalverde! - fix(oidc-provider, mcp): authenticate confidential clients on refresh_token grant and harden secret comparisonRefresh-token grants on the legacy
oidc-providerandmcpplugins now require the registeredclient_secretfrom confidential clients, matching theauthorization_codepath. Public clients (wherecode_verifiersubstitutes for the secret on the auth-code grant) continue to skip secret validation. Secret comparisons across both plugins now use constant-time equality. The/mcp/tokenendpoint no longer emits a wildcard CORSAccess-Control-Allow-Origin: *header.These plugins are deprecated in favor of
@better-auth/oauth-provider, which is unaffected. New deployments should adopt the replacement; this patch keeps existing deployments protected while migrating.#9575
699b09aThanks@gustavovalverde! - fix(oidc-provider, mcp): drop"none"from advertised signing algorithms, defaultallowPlainCodeChallengeMethodtofalse, and reject missing PKCE methodThe legacy
oidc-providerandmcpplugins now follow OAuth 2.1 (RFC 9700) on three protocol gates:
id_token_signing_alg_values_supported(oidc-provider, mcp) andresource_signing_alg_values_supported(mcp) no longer include"none". Relying parties that negotiate from this list will no longer be steered toward unsigned tokens.allowPlainCodeChallengeMethoddefaults tofalse. Callers who needplainPKCE must opt in explicitly.- Under the secure default the authorize endpoint no longer silently rewrites a missing
code_challenge_methodto"plain"before the allowlist check. A request that providescode_challengewithoutcode_challenge_methodis now rejected withinvalid_request; the inverse case (code_challenge_methodwithoutcode_challenge) is also rejected so no inconsistent PKCE state is persisted on the authorization code record.Non-breaking for callers who never relied on
"none"advertisement or the plain default. Callers who explicitly setallowPlainCodeChallengeMethod: truekeepplainon the allowlist and retain the legacy "missing method defaults to plain" behavior for backward compatibility, so existing integrations that opted into plain PKCE continue to work. The next-minor onnextwill drop both theplainallowlist entry and this fallback; until then, the option is the single explicit knob for legacy behavior. Migrate to@better-auth/oauth-providerfor the canonical, spec-aligned implementation.
... (truncated)
Commits
f41514echore: release v1.6.11 (#9532)699b09afix(oidc-provider, mcp): drop "none" alg, default plain PKCE off, reject miss...b4bc65aMerge commit from forka1c9f3cfix(access): preserve exact role statement types (#9507)da7e50bfix(oauth): block OAuth linking to unverified local accounts (#9578)23094a6fix(organization): default-onrequireEmailVerificationOnInvitation& extend...1f2ff42fix(oidc-provider, mcp): authenticate confidential clients on refresh_token g...5f09d56fix(magic-link): consume verification token atomically on verify (#9572)99a254afix(device-authorization): bind approval to verifier session (#9573)0cbddb8refactor(db): renameclaimOneadapter primitive toconsumeOne(#9568)- Additional commits viewable in compare view
Maintainer changes
This version was pushed to npm by GitHub Actions, a new releaser for better-auth since your current version.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore <dependency name> major versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)@dependabot ignore <dependency name> minor versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)@dependabot ignore <dependency name>will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)@dependabot unignore <dependency name>will remove all of the ignore conditions of the specified dependency@dependabot unignore <dependency name> <ignore condition>will remove the ignore condition of the specified dependency and ignore conditions
You can disable automated security fix PRs for this repo from the Security Alerts page.
Summary by cubic
Upgrade better-auth to 1.6.11 across the monorepo to pick up security hardening and bug fixes, and bump vitest to 4.1.8 in dev packages. This improves OAuth/SSO safety, closes invitation and magic-link races, and aligns legacy providers with OAuth 2.1.
-
Dependencies
better-auth: 1.4.22 → 1.6.11 (apps/api, apps/framework-editor, apps/portal, packages/auth, root)- Requires verified local email before OAuth linking
- Invitations now require verified email by default
- Atomic verification consumption prevents duplicate sessions/tokens
- Device authorization bound to verifying session
- Legacy
oidc-provider/mcphardened (drop "none" alg, plain PKCE off by default,client_secretrequired on refresh)
vitest: 3.2.4 → 4.1.8 (apps/app, apps/framework-editor, packages/device-agent, packages/email, packages/ui)
-
Migration
- If you allow OAuth sign-ups without local email verification, set
account.accountLinking.requireLocalEmailVerified: falsetemporarily. - If you accept org invitations from unverified users, set
organization({ requireEmailVerificationOnInvitation: false })temporarily. - Custom device verification pages must run in an authenticated session.
- For legacy
oidc-provider/mcp, ensure clients sendclient_secreton refresh-token grants and include a PKCE method when used.
- If you allow OAuth sign-ups without local email verification, set