Commit Graph
156 Commits
Author SHA1 Message Date
better-release[bot]andGitHub a5e2442e3c chore: release v1.7.0-beta.4 (#9534) 2026-05-31 14:29:39 +01:00
Gustavo ValverdeandGitHub b4b086722c fix(oauth-provider)!: bind RFC 8707 resource indicators to the authorization grant (#9836) 2026-05-31 14:14:50 +01:00
Gustavo Valverde 065f5ad72d chore: sync main to next
Brings the v1.6.13 stable fixes into next: redirect_uri scheme validation in oidc-provider and mcp (#9838), clientPrivileges enforcement on dynamic client registration (#9837), null organization logo support (#9842), the consumeOne non-numeric deleteMany guard (#9831), and the db-adapter guide alignment (#9830).

Conflicts were limited to release version bumps and CHANGELOG entries; resolved by keeping next's 1.7.0-beta.3 line. The ten changesets consumed by the v1.6.13 release are accepted as deleted, and no external dependencies changed.
2026-05-31 13:02:15 +01:00
better-release[bot]andGitHub a6f38c72ee chore: release v1.6.13 (#9804) 2026-05-31 12:41:17 +01:00
Gustavo ValverdeandGitHub 17ab66c3a4 fix(oauth-provider): enforce clientPrivileges on dynamic client registration (#9837) 2026-05-31 11:02:27 +00:00
Gustavo ValverdeandGitHub be32012ca3 fix(oauth): validate redirect_uri schemes in oidc-provider and mcp (#9838) 2026-05-31 11:38:52 +01:00
Gustavo Valverde 0fe3590e16 test(oauth-provider): adapt merged token/private-key-jwt tests to next's APIs (#9533)
These test files auto-merged main's additions onto next's refactored test
surface, producing runtime failures tsc could not catch:

- token.test.ts called main's sync createRefreshAccessTokenRequest, which next
  renamed to the async refreshAccessTokenRequest; the calls now await it and
  the concurrent-rotation helper is async.
- private-key-jwt-e2e.test.ts hit the merged-in #9578 gate: both the provider
  and RP test instances create the same default user, so the OAuth sign-in
  links to the RP's unverified local user and is blocked. The RP sets
  requireLocalEmailVerified: false so the test exercises private_key_jwt
  rather than the (separately covered) email-verification gate.
- utils/basic-auth.test.ts is removed: next made basicToClientCredentials
  private, and its colon-preservation coverage now lives in core's
  basic-credentials.test.ts.

Full oauth-provider suite green (24 files, 378 tests).
2026-05-31 01:51:34 +01:00
Gustavo Valverde 8bfd30f10a style: apply biome formatting to synced files (#9533) 2026-05-31 01:30:41 +01:00
Gustavo Valverde 027a10c566 fix(oauth-provider): gate DCR and serve path-prefixed issuer metadata (#9448, #9668)
Re-applies two main fixes onto next's refactored metadata layer.

- #9448: registration_endpoint is now advertised only when dynamic client
  registration is enabled. With DCR off, the field was still advertised in
  authorization-server and OpenID metadata while the endpoint itself was
  disabled, so clients attempted a registration that failed.
- #9668: the authorization-server and OpenID discovery documents are served
  again at their path-prefixed (RFC 8414 path-insertion and issuer-appended)
  aliases via an onRequest handler, with HEAD support and a 405 for
  non-GET/HEAD. next's refactor kept the server-only metadata endpoints but
  dropped the request handler that exposes them over HTTP. The handler is
  adapted to next's metadata (CIMD-aware public-client flag and merged
  discovery metadata) and metadataResponse is exported for it.

#9601 (preserve colons in Basic Auth secret) is already covered: next routes
Basic parsing through @better-auth/core decodeBasicCredentials, which splits
on the first colon, so no change to utils/index.ts.

The merged metadata test suite (union of next and main, including the
DCR-conditional and alias cases) passes.

(cherry picked from commit 66a7b0b62d76e36474ebdca189f59200daa3ec76)
2026-05-31 00:10:36 +01:00
Gustavo Valverde ef4fb0ff95 chore: merge main into next (#9533)
Sync main (through #9821/#9820/#9822/#9768) into next. Conflicting
package.json files keep next's version and intentional divergences (for
example the cli's c12 v4) while taking main's dependency updates, including
the samlify 2.13.1 and fast-xml-parser security bumps; the lockfile is
regenerated from the reconciled set. The 13 source/doc/test conflicts take
next's refactored architecture as the baseline; main's colliding fixes are
re-applied on top in the following per-domain commits.

Clean main fixes land via this merge, including the auto-restored
account-takeover defenses #9578 and #9577.
2026-05-31 00:10:16 +01:00
better-release[bot]andGitHub c0c574ea50 chore: release v1.6.12 (#9590) 2026-05-29 22:28:58 +01:00
d64174ec86 fix(oauth-provider): hide DCR endpoint unless enabled (#9448)
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-05-27 13:18:16 +00:00
8401d11f43 fix(oauth-provider): serve path-prefixed issuer metadata aliases (#9668)
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-05-27 12:38:27 +00:00
f77060af3a fix: consumeVerificationValue returns null for expired rows (#9624)
Co-authored-by: Maxwell <145994855+ping-maxwell@users.noreply.github.com>
2026-05-19 16:37:55 +00:00
Gustavo ValverdeandGitHub 1e5b808472 refactor(oauth): single-source Basic credentials + getHttpTestInstance (#9657) 2026-05-17 19:23:45 +00:00
aebf66d8e6 feat: add token endpoint client authentication (#9625)
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-05-16 18:27:15 +00:00
TaesuandGitHub 938efee305 fix(oauth-provider): preserve colons in Basic Auth client secret (#9601) 2026-05-15 15:48:59 +00:00
TaesuandGitHub 87f5a8fd27 fix(oauth-provider): return NOT_FOUND when consent update references a missing client (#9600) 2026-05-15 15:48:25 +00:00
better-release[bot]andGitHub f41514ef07 chore: release v1.6.11 (#9532) 2026-05-12 17:30:34 +01:00
b4bc65a007 Merge commit from fork
The `authorization_code` grant's verification step was a `findOne` + `deleteOne` pair, so two concurrent `POST /oauth2/token` requests sharing the same `code` both pass the find, both delete, and both mint independent access/refresh/id token sets: a CAS gap that lets an authorization code be redeemed twice. The legacy `oidc-provider` and `mcp` plugins in `better-auth` share the same primitive on their `authorization_code` paths and have the same gap.

All three call sites now use `internalAdapter.consumeVerificationValue` (the atomic primitive added in better-auth#9560 and renamed in better-auth#9568): the first concurrent caller receives the row and mints tokens, subsequent racers receive `null`. The consumed and expired paths return RFC 6749 §5.2 `invalid_grant` instead of the better-auth-internal `invalid_verification`, so spec-compliant clients can branch on the standard code. The redundant second `deleteVerificationByIdentifier` call after PKCE validation in the legacy paths is removed.

Closes GHSA-7w99-5wm4-3g79.

Co-authored-by: chdanielmueller <4051999+chdanielmueller@users.noreply.github.com>
2026-05-12 16:53:45 +01:00
c6918ecc9e Merge commit from fork
The `authorization_code`-grant rotation in `createRefreshToken` and the explicit `revokeRefreshToken` path both updated the parent `oauthRefreshToken` row using an `id`-only predicate, so two concurrent rotations (or a rotation racing a revoke) both pass the `revoked` check and last-write-wins. Each surviving request mints a fresh refresh token, producing a forked family from one parent.

Both call sites now perform a compare-and-swap (`UPDATE ... WHERE id = ? AND revoked IS NULL`) and short-circuit with `invalid_grant` when the row was already consumed. The parent stays marked revoked, so any subsequent replay trips the existing family-invalidation guard in `handleRefreshTokenGrant`. The shared family-delete is centralized in `invalidateRefreshFamily`, which clears child access tokens before refresh rows to honor the schema's foreign-key direction; the `oauthRefreshToken.token` column also gains a `unique` constraint for parity with `oauthAccessToken.token`. Strict family invalidation on contested rotations (RFC 9700 §4.14) is tracked in a FIXME for a follow-up minor that opts into transactional rotation in the adapter contract.

Closes GHSA-392p-2q2v-4372.

Co-authored-by: chdanielmueller <4051999+chdanielmueller@users.noreply.github.com>
2026-05-12 16:36:32 +01:00
Gustavo ValverdeandGitHub da7e50beee fix(oauth): block OAuth linking to unverified local accounts (#9578) 2026-05-12 14:20:19 +00:00
better-release[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
4839a2d761 chore: release v1.7.0-beta.3 (#9323)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-09 19:28:11 +00:00
Taesu 2b83087180 chore: sync main to next 2026-05-10 03:45:29 +09:00
better-release[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
cbb5014cdf chore: release v1.6.10 (#9350)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-09 14:31:47 +00:00
f7bc1c7349 fix(oauth-provider): index OAuth foreign keys (#9389)
Co-authored-by: Maxwell <145994855+ping-maxwell@users.noreply.github.com>
2026-05-06 05:22:28 +00:00
d427d1dba9 fix(oauth-provider): export declaration helper types (#9406)
Co-authored-by: cyphercodes <7407177+cyphercodes@users.noreply.github.com>
Co-authored-by: Maxwell <145994855+ping-maxwell@users.noreply.github.com>
2026-05-06 05:20:44 +00:00
6b03a45a14 chore(oauth-provider): correct optional typing for refreshToken sessionId field (#9324)
Co-authored-by: Taesu <bytaesu@gmail.com>
2026-05-03 19:12:23 +00:00
Gustavo ValverdeandGitHub 408a3076bd fix(oauth-provider): honor prompt=login across consent continuation (#9344) 2026-04-27 08:49:55 +00:00
better-release[bot]andGitHub f484269228 chore: release v1.6.9 (#9341) 2026-04-24 06:25:08 +01:00
better-release[bot]andGitHub b289ac6c4b chore: release v1.6.8 (#9316) 2026-04-23 11:31:03 +01:00
Gustavo ValverdeandGitHub 8e3cc3453c fix(oauth-provider): accept authorization flows without state (#9328) 2026-04-23 07:00:05 +00:00
better-release[bot]andGitHub d3bde2d21f chore: release v1.7.0-beta.2 (#9207) 2026-04-22 17:23:06 +01:00
Gustavo Valverde eb3cd10d50 chore: resolve main-to-next sync conflicts
- keep next package versions at 1.7.0-beta.1
- keep both changelog streams by inserting the stable 1.6.5, 1.6.6, and 1.6.7 sections below the 1.7.0-beta entries
- keep the cimd and dash deps on demo/nextjs (next-only); regenerate pnpm-lock.yaml
- resolve TODO(sync-from-main-9226) in oauth-provider authorize.ts: findRegisteredRedirectUri now uses isLoopbackIP from @better-auth/core/utils/host to cover the full 127.0.0.0/8 range per RFC 8252 §7.3
- drop the unused saml import that main's #9262 added to sso/src/routes/sso.ts; next already migrated to saml-pipeline
2026-04-22 14:54:27 +01:00
better-release[bot]andGitHub f8076d141a chore: release v1.6.7 (#9289) 2026-04-22 12:36:30 +01:00
4e0e6e1fd3 fix(oauth-provider): userinfo Authorization from ctx.headers for auth.api (#9244)
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-04-22 09:20:54 +00:00
Gustavo ValverdeandGitHub 5c6de4ed26 fix(oauth-provider)!: return RFC-compliant error envelopes from validation failures (#9277) 2026-04-22 06:48:34 +00:00
better-release[bot]andGitHub 0290077760 chore: release v1.6.6 (#9222) 2026-04-21 17:42:18 +01:00
Gustavo ValverdeandGitHub e64ff720fb fix: unify host classification and close SSRF gaps across packages (#9226) 2026-04-17 23:25:25 +00:00
better-release[bot]andGitHub c8a91f4167 chore: release v1.6.5 (#9209) 2026-04-16 11:05:30 +01:00
5b900a2b43 Merge commit from fork
* Add tests reproducing GHSA-xr8f-h2gw-9xh6

* Fix GHSA-xr8f-h2gw-9xh6

* Move clientPrivilege assertion to shared helper

* chore: add oauth-provider changeset for GHSA-xr8f-h2gw-9xh6

---------

Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-04-16 10:52:33 +01:00
Gustavo Valverde 225976c7d2 chore: main to next conflict resolution
Resolve the main to next sync discrepancies after the v1.6.4 release.

Conflict resolution:
- keep next package versions at 1.7.0-beta.1
- keep both changelog streams by inserting the stable 1.6.4 sections below the 1.7.0-beta entries
- restore the next pre-release accumulator changesets that the stable release deleted on main
2026-04-15 15:40:35 +01:00
better-release[bot]andGitHub 9ec849ff71 chore: release v1.6.4 (#9175) 2026-04-15 13:00:42 +01:00
better-release[bot]andGitHub d8dfa515e2 chore: release v1.7.0-beta.1 (#9120) 2026-04-14 12:29:23 +01:00
Gustavo Valverde 834841fbc9 chore: sync v1.6.3 release into next
Brings main's `chore: release v1.6.3 (#9081)` commit into next after the
stable release. Conflict resolution:

- `packages/*/package.json`: keep next's `1.7.0-beta.0` (per the release
  bot's standard rule: next is always ahead of main in version).
- `packages/*/CHANGELOG.md`: keep both version entries side-by-side. Next's
  `1.7.0-beta.0` section stays on top; main's new `1.6.3` section slots in
  below. Each entry describes its own branch's release.
- `.changeset/*.md`: restore the 14 changesets git auto-deleted. Next is in
  pre-release mode (`.changeset/pre.json` `mode: "pre"`), so changesets
  accumulate across beta cuts and are only consumed on `exit-pre`. Main's
  release deleted them from main; next must keep them for its own pre-release
  accumulator.
2026-04-14 12:10:23 +01:00
better-release[bot]andGitHub 6f17bb3ebd chore: release v1.6.3 (#9081) 2026-04-14 12:04:31 +01:00
Gustavo Valverde b7850f90a4 fix: address merge follow-ups from PR #9172 review
- packages/oauth-provider/src/types/zod.ts: make `state` optional in
  `verificationValueSchema`. Main's PR #9118 hardened authorization code
  validation with a required `state`, but CIMD (next, PR #9159) doesn't send
  state in test flows. Per OAuth 2.0 §4.1.1 state is RECOMMENDED, not
  REQUIRED. Fixes CIMD token exchange (`401 !== 200`) in ci test and smoke.

- docs/content/docs/plugins/sso.mdx: replace remaining `/sso/saml2/callback/`
  references with `/sso/saml2/sp/acs/` to match the endpoint rename from
  next's PR #9117. The merge took main verbatim here, regressing docs that
  next had already updated.
2026-04-14 11:54:29 +01:00
Gustavo Valverde 3fbab44068 chore: sync main to next
Resolves conflicts in PR #9115 which the release bot cannot auto-merge.

Conflict resolutions:
- .github/workflows/release.yml: take main's hardened grep fallback (92256a2d0)
- docs/content/docs/plugins/sso.mdx: take main's named-exports refactor verbatim (#9144)
- packages/oauth-provider/src/token.ts: keep next's at_hash sequencing (#9079),
  add main's customTokenResponseFields spread and credential helper rename (#9118)
- packages/oauth-provider/src/token.test.ts: keep both new describe blocks
  (at_hash in id tokens from next, customTokenResponseFields from main)

Semantic fixes on auto-merged files where git silently dropped main's changes
around next's discriminated-response refactor:
- two-factor/index.ts: restore skipVerificationOnEnable handling in the totp
  enablement path
- two-factor/types.ts: restore the skipVerificationOnEnable type field
- two-factor/two-factor.test.ts: narrow the discriminated enable response via
  method === "totp" guard
2026-04-14 11:30:13 +01:00
Gustavo ValverdeandGitHub 5142e9cec5 fix(auth): harden dynamic baseURL resolution (#9131) 2026-04-14 08:01:13 +00:00
cd8313ba00 feat(cimd): add Client ID Metadata Document plugin (#9159)
Co-authored-by: Dylan Vanmali <dylanvanmali@yahoo.com>
2026-04-13 20:52:34 +00:00