Commit Graph
154 Commits
Author SHA1 Message Date
Gustavo Valverde bf7f2c5b4e chore: sync main to next 2026-06-10 11:30:38 -07:00
Bereket EngidaandGitHub cb1cbfa4cc fix: address bug findings across packages (#9974) 2026-06-09 19:46:12 -07:00
Gustavo ValverdeandGitHub a6b0295df3 fix(sso): consume SAML AuthnRequest atomically (#9972) 2026-06-10 01:58:45 +00:00
Gustavo ValverdeandGitHub af572166a2 fix(auth)!: harden validateUserInfo source contract (#9940) 2026-06-07 22:52:59 -07:00
0cbaf81bed feat(oauth): server-trusted state channel; fix anonymous cookieless linking (#9930)
Co-authored-by: Taesu <166604494+bytaesu@users.noreply.github.com>
2026-06-08 01:00:05 +00:00
41cca606d1 feat(auth): add user.validateUserInfo provisioning gate (#9864)
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-06-07 14:34:48 -07:00
bff65fd620 fix(sso): pass clockSkew to samlify clockDrifts to fix ERR_SUBJECT_UNCONFIRMED (#9748)
Co-authored-by: Maxwell <145994855+ping-maxwell@users.noreply.github.com>
Co-authored-by: ping-maxwell <maxwell.multinite@gmail.com>
2026-06-06 04:20:14 +00:00
Gustavo ValverdeandGitHub 40b392ae21 feat(oauth)!: accumulate granted scopes as grantedScopes string[] (#9825) 2026-06-04 17:54:52 -04:00
Gustavo Valverde 8bfd30f10a style: apply biome formatting to synced files (#9533) 2026-05-31 01:30:41 +01:00
Gustavo Valverde 71326af813 fix(sso): apply samlify 2.13.1 signed-assertion XML-injection fix on refactored routes (#9821)
Re-applies main's #9821 onto next's rebuilt SAML routes. next kept the
createSP/createIdP helpers and consolidated saml-pipeline, so the fix is
expressed there rather than in the inline construction main patched.

- normalizePem trims leading indentation from PEM private keys so samlify
  2.13.1 (OpenSSL 3 native parsing) loads keys pasted with surrounding
  whitespace; applied in the SP/IdP helpers.
- processSAMLResponse reads identity attributes through an attr() accessor
  that collapses samlify 2.13's string | string[] attribute values to the
  single-valued identity fields.
- the SLO LogoutResponse is built by passing the parsed request to samlify
  (filling InResponseTo/Issuer/IssueInstant/Destination/StatusCode) instead
  of manual template string replacement.

The samlify ^2.13.1 and fast-xml-parser ^5.8.0 bumps land via the merge.
saml.test.ts unions next's SAML suites with #9821's key-normalization and
SLO regression tests (120 passing).
2026-05-31 00:30:51 +01:00
Gustavo Valverde 9247cb8528 fix(sso): enforce SSRF validation, org-admin registration, SLO-by-token, and error encoding on refactored routes (#9574, #9220, #9818, #9722, #9702)
Re-applies five main fixes onto next's rebuilt SSO routes. next's refactor
kept the supporting helpers (the SSRF host check, the SAMLSessionRecord
token field) but dropped the call sites, so the merge left them present yet
unused. This wires them back.

- #9574: registerSSOProvider and updateSSOProvider now run
  validateSkipDiscoveryEndpoints on user-supplied OIDC endpoints, rejecting
  private/link-local hosts (for example 169.254.169.254). The merge included
  the helper but never called it, leaving advisory GHSA-5rr4-8452-hf4v open
  on next. Validation runs even without skipDiscovery.
- #9220: registering an SSO provider requires an organization owner/admin
  role when the organization plugin is active, blocking a low-privilege
  member from registering a malicious IdP.
- #9818: SAML Single Logout revokes the session by token; the SAML session
  record now carries the session token.
- #9722: the OIDC callback error redirect encodes the error value.
- #9702: a before-callback hook rejection in the OIDC and SAML callbacks
  redirects to the per-flow errorURL with the hook's code, instead of
  surfacing a raw response.

Two stale IDP-bounce assertions are updated to next's migrated state-error
vocabulary (state_not_found). All SSO regression suites pass (SSRF,
org-admin, SLO, hook-rejection, encoding).

(cherry picked from commit c3b238f71a6f66914f12db5f615504e2cf855bfc)
2026-05-31 00:10:48 +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
Gustavo ValverdeandGitHub 4c3bbc4e56 fix(sso): update samlify to 2.13.1 for signed-assertion XML injection (#9821) 2026-05-30 23:58:05 +01:00
43c08a2bc7 fix(account): scope OAuth account identity and fix buggy internalAdapter helpers (#9818)
Co-authored-by: Krish Garg <kgarg@chapman.edu>
2026-05-30 20:48:10 +00:00
TaesuandGitHub f47aa4aa96 fix(sso): url-encode error query value in OIDC callback redirect (#9722) 2026-05-22 02:52:32 +00:00
TaesuandGitHub 23dbe1ad0e fix: redirect hook rejections to errorCallbackURL across auth callback flows (#9702) 2026-05-22 00:14:48 +00:00
Gustavo ValverdeandGitHub e7eb45b065 feat(oauth): per-request additionalParams and loginHint (#9305) 2026-05-19 17:18:43 +00:00
03e6c94e96 feat(generic-oauth,sso): support IDP-initiated flows via secure bounce (#9301)
Co-authored-by: Menachem Hornbacher <mhornbacher@kiddom.co>
2026-05-19 12:29:04 +00:00
602ec40293 feat(sso)!: support multiple IdP signing certificates (#8805)
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-05-18 03:07:37 +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
37f60cb176 fix(sso): validate user-supplied OIDC endpoint URLs at registration and update (#9574)
Co-authored-by: vaadata-poyetont <poyetont@vaadata.com>
2026-05-12 13:12:42 +00:00
86765f1597 fix(sso): require org admin role to register SSO providers (#9220)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-05-11 17:04:01 +00:00
Taesu 2b83087180 chore: sync main to next 2026-05-10 03:45:29 +09:00
Craig (Michael) ThompsonandGitHub 006e809b92 fix(sso): use findSAMLProvider in spMetadata so defaultSSO works (#9398) 2026-04-29 12:56:44 -07: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
Jonathan SaminesandGitHub fe5f36c7e3 chore(sso): fix samlify ESM/CJS loading compat issue (#9262) 2026-04-21 16:06:04 +00:00
Gustavo ValverdeandGitHub 960304354a fix(sso): upgrade samlify to 2.12.0 with XPath injection and XXE fixes (#9121) 2026-04-11 10:46:50 +00:00
Gustavo ValverdeandGitHub b70f025bfa refactor(sso)!: remove callbackUrl, consolidate ACS endpoint, fix SLO (#9117) 2026-04-11 10:03:56 +00:00
Gustavo Valverde ca5d303607 fix(sso): guard toLowerCase against falsy email and use safe redirect
- Add empty string fallback before .toLowerCase() to prevent TypeError
  when both mapped email attribute and extract.nameID are falsy
- Use validated samlRedirectUrl instead of raw callbackUrl in error
  redirect to maintain open-redirect and loop-protection guarantees
2026-04-10 21:06:47 +01:00
Gustavo Valverde 97fca6a1cf refactor(sso): adopt saml-pipeline and port security fixes
Use main's saml-pipeline.ts for SAML response processing, replacing
~1000 lines of duplicated inline code in sso.ts. Port the four
security fixes from #9055 into the pipeline:

- Fix InResponseTo field path (extract.response?.inResponseTo)
- Add Audience Restriction validation
- Fix SessionIndex stored as string, not object
- Fix allowIdpInitiated default to false

Delegate to validateInResponseTo/validateAudience from
response-validation.ts instead of reimplementing inline.

Graft private_key_jwt (RFC 7523) support from #8836 onto main's
pipeline-based sso.ts.
2026-04-10 20:25:41 +01:00
Gustavo Valverde 28ccc8cda9 chore: resolve main-to-next sync conflicts
Conflicts resolved:
- docs/content/docs/plugins/2fa.mdx: kept next's OTP feature, applied main's exported const pattern
- docs/content/docs/plugins/oauth-provider.mdx: kept main's formatting, added back private_key_jwt docs
- docs/content/docs/plugins/sso.mdx: kept next's version with private_key_jwt and SAML options
- packages/sso/src/routes/sso.ts: kept next's version (has security fixes and private_key_jwt)
2026-04-10 19:11:05 +01:00
Gustavo ValverdeandGitHub 52c47517a2 fix(sso): unify SAML response processing and fix bugs (#9097) 2026-04-10 15:00:26 +00:00
Gustavo ValverdeandGitHub 93d3871bd2 feat(oauth): add private_key_jwt client authentication (RFC 7523) (#8836) 2026-04-10 08:22:05 +00:00
Gustavo ValverdeandGitHub b790144a2e fix(sso)!: harden SAML response validation (InResponseTo, Audience, SessionIndex) (#9055) 2026-04-09 17:30:01 +00:00
Gustavo ValverdeandGitHub 608d8c3082 fix(sso): include RelayState in signed SAML AuthnRequests (#9058) 2026-04-09 12:05:02 +00:00
5e5d3f62fc fix(sso): normalize SAMLResponse whitespace at request boundary (#8968)
Co-authored-by: Gustavo Valverde <g.valverde02@gmail.com>
2026-04-09 11:04:10 +00:00
Gustavo ValverdeandGitHub e089ce127d chore(knip): fix CI blind spots and remove dead code (#8888) 2026-04-02 19:28:30 +00:00
Jonathan SaminesandGitHub cd01a42e60 feat: expose plugin version (#8750) 2026-03-31 16:08:21 +00:00
TaesuandGitHub 23bad5139f feat(sso): enable InResponseTo validation by default for SAML flows (#8736) 2026-03-30 06:20:27 +00:00
Martin RädlingerandGitHub e16b184b0b fix(sso): provisionUser inconsistency and option to run on every login (#8818) 2026-03-30 06:18:11 +00:00
David FrankelandGitHub e9f49bd7c8 chore: fix type inference for future TS compatibility (#8820) 2026-03-30 05:00:05 +00:00
TaesuandGitHub b647ef3488 fix(sso): skip state cookie check for SAML ACS cross-site POST (#8735) 2026-03-22 14:27:55 -07:00
Alex YangandGitHub a67630edb4 fix(sso): use namespace import for samlify to fix ESM compatibility (#8697) 2026-03-19 19:31:11 +00:00
Oscar CornishandGitHub ac9541a846 feat(sso): Add logging for when code validation fails in oidc callback (#8693) 2026-03-19 18:23:35 +00:00
Alex YangandGitHub 71c3a85d2f fix(sso): handle bare domains in domain verification (#8369) 2026-03-06 08:03:20 +00:00
Alex YangandGitHub bd980f8c5b fix(sso): use internalAdapter for verification operations (#8353) 2026-03-04 03:55:26 +00:00
Alex YangandGitHub b73b0440a2 chore: align zod imports to use namespace import from "zod" (#8300) 2026-03-02 20:37:38 +00:00
e32bad12ea fix(sso): prefer UserInfo endpoint over ID token and map sub claim correctly (#8276)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-02 07:15:41 +00:00
Alex YangandGitHub d341824a96 fix(db): support verification operations with secondary storage (#8247) 2026-03-01 12:40:02 +00:00