Visitar URL original
fix(jwt): verify tokens with the stored key's algorithm by bytaesu · Pull Request #11925 · better-auth/better-auth · GitHub
Skip to content

fix(jwt): verify tokens with the stored key's algorithm - #11925

Merged
bytaesu merged 1 commit into
mainfrom
2026-10-20/fix/jwt-key-algorithm
Oct 19, 2026
Merged

bytaesu merged 1 commit into
mainfrom
2026-10-20/fix/jwt-key-algorithm

Conversation

@bytaesu

@bytaesu bytaesu commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

Summary by cubic

Fixes JWT verification so tokens are verified with the algorithm of the stored key instead of the one named in the token header, preventing signatures from being accepted under the wrong algorithm. Also warns when a JWT is signed or verified without an issuer or audience, which happens on a direct auth.api call when no baseURL is configured.

  • The token header's alg no longer falls back for cookie-cache JWTs or key imports.
  • JWT verification now passes an explicit algorithms list so the verifier only accepts the key's algorithm.
  • Default algorithm EdDSA is now a shared constant (DEFAULT_JWK_ALG) with a getDefaultKeyAlg helper.
  • Warns when signing or verifying without an issuer or audience; docs note to set baseURL or jwt.issuer/jwt.audience.

Written for commit 9c3e702. Summary will update on new commits.

View guided diff Turn on auto-fix

Copilot AI balanced review requested due to automatic review settings October 19, 2026 21:54
@bytaesu
bytaesu requested review from a team as code owners October 19, 2026 21:54
@bytaesu
bytaesu requested review from gustavovalverde and removed request for a team October 19, 2026 21:54
@vercel

vercel Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
better-auth Ready Ready Preview Oct 19, 2026 10:47pm UTC
1 Skipped Deployment
Project Deployment Actions Updated
better-auth-demo Ignored Ignored Oct 19, 2026 10:47pm UTC

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@better-release better-release Bot added core Core infra, API routes, session, cookies, client SDK docs Documentation, demos labels Oct 19, 2026
@pkg-pr-new

pkg-pr-new Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

@better-auth/api-key

npm i https://pkg.pr.new/@better-auth/api-key@11925

better-auth

npm i https://pkg.pr.new/better-auth@11925

@better-auth/cimd

npm i https://pkg.pr.new/@better-auth/cimd@11925

auth

npm i https://pkg.pr.new/auth@11925

@better-auth/core

npm i https://pkg.pr.new/@better-auth/core@11925

@better-auth/drizzle-adapter

npm i https://pkg.pr.new/@better-auth/drizzle-adapter@11925

@better-auth/electron

npm i https://pkg.pr.new/@better-auth/electron@11925

@better-auth/expo

npm i https://pkg.pr.new/@better-auth/expo@11925

@better-auth/i18n

npm i https://pkg.pr.new/@better-auth/i18n@11925

@better-auth/kysely-adapter

npm i https://pkg.pr.new/@better-auth/kysely-adapter@11925

@better-auth/mcp

npm i https://pkg.pr.new/@better-auth/mcp@11925

@better-auth/memory-adapter

npm i https://pkg.pr.new/@better-auth/memory-adapter@11925

@better-auth/mongo-adapter

npm i https://pkg.pr.new/@better-auth/mongo-adapter@11925

@better-auth/oauth-provider

npm i https://pkg.pr.new/@better-auth/oauth-provider@11925

@better-auth/passkey

npm i https://pkg.pr.new/@better-auth/passkey@11925

@better-auth/prisma-adapter

npm i https://pkg.pr.new/@better-auth/prisma-adapter@11925

@better-auth/redis-storage

npm i https://pkg.pr.new/@better-auth/redis-storage@11925

@better-auth/scim

npm i https://pkg.pr.new/@better-auth/scim@11925

@better-auth/sso

npm i https://pkg.pr.new/@better-auth/sso@11925

@better-auth/stripe

npm i https://pkg.pr.new/@better-auth/stripe@11925

@better-auth/telemetry

npm i https://pkg.pr.new/@better-auth/telemetry@11925

@better-auth/test-utils

npm i https://pkg.pr.new/@better-auth/test-utils@11925

commit: 9c3e702

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 9 files

This PR changes authentication, authorization, or input validation. Ultrareviews find 2.4x more serious bugs than standard reviews. Comment @cubic-dev-ai ultrareview to run one.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread docs/content/docs/plugins/jwt.mdx Resolved
@greptile-apps

greptile-apps Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge; no actionable new issues remain.

Summary

The JWT plugin now limits verification to the stored key’s algorithm and uses the same default when a key has no algorithm.

  • Regular and cookie-cache JWT checks follow their stored keys' algorithms.
  • JWT calls without issuer or audience settings now produce a warning.

Reviews (2) · Last reviewed commit: "fix(jwt): verify tokens with the stored ..." · Reviewed by Greptile

@bytaesu
bytaesu force-pushed the 2026-10-20/fix/jwt-key-algorithm branch from 22c4b67 to 9c3e702 Compare October 19, 2026 22:46
@bytaesu
bytaesu added this pull request to the merge queue Oct 19, 2026
Merged via the queue into main with commit fb48619 Oct 19, 2026
48 checks passed
@bytaesu
bytaesu deleted the 2026-10-20/fix/jwt-key-algorithm branch October 19, 2026 22:58
rendermani added a commit to cloudya-net/better-auth that referenced this pull request Oct 24, 2026
* fix(generic-oauth): harden Auth0 domain normalization (better-auth#11188)

* fix(session): skip cache cookie when disabled (better-auth#11120)

Co-authored-by: Taesu <bytaesu@gmail.com>

* feat: add Cloudflare social provider (better-auth#9908)

Co-authored-by: Taesu <bytaesu@gmail.com>
Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* fix(core): restore optional atomic adapter methods (better-auth#11189)

* chore: release v1.7.3 (better-auth#11032)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* ci(release): source release notes from changesets (better-auth#11195)

* docs: make header dropdown menus keyboard accessible (better-auth#11184)

Co-authored-by: Taesu <bytaesu@gmail.com>

* docs: update CLI references to `auth` (better-auth#11214)

* fix(core): handle optional OpenTelemetry imports in Metro (better-auth#11210)

* fix(drizzle-adapter): validate schemas in relations v2 (better-auth#11213)

* docs: clarify Drizzle Relations v2 setup (better-auth#11215)

* docs: list ThunderID as a community provider helper (better-auth#11117)

Signed-off-by: Brion <info@brionmario.com>

* docs: update and add community plugin data (better-auth#10929)

- update `better-auth-paystack`
- add `better-auth-flutterwave`
- add `better-auth-solana-payments`

* test(open-api): lock in requestBody for /phone-number/verify (better-auth#11208)

Co-authored-by: Taesu <bytaesu@gmail.com>

* feat(instrumentation): add option to disable tracing (better-auth#11224)

* feat(test): support Vitest 5 (better-auth#11205)

* test: adopt Vitest 5 features (better-auth#11211)

* ci(backport): restore authenticated branch pushes (better-auth#11227)

* chore(deps): bump hono from 4.12.34 to 4.13.7 (better-auth#11225)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* docs: explain the 1.7 account schema transition (better-auth#11196)

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* feat(test-utils): accept additional session fields in auth helpers (better-auth#11217)

* fix(expo): clean up stale session storage (better-auth#11200)

* refactor(expo): extract client storage module (better-auth#11221)

* ci(release): make release workflows reusable (better-auth#11232)

* chore(deps): bump `next` (better-auth#11226)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* fix(expo): chunk storage values by byte size (better-auth#11238)

* docs: update v1.6 docs snapshot (better-auth#11242)

* chore: release v1.7.4 (better-auth#11216)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(deps): remove unused `better-sqlite3` peer dependency (better-auth#11209)

Co-authored-by: Taesu <bytaesu@gmail.com>

* chore: bump `better-fetch` (better-auth#11255)

* ci(release): keep maintenance releases off latest (better-auth#11244)

* refactor(cookies): centralize cookie cache version validation (better-auth#11254)

Co-authored-by: Taesu <bytaesu@gmail.com>

* docs: fix authClient import in Auth0 and Clerk migration guides (better-auth#11248)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix(cimd): avoid pacing successful metadata fetches (better-auth#11161)

* fix(demo): align better-fetch version (better-auth#11264)

* ci(docs): automate version source updates (better-auth#11257)

* fix(drizzle-adapter): defer relation metadata access (better-auth#11263)

* chore: bump `typesense-fumadocs-adapter` (better-auth#11265)

* fix(db): use Kysely metadata for PostgreSQL schema introspection (better-auth#11270)

* refactor(db): model migration targets by dialect (better-auth#11271)

* fix(db): use reported MySQL index byte bounds (better-auth#11272)

* docs(2fa): note that the TOTP URI carries the secret and the email (better-auth#11269)

* feat(postgres): add support for custom schema name in PostgreSQL connections (better-auth#11203)

Co-authored-by: Taesu <bytaesu@gmail.com>

* fix(captcha): log Turnstile verification failures (better-auth#11283)

* docs: sync v1.6 documentation (better-auth#11289)

Co-authored-by: better-release[bot] <273320539+better-release[bot]@users.noreply.github.com>

* fix(core): preserve database option type inference (better-auth#11290)

Co-authored-by: Alexey Sokolov <alexvyber@gmail.com>

* chore: release v1.7.5 (better-auth#11245)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* docs: sync v1.6 documentation (better-auth#11293)

Co-authored-by: better-release[bot] <273320539+better-release[bot]@users.noreply.github.com>

* test(oauth): cover stateless implicit linking across instances (better-auth#11298)

* docs: add Wraps to the email provider list (better-auth#11164)

* fix(prisma-adapter): validate capitalized custom model names (better-auth#11319)

* ci: prevent duplicate backports (better-auth#11364)

* fix(client): preserve auth query snapshots during hydration (better-auth#11316)

Co-authored-by: Taesu <bytaesu@gmail.com>

* docs(plugins): document plugin type registration (better-auth#11352)

* feat(admin): allow bannedUserMessage to be a function of the banned user (better-auth#11325)

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* feat(captcha): add Vercel BotID provider (better-auth#11016)

Co-authored-by: Taesu <bytaesu@gmail.com>
Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* fix(oauth-proxy): support social account linking (better-auth#11268)

* refactor(kysely-adapter): consolidate SQLite introspection (better-auth#11365)

* fix(kysely-adapter): validate schemas on restricted SQLite (better-auth#11366)

* fix: enforce maxPasswordLength before hashing on password verification endpoints (better-auth#11324)

Co-authored-by: Taesu <bytaesu@gmail.com>

* fix(stripe): sync seats after organization resubscription (better-auth#11347)

* fix(kysely-adapter): detect SQLite rowid aliases correctly (better-auth#11374)

* fix(client): prevent stale query overwrites (better-auth#11376)

* fix(db): preserve model identity across adapters (better-auth#11333)

* feat(cli): add check command for schema validation (better-auth#11314)

* chore(release-tooling): update models (better-auth#11381)

* chore: release v1.7.6 (better-auth#11322)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* docs: fix Wether and publically typos in comments (better-auth#11403)

* feat(oauth-provider): export verifyOAuthQueryParams for consent pages (better-auth#11402)

Co-authored-by: Manuel Lautenschlager <ml@webrender.de>

* docs: clarify maintenance triage guidance (better-auth#11411)

* docs: correct the encryptOAuthTokens cipher in its JSDoc (better-auth#11409)

* ci(release): clarify retargeting message (better-auth#11412)

* docs: update Creem plugin docs for `@creem_io/better-auth` 2.0 (better-auth#11397)

* docs: only load the homepage demo video for the active theme (better-auth#11429)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs: cut homepage weight on slow connections (logos, avatars, fonts, poster) (better-auth#11430)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs: prefetch homepage media after load on fast connections to stop scroll pop-in (better-auth#11431)

* docs: add `@eusend_dev/better-auth` to community plugins (better-auth#11447)

* docs: add eusend to the email provider list (better-auth#11446)

* chore(cspell): add eusend to cspell dictionary (better-auth#11448)

* docs: update enterprise pricing details (better-auth#11369)

* docs: update CLI command in drizzle adapter guide (better-auth#11453)

* docs(chargebee): fix cli command and update migration guidance (better-auth#11456)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* docs: update test helper import in contributing guide (better-auth#11454)

* docs: add `@stellartools/betterauth-adapter` to community plugins (better-auth#11451)

* chore(cspell): add devodii to cspell directory (better-auth#11460)

* feat(oauth-provider): add validateRedirectUri option for custom redirect validation (better-auth#8686)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* chore: bump undici (better-auth#11474)

* fix(rate-limit): set JSON content type on 429 responses (better-auth#11469)

* fix(captcha): return JSON content type for errors (better-auth#11476)

* fix(drizzle-adapter): re-check the incrementOne guard on the UPDATE (better-auth#11331)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(auth): honor social disableSignUp for ID token sign-in (better-auth#11491)

* fix(organization): refresh active organization after email sign-in (better-auth#11375)

* fix(auth): isolate verification records and encryption purposes (better-auth#11494)

* fix(kysely-adapter): recheck consumeOne guards on deletion (better-auth#11495)

* chore: release v1.7.7 (better-auth#11413)

* docs(magic-link): correct APIMethod contract and document rateLimit (better-auth#11497)

Co-authored-by: Taesu <bytaesu@gmail.com>

* docs(email-password): correct APIMethod contracts (better-auth#11499)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* docs(rate-limit): correct default window (better-auth#11492)

Co-authored-by: Taesu <bytaesu@gmail.com>

* docs(captcha): clarify protected endpoints (better-auth#11511)

* fix(db): preserve foreign key identity in migrations (better-auth#11505)

* fix(deps): align `@better-auth/utils` with `better-call` (better-auth#11512)

* fix(stripe): bail out of checkout.session.completed for non-subscription modes (better-auth#9684)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* docs: add documentation for new dash/sentinel options (better-auth#11526)

* fix(mongodb-adapter): don't abort a transaction after commit was attempted (better-auth#11014)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* chore: bump tanstack start devDeps (better-auth#11539)

* chore: bump `better-call` (better-auth#11540)

* fix(last-login-method): keep defaults for undefined options (better-auth#11549)

* docs(mongo-adapter): clarify transaction setup (better-auth#11550)

* fix(custom-session): propagate session lookup errors (better-auth#11391)

Co-authored-by: arjunpkulkarni <arjunpkulkarni@gmail.com>
Co-authored-by: breken-ai <312387581+breken-ai@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>
Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* fix(db): use static zod lookup in toZodSchema so locales tree-shake (better-auth#10866)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* fix(custom-session): forward session cookie cleanup when session is null (better-auth#10591)

Co-authored-by: Taesu <bytaesu@gmail.com>

* refactor(db): remove unnecessary any from toZodSchema (better-auth#11552)

* fix(oauth-provider): resolve exactOptionalPropertyTypes incompatibility (better-auth#10266)

Co-authored-by: shiminshen <16914659+shiminshen@users.noreply.github.com>
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(mcp): keep McpOptions assignable to OAuthOptions under exactOptionalPropertyTypes (better-auth#11635)

* fix(organization): published types fail with skipLibCheck: false (better-auth#11637)

* fix(db): keep derived replay-marker ids under uuid and serial ids (better-auth#11625)

Co-authored-by: Chandan P <95340276+NoiceHax@users.noreply.github.com>
Co-authored-by: onmax <22072217+onmax@users.noreply.github.com>

* fix(core): name Atlassian in user info error log (better-auth#11592)

* fix(db): omit non-returned fields from output schema types (better-auth#11565)

* fix(sso): reject mismatched OIDC issuers (better-auth#11438)

Co-authored-by: Taesu <bytaesu@gmail.com>

* chore(scim): ensure inactive SCIM user resources can be reactivated (better-auth#11167)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(scim): treat JSON null as unassigned in SCIM requests (better-auth#11638)

Co-authored-by: Jonathan Samines <jn.samines@gmail.com>
Co-authored-by: sufiyan733 <kanekigaming786@gmail.com>

* fix(scim): match attribute names case-insensitively (better-auth#11644)

* fix(core): run after-commit hooks when the transaction fallback rolls nothing back (better-auth#11645)

* fix(session): defer secondary-storage writes only when the database holds the session (better-auth#11643)

* fix(password): revoke sessions and write the new password atomically (better-auth#11626)

* fix(password): consume the reset token inside the reset transaction (better-auth#11646)

Co-authored-by: edenbuilds <279970382+edenbuilds@users.noreply.github.com>
Co-authored-by: omkar1work <omkar1work@gmail.com>

* fix(oauth-provider): accept host-bearing custom-scheme native redirects (better-auth#10956)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* docs(integrations): add Effect integration guide (better-auth#11566)

* fix(better-auth): allow SvelteKit 3 as a peer dependency (better-auth#11488)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(kysely-adapter): allow concurrent queries on the D1 dialect (better-auth#11490)

Co-authored-by: Taesu <bytaesu@gmail.com>

* docs: add `@octopi-ai/better-enrollment` to community plugins (better-auth#11653)

* fix(scim): return 409 when concurrent updates claim the same unique key (better-auth#11669)

* feat(oauth-provider): allow client disable through admin update (better-auth#11654)

* feat(oauth-provider): link resources during managed client registration (better-auth#11655)

* feat(oauth-provider): pass client ID to privilege checks (better-auth#11658)

* docs(oauth-provider): show client-aware access token claims (better-auth#11656)

* fix(sso): accept partial mappings when updating a provider (better-auth#11378)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(core): resolve pure AsyncLocalStorage on first use (better-auth#11712)

* fix(core): prevent stalled AsyncLocalStorage initialization (better-auth#11711)

* fix(magic-link): stop double-decoding callback URLs on verify (better-auth#11174)

Co-authored-by: Taesu <bytaesu@gmail.com>

* docs: add good-webhooks to community plugins (better-auth#11697)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* docs: fix Electron and Polar example syntax (better-auth#11587)

* docs: update JWT docs to list all fields (better-auth#11339)

* docs: open header dropdowns on activation instead of focus (better-auth#11678)

* test(organization): create shared fixtures in beforeAll (better-auth#11709)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* fix(session): fall back to database for bulk session lookups (better-auth#11718)

Co-authored-by: choksi2212 <choksi2212@users.noreply.github.com>

* fix(mongo-adapter): abort a transaction whose commit did not complete (better-auth#11602)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(drizzle-adapter): support dates in string columns (better-auth#11731)

Co-authored-by: ping-maxwell <maxwell.multinite@gmail.com>

* fix(demo): keep OAuth token responses uncacheable in development (better-auth#11742)

* fix(sso): support array of emails in OIDC claim resolution (better-auth#11640)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(sso): allow rotating SAML IdP signing certificate with linked accounts (better-auth#11687)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* docs(sso): clarify SAML callbackUrl vs ACS endpoint in 1.7 (better-auth#11703)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(sso): stop treating the SAML post-login redirect as an identity field (better-auth#11743)

* fix(phone-number): use custom verifyOTP when resetting the password (better-auth#10698)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(oauth-provider): keep auth working when startup resource seeding fails (better-auth#11726)

Co-authored-by: Panagiotis Plytas <34184381+pplytas@users.noreply.github.com>
Co-authored-by: Arjun Vijay Prakash <137415649+ArjunCodess@users.noreply.github.com>
Co-authored-by: Tushar <192458782+Tushar-Khandelwal-2004@users.noreply.github.com>
Co-authored-by: zoom-dustin-moriarty <221604897+zoom-dustin-moriarty@users.noreply.github.com>

* fix(mongo-adapter): retry a transaction aborted with a transient error (better-auth#11515)

Co-authored-by: Maxwell Afamefuna Nzekwe <70326615+maxnze1@users.noreply.github.com>
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(generic-oauth): retry discovery for providers skipped at startup (better-auth#11750)

Co-authored-by: mangomac <mangomac@users.noreply.github.com>

* fix(core): verify microsoft entra id tokens when jwks keys omit alg (better-auth#11663)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(core): allow 30s of clock skew when verifying ID tokens (better-auth#11749)

Co-authored-by: Lohith <ssvlohith@gmail.com>

* ci(release): keep PR titles for every changeset a PR adds (better-auth#11759)

* chore: release v1.7.8 (better-auth#11513)

* fix(oauth-provider): validate DPoP against public URL (better-auth#10799)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(oauth-provider): distinguish post-login continuation from initial selection (better-auth#11185)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(demo): link dynamically registered MCP clients to the MCP resource (better-auth#11764)

* fix(api): await onAPIError.onError and log hook failures (better-auth#11766)

* chore: bump `@biomejs/biome` (better-auth#11760)

* test: fix test names in bearer and organization (better-auth#11768)

* fix(demo): reset loading state after unbanning a user (better-auth#11770)

* fix(demo): show admin action errors instead of success toasts (better-auth#11771)

* chore: release v1.7.9 (better-auth#11761)

* refactor(demo): share demo base URL and MCP resource (better-auth#11765)

* fix(oauth-provider): refuse trusted-client changes with 400, not 500 (better-auth#11781)

* feat(oauth-provider): let private_key_jwt clients rotate their own keys (better-auth#11695)

* test(oauth-provider): force both orderings of the revoke vs rotate race (better-auth#11793)

* fix(oauth-provider): build DPoP htu from the request path (better-auth#11786)

* test(oauth-provider): add black-box DPoP interop smoke tests (better-auth#11791)

* fix(oauth-provider): infer native for http loopback redirect URIs (better-auth#11798)

* fix(oauth-provider): report an unknown client_id as not found (better-auth#11799)

* fix(oauth-provider): accept key-rotation assertions when baseURL ends in a slash (better-auth#11804)

* fix(oauth-provider): keep consent separate per reference (better-auth#11801)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* fix(core): limit JWKS refetches for unknown key IDs (better-auth#11805)

* fix(oauth-provider): keep the supported grants from a dynamic registration (better-auth#11797)

Co-authored-by: Bereket Engida <Bekacru@gmail.com>

* fix(oauth-provider): treat unverifiable JWT access tokens as invalid (better-auth#11596)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(oauth2): report an unreachable JWKS as an error, not an invalid token (better-auth#11612)

Co-authored-by: vhinayindia <281186805+vhinayindia@users.noreply.github.com>
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(oauth-provider): keep approved resources refreshable after a narrowed device poll (better-auth#11815)

* fix(oauth-provider): return invalid_client for an unknown client at the token endpoint (better-auth#11176)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(oauth-provider): return 400 invalid_grant on PKCE verifier mismatch (better-auth#11724)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(core): use a newer cached key set before joining a pending JWKS fetch (better-auth#11810)

* fix(oauth-provider): report an unknown client in a client assertion as not found (better-auth#11811)

* fix(one-tap): add the better-auth/plugins/one-tap subpath export (better-auth#11696)

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* fix(one-tap): stop calling prompt moment methods unsupported under FedCM (better-auth#11821)

Co-authored-by: ping-maxwell <maxwell.multinite@gmail.com>

* fix(one-tap): apply plugin-level autoSelect and cancelOnTapOutside (better-auth#11820)

* fix(better-auth): keep package subpaths in sync with build entries (better-auth#11822)

* fix(one-tap): apply the Google provider's mapProfileToUser and getUserInfo (better-auth#11819)

Co-authored-by: kaiizer777 <kanekigaming786@gmail.com>

* fix(last-login-method): record Google One Tap sign-ins (better-auth#11393)

Co-authored-by: arjunpkulkarni <arjunpkulkarni@gmail.com>
Co-authored-by: breken-ai <312387581+breken-ai@users.noreply.github.com>
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>

* chore: release v1.7.10 (better-auth#11795)

* fix(db): recognize postgres int8 as a number type in migration diffs (better-auth#10719)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* chore: use biome vcs ignore file and ci command (better-auth#11816)

* fix(rate-limit): convert a string lastRequest before computing X-Retry-After (better-auth#11521)

Co-authored-by: Taesu <bytaesu@gmail.com>

* fix(docs): preserve sidebar scroll position on navigation (better-auth#11829)

* fix(oauth-provider): correct consent and continue OpenAPI response schemas (better-auth#10881)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* docs(oauth-provider): explain how clients connect to organizations (better-auth#11831)

* fix(oauth-provider): keep admin changes made during a CIMD refresh (better-auth#11830)

* fix(docs): match documentation sources to release versions (better-auth#11868)

* docs: update SuperSend TX to Groundmail in the email provider list (better-auth#11879)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* test(adapter): surface swallowed assertion failures in adapter factory tests (better-auth#11817)

* fix(expo): send origin for id token link social (better-auth#10207)

Co-authored-by: Taesu <bytaesu@gmail.com>

* perf(core): inline OpenTelemetry attribute constants (better-auth#11623)

Co-authored-by: Taesu <bytaesu@gmail.com>

* fix(e2e): prevent hangs during process tree cleanup (better-auth#11885)

* ci: move StarSling jobs to Ubuntu 26.04 (better-auth#11733)

Co-authored-by: starslingdev[bot] <248995740+starslingdev[bot]@users.noreply.github.com>

* docs: redesign docs OG image (better-auth#11888)

* refactor(expo): narrow native scheme in request hooks (better-auth#11889)

* docs: keep hono basePath inline code on one line (better-auth#11890)

* docs: remove beta wording from good-webhooks community plugin entry (better-auth#11877)

* docs: add better-auth-saml-idp to community plugins (better-auth#11905)

* docs: add @agentaos/better-auth to community plugins (better-auth#11896)

Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>

* docs: add ArcadeDB to community adapters (better-auth#11895)

* fix(oauth): verify Twitch and Paybin ID tokens (better-auth#11884)

* fix(core): accept undefined plugin init options under exactOptionalPropertyTypes (better-auth#11907)

* chore: release v1.7.11 (better-auth#11827)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* perf(e2e): stop re-resolving drizzle-kit on every launch (better-auth#10850)

Co-authored-by: starslingdev[bot] <248995740+starslingdev[bot]@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* perf(e2e): skip redundant prisma schema pushes (better-auth#9882)

Co-authored-by: starslingdev[bot] <248995740+starslingdev[bot]@users.noreply.github.com>
Co-authored-by: Taesu <bytaesu@gmail.com>

* fix(oauth): restore Twitch and Paybin ID token handling (better-auth#11920)

* chore: bump `better-call` (better-auth#11921)

* feat(plugin): add `@amank-root/better-auth-razorpay` to community plugin (better-auth#11917)

* fix(core): verify id_tokens with one shared policy (better-auth#11919)

* fix(core): accept undefined fields from mapProfileToUser under exactOptionalPropertyTypes (better-auth#11918)

* docs: add security contact email to `SECURITY.md` (better-auth#11926)

* chore: bump `better-call` (better-auth#11927)

* fix(session): keep the cause of session lookup failures (better-auth#11924)

* fix(jwt): verify tokens with the stored key's algorithm (better-auth#11925)

* fix(oauth-proxy): run the standard callback checks on proxied callbacks (better-auth#11930)

* fix(core): reject ID tokens when the provider has no client ID (better-auth#11931)

* chore: configure Anthropic OSS Scanner (better-auth#11932)

* fix(sso): verify OIDC ID tokens with the shared step (better-auth#11935)

* docs(basic-usage): use twoFactor.verifyTotp instead of verifyTOTP (better-auth#11794)

* fix(mcp): accept only OAuth access tokens in requireMcpAuth (better-auth#11934)

* ci(release-tooling): update release note models and prompts (better-auth#11936)

* ci(release-tooling): collect release note actions and share entry rules (better-auth#11937)

* ci(release-tooling): name affected users in release note actions (better-auth#11938)

* chore: release v1.7.12 (better-auth#11922)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* chore(deps): bump `next` to 16.4.2 (better-auth#11976)

* docs: add better-auth-multi-tenant to community plugins (better-auth#11969)

* docs: locate Typesense build output under Next.js route cache (better-auth#11979)

* docs: sync v1.8 documentation (better-auth#11878)

* feat(vercel): support token endpoint authentication strategies (better-auth#11948)

Signed-off-by: Allen Zhou <46854522+allenzhou101@users.noreply.github.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* fix(build): bump tsdown to 0.23.1 (better-auth#11985)

* chore(deps): update dependencies (better-auth#11984)

* refactor(cloudflare): standardize token endpoint auth options (better-auth#11997)

* ci(dependabot): limit demo updates to security fixes (better-auth#11998)

---------

Signed-off-by: Brion <info@brionmario.com>
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Allen Zhou <46854522+allenzhou101@users.noreply.github.com>
Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>
Co-authored-by: Max <maximogarciamtnez@gmail.com>
Co-authored-by: Taesu <bytaesu@gmail.com>
Co-authored-by: Harshil Agrawal <18901032+harshil1712@users.noreply.github.com>
Co-authored-by: better-release[bot] <273320539+better-release[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Remco <remcostoeten@hotmail.com>
Co-authored-by: Brion Mario <brionbmp@gmail.com>
Co-authored-by: Alexander Asomba <3323537+alexasomba@users.noreply.github.com>
Co-authored-by: Dev M <devtechedge@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Sadman Chowdhury <shadman_siam@yahoo.com>
Co-authored-by: Emmanuel Lucius <58217705+Emmaccen@users.noreply.github.com>
Co-authored-by: Muhammad waleed akhtar <54295894+waleed-mirza@users.noreply.github.com>
Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Usman <81596740+uz1mani@users.noreply.github.com>
Co-authored-by: Tyler <dshukertjr@gmail.com>
Co-authored-by: Alexey Sokolov <alexvyber@gmail.com>
Co-authored-by: Jarod Stewart <jarod@lilikoi.io>
Co-authored-by: Harry Smaje <harry@smaje.net>
Co-authored-by: Abd El-wadoud <Wadiouyt@gmail.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: David Brito <39559632+davbrito@users.noreply.github.com>
Co-authored-by: Mohamed Khaled <mohamedkhaled012@yahoo.com>
Co-authored-by: Robin Wieruch <hello@rwieruch.com>
Co-authored-by: Pedro Santos <pedrocarlos.ti@gmail.com>
Co-authored-by: Bob Micheletto <Micheletto@users.noreply.github.com>
Co-authored-by: Micha Mailänder <87228994+mmailaender@users.noreply.github.com>
Co-authored-by: Bereket Engida <86073083+Bekacru@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Sivert Bjørnerås <64668223+sivertbjo@users.noreply.github.com>
Co-authored-by: Jonathan Samines <jn.samines@gmail.com>
Co-authored-by: Md Sufiyan <kanekigaminz@gmail.com>
Co-authored-by: Emmanuel Odii <emmanuelodii80@gmail.com>
Co-authored-by: Lennon Wang <reekystive@gmail.com>
Co-authored-by: Aryan <60398102+aryan1306@users.noreply.github.com>
Co-authored-by: Chris <43588713+gitmotion@users.noreply.github.com>
Co-authored-by: Md Sufiyan <kanekigaming786@gmail.com>
Co-authored-by: Nikhil kumar gupta <36965562+nikhilgupta58@users.noreply.github.com>
Co-authored-by: Bharat Ranjan <ranjanbharat54@gmail.com>
Co-authored-by: breken <support@brekfuz.com>
Co-authored-by: arjunpkulkarni <arjunpkulkarni@gmail.com>
Co-authored-by: breken-ai <312387581+breken-ai@users.noreply.github.com>
Co-authored-by: Svend <svendbjarne@gmail.com>
Co-authored-by: kdelay <90545043+kdelay@users.noreply.github.com>
Co-authored-by: shiminshen <smshen17@gmail.com>
Co-authored-by: shiminshen <16914659+shiminshen@users.noreply.github.com>
Co-authored-by: Chandan P <95340276+NoiceHax@users.noreply.github.com>
Co-authored-by: onmax <22072217+onmax@users.noreply.github.com>
Co-authored-by: Drew <drewsepeczi@gmail.com>
Co-authored-by: Tushar <khandelwal.tushar8527@gmail.com>
Co-authored-by: edenbuilds <279970382+edenbuilds@users.noreply.github.com>
Co-authored-by: omkar1work <omkar1work@gmail.com>
Co-authored-by: Don Isbell <disbell@razorvision.net>
Co-authored-by: Talat Mahmud <talat@octopi.ai>
Co-authored-by: Panagiotis Plytas <panagiotis.plytas@gmail.com>
Co-authored-by: Deepanshu Pal <40927968+deepanshupal@users.noreply.github.com>
Co-authored-by: Menachem Hornbacher <menachemhornbacher@gmail.com>
Co-authored-by: Adnan <141031946+Adnan-Husayn@users.noreply.github.com>
Co-authored-by: choksi2212 <choksi2212@users.noreply.github.com>
Co-authored-by: Maxwell Afamefuna Nzekwe <70326615+maxnze1@users.noreply.github.com>
Co-authored-by: ping-maxwell <maxwell.multinite@gmail.com>
Co-authored-by: Sandip Godhani <72650657+Sandipxg@users.noreply.github.com>
Co-authored-by: Jash Ramde Karangiya <jashkarangiya@gmail.com>
Co-authored-by: Panagiotis Plytas <34184381+pplytas@users.noreply.github.com>
Co-authored-by: Arjun Vijay Prakash <137415649+ArjunCodess@users.noreply.github.com>
Co-authored-by: Tushar <192458782+Tushar-Khandelwal-2004@users.noreply.github.com>
Co-authored-by: zoom-dustin-moriarty <221604897+zoom-dustin-moriarty@users.noreply.github.com>
Co-authored-by: Bilal Atique <74999164+BilalAtique@users.noreply.github.com>
Co-authored-by: mangomac <mangomac@users.noreply.github.com>
Co-authored-by: Lohith <ssvlohith@gmail.com>
Co-authored-by: Johannes Kares <jk@talentir.com>
Co-authored-by: Bereket Engida <Bekacru@gmail.com>
Co-authored-by: Mahoor <63475702+mahoor@users.noreply.github.com>
Co-authored-by: vhinayindia <vchoudhry1998@gmail.com>
Co-authored-by: vhinayindia <281186805+vhinayindia@users.noreply.github.com>
Co-authored-by: Sahil Jagtap <sahil.jagtap45@gmail.com>
Co-authored-by: Kurtis Tryber <107091310+Ktryberceo@users.noreply.github.com>
Co-authored-by: Nooc <nooc@nooc.me>
Co-authored-by: Christoph Nakazawa <xnakazawa@pm.me>
Co-authored-by: starslingdev[bot] <248995740+starslingdev[bot]@users.noreply.github.com>
Co-authored-by: Panagiotis Plytas <panagiotis@centaur.io>
Co-authored-by: MarkMac <mmcintosh@infowall.com>
Co-authored-by: Panche I. <124242269+PancheI@users.noreply.github.com>
Co-authored-by: DevSnap <39520353+DevSnap@users.noreply.github.com>
Co-authored-by: Aman Kushwaha <70597017+Amank-root@users.noreply.github.com>
Co-authored-by: Alpcan Aydın <alpcan@alpcanaydin.com>
Co-authored-by: Zeeshan <zeeshanqadir568@gmail.com>
Co-authored-by: TOSH KUMAR PATEL <88235853+Weesofficial@users.noreply.github.com>
Co-authored-by: Allen Zhou <46854522+allenzhou101@users.noreply.github.com>
brandhaug added a commit to brandhaug/b2b-saas-starter that referenced this pull request Oct 24, 2026
## pnpm-workspace.yaml (default)

## Dependency Updates

| Package | From | To | Type |
| --- | --- | --- | --- |
| `@better-auth/cimd` | 1.7.11 | 1.7.12 | patch |
| `@better-auth/mcp` | 1.7.11 | 1.7.12 | patch |
| `@better-auth/oauth-provider` | 1.7.11 | 1.7.12 | patch |
| `@better-auth/passkey` | 1.7.11 | 1.7.12 | patch |
| `@better-auth/sso` | 1.7.11 | 1.7.12 | patch |
| `@cloudflare/ai-chat` | 0.12.1 | 0.12.2 | patch |
| `@inlang/plugin-message-format` | 4.5.4 | 4.5.5 | patch |
| `ai` | 7.0.146 | 7.0.148 | patch |
| `better-auth` | 1.7.11 | 1.7.12 | patch |
| `effectful-better-auth` | 1.0.5 | 1.0.7 | patch |

## Release Notes

<details>
<summary><b>@<!---->better-auth/cimd</b> (1.7.11 → 1.7.12)</summary>

> [!IMPORTANT]
> **Action required**
>
> - If you use ID token sign-in with a provider that has no `clientId`,
set `clientId` to every client ID your apps sign in with.
([#11931](better-auth/better-auth#11931))

## `better-auth`

### Bug Fixes

- Fixed the JWT plugin to verify JWTs and session cookie-cache JWTs with
the stored key's algorithm instead of the token header's, and to warn
when signing or verifying a JWT without an issuer or audience
([#11925](better-auth/better-auth#11925))
- Fixed OAuth callbacks completed through the OAuth proxy to run the
same checks as the standard OAuth callback, including issuer and ID
token nonce validation
([#11930](better-auth/better-auth#11930))
- Fixed `auth.api.getSession()` to keep the original database error as
`error.cause` when the session lookup fails
([#11924](better-auth/better-auth#11924))

For detailed changes, see
[`CHANGELOG`](https://github.com/better-auth/better-auth/blob/29735514c737d2abeac2fb84f0691fd316231949/packages/better-auth/CHANGELOG.md)

## `@better-auth/core`

### Bug Fixes

- Fixed `mapProfileToUser` failing to typecheck under
`exactOptionalPropertyTypes` when it returns `undefined` for `name`,
`email`, or `image`
([#11918](better-auth/better-auth#11918))
- Fixed ID token sign-in to reject tokens when the provider has no
client ID, since their audience cannot be checked
([#11931](better-auth/better-auth#11931))
- Fixed a custom Facebook `getUserInfo` to no longer receive
client-submitted access tokens issued to another Facebook app, and ID
tokens missing `exp` or `iat` are now rejected
([#11919](better-auth/better-auth#11919))
- Restored the Twitch and Paybin ID token handling from before 1.7.11,
which made account info fail once the ID token stored at sign-in expired
([#11920](https://github.com/better-auth/bette

…[full
notes](https://github.com/better-auth/better-auth/releases/tag/v1.7.12)

</details>

<details>
<summary><b>@<!---->better-auth/mcp</b> (1.7.11 → 1.7.12)</summary>

> [!IMPORTANT]
> **Action required**
>
> - If you use ID token sign-in with a provider that has no `clientId`,
set `clientId` to every client ID your apps sign in with.
([#11931](better-auth/better-auth#11931))

## `better-auth`

### Bug Fixes

- Fixed the JWT plugin to verify JWTs and session cookie-cache JWTs with
the stored key's algorithm instead of the token header's, and to warn
when signing or verifying a JWT without an issuer or audience
([#11925](better-auth/better-auth#11925))
- Fixed OAuth callbacks completed through the OAuth proxy to run the
same checks as the standard OAuth callback, including issuer and ID
token nonce validation
([#11930](better-auth/better-auth#11930))
- Fixed `auth.api.getSession()` to keep the original database error as
`error.cause` when the session lookup fails
([#11924](better-auth/better-auth#11924))

For detailed changes, see
[`CHANGELOG`](https://github.com/better-auth/better-auth/blob/29735514c737d2abeac2fb84f0691fd316231949/packages/better-auth/CHANGELOG.md)

## `@better-auth/core`

### Bug Fixes

- Fixed `mapProfileToUser` failing to typecheck under
`exactOptionalPropertyTypes` when it returns `undefined` for `name`,
`email`, or `image`
([#11918](better-auth/better-auth#11918))
- Fixed ID token sign-in to reject tokens when the provider has no
client ID, since their audience cannot be checked
([#11931](better-auth/better-auth#11931))
- Fixed a custom Facebook `getUserInfo` to no longer receive
client-submitted access tokens issued to another Facebook app, and ID
tokens missing `exp` or `iat` are now rejected
([#11919](better-auth/better-auth#11919))
- Restored the Twitch and Paybin ID token handling from before 1.7.11,
which made account info fail once the ID token stored at sign-in expired
([#11920](https://github.com/better-auth/bette

…[full
notes](https://github.com/better-auth/better-auth/releases/tag/v1.7.12)

</details>

<details>
<summary><b>@<!---->better-auth/oauth-provider</b> (1.7.11 →
1.7.12)</summary>

> [!IMPORTANT]
> **Action required**
>
> - If you use ID token sign-in with a provider that has no `clientId`,
set `clientId` to every client ID your apps sign in with.
([#11931](better-auth/better-auth#11931))

## `better-auth`

### Bug Fixes

- Fixed the JWT plugin to verify JWTs and session cookie-cache JWTs with
the stored key's algorithm instead of the token header's, and to warn
when signing or verifying a JWT without an issuer or audience
([#11925](better-auth/better-auth#11925))
- Fixed OAuth callbacks completed through the OAuth proxy to run the
same checks as the standard OAuth callback, including issuer and ID
token nonce validation
([#11930](better-auth/better-auth#11930))
- Fixed `auth.api.getSession()` to keep the original database error as
`error.cause` when the session lookup fails
([#11924](better-auth/better-auth#11924))

For detailed changes, see
[`CHANGELOG`](https://github.com/better-auth/better-auth/blob/29735514c737d2abeac2fb84f0691fd316231949/packages/better-auth/CHANGELOG.md)

## `@better-auth/core`

### Bug Fixes

- Fixed `mapProfileToUser` failing to typecheck under
`exactOptionalPropertyTypes` when it returns `undefined` for `name`,
`email`, or `image`
([#11918](better-auth/better-auth#11918))
- Fixed ID token sign-in to reject tokens when the provider has no
client ID, since their audience cannot be checked
([#11931](better-auth/better-auth#11931))
- Fixed a custom Facebook `getUserInfo` to no longer receive
client-submitted access tokens issued to another Facebook app, and ID
tokens missing `exp` or `iat` are now rejected
([#11919](better-auth/better-auth#11919))
- Restored the Twitch and Paybin ID token handling from before 1.7.11,
which made account info fail once the ID token stored at sign-in expired
([#11920](https://github.com/better-auth/bette

…[full
notes](https://github.com/better-auth/better-auth/releases/tag/v1.7.12)

</details>

<details>
<summary><b>@<!---->better-auth/passkey</b> (1.7.11 → 1.7.12)</summary>

> [!IMPORTANT]
> **Action required**
>
> - If you use ID token sign-in with a provider that has no `clientId`,
set `clientId` to every client ID your apps sign in with.
([#11931](better-auth/better-auth#11931))

## `better-auth`

### Bug Fixes

- Fixed the JWT plugin to verify JWTs and session cookie-cache JWTs with
the stored key's algorithm instead of the token header's, and to warn
when signing or verifying a JWT without an issuer or audience
([#11925](better-auth/better-auth#11925))
- Fixed OAuth callbacks completed through the OAuth proxy to run the
same checks as the standard OAuth callback, including issuer and ID
token nonce validation
([#11930](better-auth/better-auth#11930))
- Fixed `auth.api.getSession()` to keep the original database error as
`error.cause` when the session lookup fails
([#11924](better-auth/better-auth#11924))

For detailed changes, see
[`CHANGELOG`](https://github.com/better-auth/better-auth/blob/29735514c737d2abeac2fb84f0691fd316231949/packages/better-auth/CHANGELOG.md)

## `@better-auth/core`

### Bug Fixes

- Fixed `mapProfileToUser` failing to typecheck under
`exactOptionalPropertyTypes` when it returns `undefined` for `name`,
`email`, or `image`
([#11918](better-auth/better-auth#11918))
- Fixed ID token sign-in to reject tokens when the provider has no
client ID, since their audience cannot be checked
([#11931](better-auth/better-auth#11931))
- Fixed a custom Facebook `getUserInfo` to no longer receive
client-submitted access tokens issued to another Facebook app, and ID
tokens missing `exp` or `iat` are now rejected
([#11919](better-auth/better-auth#11919))
- Restored the Twitch and Paybin ID token handling from before 1.7.11,
which made account info fail once the ID token stored at sign-in expired
([#11920](https://github.com/better-auth/bette

…[full
notes](https://github.com/better-auth/better-auth/releases/tag/v1.7.12)

</details>

<details>
<summary><b>@<!---->better-auth/sso</b> (1.7.11 → 1.7.12)</summary>

> [!IMPORTANT]
> **Action required**
>
> - If you use ID token sign-in with a provider that has no `clientId`,
set `clientId` to every client ID your apps sign in with.
([#11931](better-auth/better-auth#11931))

## `better-auth`

### Bug Fixes

- Fixed the JWT plugin to verify JWTs and session cookie-cache JWTs with
the stored key's algorithm instead of the token header's, and to warn
when signing or verifying a JWT without an issuer or audience
([#11925](better-auth/better-auth#11925))
- Fixed OAuth callbacks completed through the OAuth proxy to run the
same checks as the standard OAuth callback, including issuer and ID
token nonce validation
([#11930](better-auth/better-auth#11930))
- Fixed `auth.api.getSession()` to keep the original database error as
`error.cause` when the session lookup fails
([#11924](better-auth/better-auth#11924))

For detailed changes, see
[`CHANGELOG`](https://github.com/better-auth/better-auth/blob/29735514c737d2abeac2fb84f0691fd316231949/packages/better-auth/CHANGELOG.md)

## `@better-auth/core`

### Bug Fixes

- Fixed `mapProfileToUser` failing to typecheck under
`exactOptionalPropertyTypes` when it returns `undefined` for `name`,
`email`, or `image`
([#11918](better-auth/better-auth#11918))
- Fixed ID token sign-in to reject tokens when the provider has no
client ID, since their audience cannot be checked
([#11931](better-auth/better-auth#11931))
- Fixed a custom Facebook `getUserInfo` to no longer receive
client-submitted access tokens issued to another Facebook app, and ID
tokens missing `exp` or `iat` are now rejected
([#11919](better-auth/better-auth#11919))
- Restored the Twitch and Paybin ID token handling from before 1.7.11,
which made account info fail once the ID token stored at sign-in expired
([#11920](https://github.com/better-auth/bette

…[full
notes](https://github.com/better-auth/better-auth/releases/tag/v1.7.12)

</details>

<details>
<summary><b>@<!---->cloudflare/ai-chat</b> (0.12.1 → 0.12.2)</summary>

### Patch Changes

- [#2615](cloudflare/agents#2615)
[`05843e4`](cloudflare/agents@05843e4)
Thanks [@<!---->mattzcarey](https://github.com/mattzcarey)! - Chat
recovery now seals a turn after `chatRecovery.maxInterruptedAttempts`
interrupted attempts (default 5), so a turn that exceeds the Durable
Object memory limit on every run no longer retries forever;
`maxOomRetries` is deprecated. See [Stream
Recovery](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md#stream-recovery).

</details>

<details>
<summary><b>better-auth</b> (1.7.11 → 1.7.12)</summary>

> [!IMPORTANT]
> **Action required**
>
> - If you use ID token sign-in with a provider that has no `clientId`,
set `clientId` to every client ID your apps sign in with.
([#11931](better-auth/better-auth#11931))

## `better-auth`

### Bug Fixes

- Fixed the JWT plugin to verify JWTs and session cookie-cache JWTs with
the stored key's algorithm instead of the token header's, and to warn
when signing or verifying a JWT without an issuer or audience
([#11925](better-auth/better-auth#11925))
- Fixed OAuth callbacks completed through the OAuth proxy to run the
same checks as the standard OAuth callback, including issuer and ID
token nonce validation
([#11930](better-auth/better-auth#11930))
- Fixed `auth.api.getSession()` to keep the original database error as
`error.cause` when the session lookup fails
([#11924](better-auth/better-auth#11924))

For detailed changes, see
[`CHANGELOG`](https://github.com/better-auth/better-auth/blob/29735514c737d2abeac2fb84f0691fd316231949/packages/better-auth/CHANGELOG.md)

## `@better-auth/core`

### Bug Fixes

- Fixed `mapProfileToUser` failing to typecheck under
`exactOptionalPropertyTypes` when it returns `undefined` for `name`,
`email`, or `image`
([#11918](better-auth/better-auth#11918))
- Fixed ID token sign-in to reject tokens when the provider has no
client ID, since their audience cannot be checked
([#11931](better-auth/better-auth#11931))
- Fixed a custom Facebook `getUserInfo` to no longer receive
client-submitted access tokens issued to another Facebook app, and ID
tokens missing `exp` or `iat` are now rejected
([#11919](better-auth/better-auth#11919))
- Restored the Twitch and Paybin ID token handling from before 1.7.11,
which made account info fail once the ID token stored at sign-in expired
([#11920](https://github.com/better-auth/bette

…[full
notes](https://github.com/better-auth/better-auth/releases/tag/v1.7.12)

</details>

---
*This PR was auto-generated by
[catalog-update-action](https://github.com/brandhaug/catalog-update-action).*

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@better-release better-release Bot added the locked Locked conversations after being closed for 7 days label Oct 27, 2026
@better-release better-release Bot locked as resolved and limited conversation to collaborators Oct 27, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

core Core infra, API routes, session, cookies, client SDK docs Documentation, demos locked Locked conversations after being closed for 7 days

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants