Repository navigation
Version Packages - #236
Open
github-actions[bot] wants to merge 1 commit into
Open
Version Packages#236github-actions[bot] wants to merge 1 commit into
github-actions[bot] wants to merge 1 commit into
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 25, 2026 14:56
33f3af2 to
972a0de
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 26, 2026 01:19
972a0de to
16d3f35
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@seamless-auth/core@0.22.0
Minor Changes
0e554e3: Check
OriginagainstallowedOriginseven whenSec-Fetch-Siteis present. Asame-siterequest also covers sibling subdomains, so with
SameSite=Nonecookies the header alone let anysubdomain drive a state change. When
allowedOriginsis configured, a state-changingsame-siterequest must now carry an
Originon the list (a missingOriginis refused).same-originrequests always pass and
cross-siterequests are always refused.This tightens behavior for adopters who set
allowedOrigins: list every origin that calls theadapter from a sibling subdomain. With
allowedOriginsunset the default is unchanged, and asame-siterequest passes as before.0e554e3: Refuse known placeholder secrets at startup.
assertSecretStrengthnow refusesdev-only-cookie-signing-key-replace-me,GRAB_FROM_SEAMLESS_AUTH_PORTAL_DEV, and any valuecontaining
replace-me, which were long enough to pass the length check. Every adapter refuses onefor
cookieSecretorserviceSecretwhen it starts, unless it runs in its insecure local mode(
cookieSecure: false).assertSecretStrengthtakes a new{ allowPlaceholder }option andassertSecretsreadscookieSecure; core also exportsisPlaceholderSecretandKNOWN_PLACEHOLDER_SECRETS.requireAuth(andauthenticateRequest) configured withauthServerUrlandaudiencenow alsoverifies the access token inside the cookie against the auth API's JWKS, and takes the session's
roles from it, so a cookie forged with the cookie secret alone cannot carry claims of its own.
Without that configuration the guard decodes the inner token as before.
5ebc6a2: Support for the auth server's v0.20 account recovery, built on
@seamless-auth/types0.31.0.recovery: trueand can only enroll a new passkey or authenticator app.requireAuth(Express, Fastify) answers it with403 { "error": "enrollment_required" }, and the Next.jsgetSeamlessSessionandgetSeamlessClaimstreat it as signed out, unlessallowRecoverySession: trueis passed. Set it only where the app drives that enrollment. After enrolling, a refresh issues a token without the claim.notices: true(todayPOST /recovery/verify), an adapter withmessagingnames the notice kinds it can send inx-seamless-auth-delivery-kindsand delivers theaccount_notice_email/account_notice_smsitems the server returns. These items are its "recovery opened" notice with a cancel link, which goes only to the owner and is never logged. If none goes out, the adapter cancels the request with that link's token and answers503 recovery_notice_failed, so recovery never runs without the owner being told. Newhandlers.sendAccountNoticeEmail/sendAccountNoticeSmsandoverrides.accountNoticeEmail/accountNoticeSms; the default sends the server's text as plain text.purpose: "account_recovery") is worded as a recovery code, and the purpose is passed to custom OTP handlers and overrides.Patch Changes
ensureCookiesnow refuses an access cookie whoseinner token is not an access token (
typ: "access"), asrequireAuthalready did, so a signedpre-auth cookie copied into the access slot is answered 401.
verifyUpstreamSessionrefuses aresponse whose token has the wrong
typ: an access token for session flows, and an ephemeraltoken for
/loginand the manifest's pre-auth and registration routes (new optionalexpectedTypeargument). Core also exportsholdsAccessToken.authFetchnow sends every auth API request withredirect: "manual"and answers a 3xx as a 502 with{ "error": "upstream_redirect" }, so amisconfigured proxy in front of the API can no longer get the service token and forwarded client
headers resent to another origin. The adapter manifest fetch no longer follows redirects either,
and falls back to the bundled copy instead.
.and..route params on the hand-written passthroughs and core handlers witha 400
bad_request, as the manifest proxy already did. A decoded%2e%2eparam previously stayedliteral after encoding and moved the upstream path. Core exports
encodePathParamandInvalidPathParamErrorfor the shared rule.@seamless-auth/express@0.22.0
Minor Changes
0e554e3: Check
OriginagainstallowedOriginseven whenSec-Fetch-Siteis present. Asame-siterequest also covers sibling subdomains, so with
SameSite=Nonecookies the header alone let anysubdomain drive a state change. When
allowedOriginsis configured, a state-changingsame-siterequest must now carry an
Originon the list (a missingOriginis refused).same-originrequests always pass and
cross-siterequests are always refused.This tightens behavior for adopters who set
allowedOrigins: list every origin that calls theadapter from a sibling subdomain. With
allowedOriginsunset the default is unchanged, and asame-siterequest passes as before.0e554e3: Refuse known placeholder secrets at startup.
assertSecretStrengthnow refusesdev-only-cookie-signing-key-replace-me,GRAB_FROM_SEAMLESS_AUTH_PORTAL_DEV, and any valuecontaining
replace-me, which were long enough to pass the length check. Every adapter refuses onefor
cookieSecretorserviceSecretwhen it starts, unless it runs in its insecure local mode(
cookieSecure: false).assertSecretStrengthtakes a new{ allowPlaceholder }option andassertSecretsreadscookieSecure; core also exportsisPlaceholderSecretandKNOWN_PLACEHOLDER_SECRETS.requireAuth(andauthenticateRequest) configured withauthServerUrlandaudiencenow alsoverifies the access token inside the cookie against the auth API's JWKS, and takes the session's
roles from it, so a cookie forged with the cookie secret alone cannot carry claims of its own.
Without that configuration the guard decodes the inner token as before.
5ebc6a2: Support for the auth server's v0.20 account recovery, built on
@seamless-auth/types0.31.0.recovery: trueand can only enroll a new passkey or authenticator app.requireAuth(Express, Fastify) answers it with403 { "error": "enrollment_required" }, and the Next.jsgetSeamlessSessionandgetSeamlessClaimstreat it as signed out, unlessallowRecoverySession: trueis passed. Set it only where the app drives that enrollment. After enrolling, a refresh issues a token without the claim.notices: true(todayPOST /recovery/verify), an adapter withmessagingnames the notice kinds it can send inx-seamless-auth-delivery-kindsand delivers theaccount_notice_email/account_notice_smsitems the server returns. These items are its "recovery opened" notice with a cancel link, which goes only to the owner and is never logged. If none goes out, the adapter cancels the request with that link's token and answers503 recovery_notice_failed, so recovery never runs without the owner being told. Newhandlers.sendAccountNoticeEmail/sendAccountNoticeSmsandoverrides.accountNoticeEmail/accountNoticeSms; the default sends the server's text as plain text.purpose: "account_recovery") is worded as a recovery code, and the purpose is passed to custom OTP handlers and overrides.Patch Changes
ensureCookiesnow refuses an access cookie whoseinner token is not an access token (
typ: "access"), asrequireAuthalready did, so a signedpre-auth cookie copied into the access slot is answered 401.
verifyUpstreamSessionrefuses aresponse whose token has the wrong
typ: an access token for session flows, and an ephemeraltoken for
/loginand the manifest's pre-auth and registration routes (new optionalexpectedTypeargument). Core also exportsholdsAccessToken.Content-Security-Policy,X-Frame-OptionsandX-Content-Type-Optionsfrom the API, and whenthe API sends neither of the last two it sets
X-Frame-Options: DENYandX-Content-Type-Options: nosniff(unless the application already set them), so the admin consoleserved on the app origin cannot be framed.
authFetchnow sends every auth API request withredirect: "manual"and answers a 3xx as a 502 with{ "error": "upstream_redirect" }, so amisconfigured proxy in front of the API can no longer get the service token and forwarded client
headers resent to another origin. The adapter manifest fetch no longer follows redirects either,
and falls back to the bundled copy instead.
.and..route params on the hand-written passthroughs and core handlers witha 400
bad_request, as the manifest proxy already did. A decoded%2e%2eparam previously stayedliteral after encoding and moved the upstream path. Core exports
encodePathParamandInvalidPathParamErrorfor the shared rule.@seamless-auth/fastify@0.13.0
Minor Changes
0e554e3: Check
OriginagainstallowedOriginseven whenSec-Fetch-Siteis present. Asame-siterequest also covers sibling subdomains, so with
SameSite=Nonecookies the header alone let anysubdomain drive a state change. When
allowedOriginsis configured, a state-changingsame-siterequest must now carry an
Originon the list (a missingOriginis refused).same-originrequests always pass and
cross-siterequests are always refused.This tightens behavior for adopters who set
allowedOrigins: list every origin that calls theadapter from a sibling subdomain. With
allowedOriginsunset the default is unchanged, and asame-siterequest passes as before.0e554e3: Refuse known placeholder secrets at startup.
assertSecretStrengthnow refusesdev-only-cookie-signing-key-replace-me,GRAB_FROM_SEAMLESS_AUTH_PORTAL_DEV, and any valuecontaining
replace-me, which were long enough to pass the length check. Every adapter refuses onefor
cookieSecretorserviceSecretwhen it starts, unless it runs in its insecure local mode(
cookieSecure: false).assertSecretStrengthtakes a new{ allowPlaceholder }option andassertSecretsreadscookieSecure; core also exportsisPlaceholderSecretandKNOWN_PLACEHOLDER_SECRETS.requireAuth(andauthenticateRequest) configured withauthServerUrlandaudiencenow alsoverifies the access token inside the cookie against the auth API's JWKS, and takes the session's
roles from it, so a cookie forged with the cookie secret alone cannot carry claims of its own.
Without that configuration the guard decodes the inner token as before.
5ebc6a2: Support for the auth server's v0.20 account recovery, built on
@seamless-auth/types0.31.0.recovery: trueand can only enroll a new passkey or authenticator app.requireAuth(Express, Fastify) answers it with403 { "error": "enrollment_required" }, and the Next.jsgetSeamlessSessionandgetSeamlessClaimstreat it as signed out, unlessallowRecoverySession: trueis passed. Set it only where the app drives that enrollment. After enrolling, a refresh issues a token without the claim.notices: true(todayPOST /recovery/verify), an adapter withmessagingnames the notice kinds it can send inx-seamless-auth-delivery-kindsand delivers theaccount_notice_email/account_notice_smsitems the server returns. These items are its "recovery opened" notice with a cancel link, which goes only to the owner and is never logged. If none goes out, the adapter cancels the request with that link's token and answers503 recovery_notice_failed, so recovery never runs without the owner being told. Newhandlers.sendAccountNoticeEmail/sendAccountNoticeSmsandoverrides.accountNoticeEmail/accountNoticeSms; the default sends the server's text as plain text.purpose: "account_recovery") is worded as a recovery code, and the purpose is passed to custom OTP handlers and overrides.Patch Changes
ensureCookiesnow refuses an access cookie whoseinner token is not an access token (
typ: "access"), asrequireAuthalready did, so a signedpre-auth cookie copied into the access slot is answered 401.
verifyUpstreamSessionrefuses aresponse whose token has the wrong
typ: an access token for session flows, and an ephemeraltoken for
/loginand the manifest's pre-auth and registration routes (new optionalexpectedTypeargument). Core also exportsholdsAccessToken.Content-Security-Policy,X-Frame-OptionsandX-Content-Type-Optionsfrom the API, and whenthe API sends neither of the last two it sets
X-Frame-Options: DENYandX-Content-Type-Options: nosniff(unless the application already set them), so the admin consoleserved on the app origin cannot be framed.
authFetchnow sends every auth API request withredirect: "manual"and answers a 3xx as a 502 with{ "error": "upstream_redirect" }, so amisconfigured proxy in front of the API can no longer get the service token and forwarded client
headers resent to another origin. The adapter manifest fetch no longer follows redirects either,
and falls back to the bundled copy instead.
.and..route params on the hand-written passthroughs and core handlers witha 400
bad_request, as the manifest proxy already did. A decoded%2e%2eparam previously stayedliteral after encoding and moved the upstream path. Core exports
encodePathParamandInvalidPathParamErrorfor the shared rule.@seamless-auth/nextjs@0.6.0
Minor Changes
0e554e3: Check
OriginagainstallowedOriginseven whenSec-Fetch-Siteis present. Asame-siterequest also covers sibling subdomains, so with
SameSite=Nonecookies the header alone let anysubdomain drive a state change. When
allowedOriginsis configured, a state-changingsame-siterequest must now carry an
Originon the list (a missingOriginis refused).same-originrequests always pass and
cross-siterequests are always refused.This tightens behavior for adopters who set
allowedOrigins: list every origin that calls theadapter from a sibling subdomain. With
allowedOriginsunset the default is unchanged, and asame-siterequest passes as before.0e554e3: Refuse known placeholder secrets at startup.
assertSecretStrengthnow refusesdev-only-cookie-signing-key-replace-me,GRAB_FROM_SEAMLESS_AUTH_PORTAL_DEV, and any valuecontaining
replace-me, which were long enough to pass the length check. Every adapter refuses onefor
cookieSecretorserviceSecretwhen it starts, unless it runs in its insecure local mode(
cookieSecure: false).assertSecretStrengthtakes a new{ allowPlaceholder }option andassertSecretsreadscookieSecure; core also exportsisPlaceholderSecretandKNOWN_PLACEHOLDER_SECRETS.requireAuth(andauthenticateRequest) configured withauthServerUrlandaudiencenow alsoverifies the access token inside the cookie against the auth API's JWKS, and takes the session's
roles from it, so a cookie forged with the cookie secret alone cannot carry claims of its own.
Without that configuration the guard decodes the inner token as before.
5ebc6a2: Support for the auth server's v0.20 account recovery, built on
@seamless-auth/types0.31.0.recovery: trueand can only enroll a new passkey or authenticator app.requireAuth(Express, Fastify) answers it with403 { "error": "enrollment_required" }, and the Next.jsgetSeamlessSessionandgetSeamlessClaimstreat it as signed out, unlessallowRecoverySession: trueis passed. Set it only where the app drives that enrollment. After enrolling, a refresh issues a token without the claim.notices: true(todayPOST /recovery/verify), an adapter withmessagingnames the notice kinds it can send inx-seamless-auth-delivery-kindsand delivers theaccount_notice_email/account_notice_smsitems the server returns. These items are its "recovery opened" notice with a cancel link, which goes only to the owner and is never logged. If none goes out, the adapter cancels the request with that link's token and answers503 recovery_notice_failed, so recovery never runs without the owner being told. Newhandlers.sendAccountNoticeEmail/sendAccountNoticeSmsandoverrides.accountNoticeEmail/accountNoticeSms; the default sends the server's text as plain text.purpose: "account_recovery") is worded as a recovery code, and the purpose is passed to custom OTP handlers and overrides.Patch Changes
ensureCookiesnow refuses an access cookie whoseinner token is not an access token (
typ: "access"), asrequireAuthalready did, so a signedpre-auth cookie copied into the access slot is answered 401.
verifyUpstreamSessionrefuses aresponse whose token has the wrong
typ: an access token for session flows, and an ephemeraltoken for
/loginand the manifest's pre-auth and registration routes (new optionalexpectedTypeargument). Core also exportsholdsAccessToken.Content-Security-Policy,X-Frame-OptionsandX-Content-Type-Optionsfrom the API, and whenthe API sends neither of the last two it sets
X-Frame-Options: DENYandX-Content-Type-Options: nosniff(unless the application already set them), so the admin consoleserved on the app origin cannot be framed.
authFetchnow sends every auth API request withredirect: "manual"and answers a 3xx as a 502 with{ "error": "upstream_redirect" }, so amisconfigured proxy in front of the API can no longer get the service token and forwarded client
headers resent to another origin. The adapter manifest fetch no longer follows redirects either,
and falls back to the bundled copy instead.
.and..route params on the hand-written passthroughs and core handlers witha 400
bad_request, as the manifest proxy already did. A decoded%2e%2eparam previously stayedliteral after encoding and moved the upstream path. Core exports
encodePathParamandInvalidPathParamErrorfor the shared rule.