Repository navigation
chore(deps): update svhd/logto docker tag to v1.46.0 - #12835
Merged
Merged
Conversation
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 contains the following updates:
1.45.0->1.46.0Release Notes
logto-io/logto (svhd/logto)
v1.46.0Compare Source
Highlights
acr_valuesandmax_ageand readacr,amr, andauth_timefrom tokens. Account Center uses it to require a recent sign-in before sensitive changes.confirm_redirect_policysign-in parameter shows a "Continue" page before returning to the app after the user enters a password.New features & enhancements
OIDC step-up authentication
OIDC clients can now ask for a recent or stronger sign-in:
acr_valuesandmax_agein the authorization request. Logto advertises the supported ACR values in the discovery document.acr,amr, andauth_timeare returned in ID tokens, access tokens, and introspection responses.urn:logto:acr:1faaccess token instead of a separate verification record. When the sign-in is not recent enough, the Account API answers with an RFC 9470 step-up challenge.max_age.See Step-up authentication.
Sign-In with Ethereum
Admins can enable the new Ethereum Wallet social connector (
@logto/connector-siwe). Users with an injected EIP-1193 wallet sign a one-time SIWE (EIP-4361) message without leaving the sign-in page. A single address works across supported EVM chains, and admins can restrict the allowed chain IDs.Keep the iOS "Save Password" prompt
On iOS,
ASWebAuthenticationSessioncloses as soon as it sees the app's callback URL, which dismisses the system "Save Password" prompt right after the user signs in with a password.Pass
confirm_redirect_policy=passwordin the authorization request to show a page that returns to the app only when the user selects "Continue". The page appears after the user enters a password in the sign-in experience: password sign-in, password registration, setting a password, or a step-up password verification.Without the parameter, Logto redirects back to the app right away. Third-party applications ignore it. The Swift integration guide in Console shows how to use it. See Keep the iOS Save Password prompt.
Personal access tokens in Account Center
When the tenant enables the personal access token field in Account Center, users can create, rename, and revoke personal access tokens on the Account Center Security page. Each token is shown only once at creation and expires within 365 days.
The same operations are available through the Account API under
/api/my-account/personal-access-tokens, with the newurn:logto:scope:personal_access_tokensscope (UserScope.PersonalAccessTokensin@logto/core-kit).GeeTest CAPTCHA
GeeTest CAPTCHA v4 is now available as a CAPTCHA provider. Its adaptive challenges are localized, which suits sign-in experiences targeting mainland China, where Google reCAPTCHA is often unreachable.
PUT /api/captcha-providerwithtype: "Geetest".While GeeTest is the CAPTCHA provider, the sign-in page's Content Security Policy allows GeeTest's SDK, API, and static hosts.
access_deniedwhen sign-in is cancelledaccess_deniedand returns the user to the client application with the originalstateandiss.POST /api/experience/abort, with an optionalreasonthat becomeserror_description.GET /api/experience/interaction/direct-sign-inreturns thedirect_sign_invalue of the current authorization request, so a custom experience can tell a direct sign-in from a hosted one before the interaction is initialized.User management
mfa.requiredtotruethrough the Management API. The user must set up MFA on their next sign-in and cannot skip it, regardless of the organization-level MFA policy.$5$and$6$, as used by Linux, passlib, PHP, and others) by setting the password algorithm toLegacyand passing the complete stored crypt string as the password digest.Static attributes for SAML applications
SAML applications can define fixed attribute names and values that are sent in every assertion alongside the mapped user attributes, for service providers that require constant values such as an account or site ID.
staticAttributeswithPOST /api/saml-applicationsorPATCH /api/saml-applications/{id}.Attribute names may contain letters, digits, and
_.:/#@​-. They must not conflict with each other or with the user attribute names in the assertion, including names that differ only in case or separators, such assite_idandsiteId.Cross-Origin-Opener-Policy for Bring your UI
Tenants with Bring your UI can choose
same-origin-allow-popupsorsame-originunder Console > Sign-in experience > Branding > Bring your UI, or setcrossOriginOpenerPolicywith the sign-in experience Management API. The header is sent on the hosted sign-in pages while custom UI assets are served. The default,unsafe-none, sends no header, so apps that open the sign-in page in a popup keep working.login_hintfor Account CenterAdd
login_hintto any Account Center URL, for examplehttps://auth.foo.com/account/security?login_hint=foo@example.com, to pre-fill the identifier on the sign-in page when the user needs to sign in. The hint only pre-fills the field, so users can still sign in with a different identifier.Management API and webhooks
GET /api/usersaccepts a repeatablecustomDataquery parameter that matches users whose custom data contains the given JSON object, for examplecustomData={"customId":114514}. Repeated values are combined with OR, and the condition combines with other user filters using AND.GET /api/organizationsaccepts ajitEmailDomainquery parameter that returns, with pagination, the organizations a user with this email domain would be provisioned into. It combines withqand pagination like the other filters.hasPasswordfor organization members:GET /api/organizations/:id/usersnow includes whether each member has a password set, matching the user list and user detail responses.deliveryId: Every webhook payload now carries adeliveryId. It is unique per hook and event and stays the same across retries of the same request, so a receiver can process each delivery exactly once. It is also the ID of the audit log entry that records the delivery: open it from the webhook's recent requests in Console, or fetch it withGET /api/logs/:id. The "test webhook" payload carries one too.Security hardening
Action required: email sync for OAuth 2.0 and Microsoft Azure AD connectors
The standard OAuth 2.0 social connector (
@logto/connector-oauth1.8.0) adds a Disable Email Sync switch (disableEmailSync), matching the one the Microsoft Azure AD connector has offered since Logto 1.43.0.Upgrading alone does not change how existing connectors behave. The switch is off by default, so these connectors keep syncing the email address returned by the provider to the user profile. The standard OAuth 2.0 protocol carries no verification state for an email address, so the mapped
emailvalue is taken at face value.After upgrading, review every standard OAuth 2.0 and Microsoft Azure AD social connector. Turn on Disable Email Sync when the provider does not verify that users own the email addresses it returns. The address stays available in
rawData.Sign in with Apple
The Apple connector (
@logto/connector-apple1.6.11) now takes the user's email only from the Apple ID token, and recognizesemail_verifiedwhether Apple sends it astrueor"true". When Apple marks the email as unverified, no email is returned. The user's name still comes from the details Apple sends on the first authorization.Multi-factor authentication
Enterprise SSO
Audiencevalues exactly matches the connector's Audience URI (SP Entity ID) on the domain that receives the response or on the tenant's default domain. If SAML sign-in fails with "SAML assertion audience does not match the SP entity ID" after upgrading, set the audience at your identity provider to the Audience URI (SP Entity ID) shown in the connector's settings.Account API and third-party applications
The following Account API operations now require a first-party application, matching the first-party only policy that account mutations already follow:
GET /api/my-account/identities/:target/access-tokenGET /api/my-account/sso-identities/:connectorId/access-tokenPUT /api/my-account/identities/:target/access-tokenThird-party applications now receive:
First-party applications, including Account Center and Console, are unaffected. If an integration retrieves stored provider tokens today, use a first-party application to obtain the access token.
Connector request errors
When an outbound request made by a connector fails, for example on a network timeout, the error is now reduced to its name, code, and message before it is logged, exported to telemetry, recorded in the audit log, or returned in an error response. The server log also keeps the request method and the origin and pathname of the URL. Request bodies, headers, and query strings are no longer included.
Single-use codes and tokens
An authorization code, device code, pushed authorization request, or one-time token is now accepted from at most one request. Every other request that presents it gets the error a reused one returns:
invalid_grantfor a code,invalid_request_urifor a pushed authorization request, andone_time_token.token_consumedfor a one-time token. Refresh tokens keep their reuse window.SAML applications
GETandPOST /api/saml/:id/authnnow reject a SAML request whose XML is not well-formed, such as one with an unescaped&or a mismatched end tag, with400 application.saml.invalid_saml_request. The audit log entry of such a request records the format error undersamlRequestError. A request that cannot be decoded or parsed also gets this 400 error instead of a 500 when the application does not require signed authentication requests.Logto Tunnel
@logto/tunnel0.3.12 hardens serving static files from--experience-path:Rangewhose end is past the end of the file is clamped to the file size. ARangethat cannot be satisfied returns 416.Request validation
guard.invalid_inputerror response now lists only the first 100 validation issues.POST /callback/:connectorIdandPOST /account/callback/social/:connectorIdnow stop validating an invalid body after 100 invalid fields. The error response is unchanged.Bug fixes & stability
Sign-in experience
Social sign-in
502 connector.social_provider_unreachableinstead of a generic 500. The response carries the network error code and the connector ID, and end users see a translated message. The request method and URL are written to the server log.401 connector.authorization_failed, carrying the provider'serroranderror_description, on every social sign-in, verification, and account linking path. This coverserror=access_denied(OAuth 2.0 / OpenID Connect),user_cancelled_authorize(Sign in with Apple, LinkedIn), anduser_cancelled_login(LinkedIn). Most social connectors used to answer with a genericconnector.generalerror.{}.OAuth and OIDC
scopevalues: Some clients, such as OpenAI Codex, refresh tokens with ascopethat has a leading space (for example" offline_access"). Logto rejected these requests withinvalid_scope, so users had to sign in again each time the access token expired. Logto now ignores the empty scope values that leading, trailing, or repeated spaces produce. Ascopemade only of spaces counts as omitted, so a refresh token request keeps the refresh token's original scope.Management API
customClientMetadatakeys:POST /api/applicationsandPATCH /api/applications/:idnow reject an unknown key undercustomClientMetadatawith400 guard.invalid_input, whosedatalists the key. A typo such asrefreshTokenTtlInDayused to be accepted while the setting was never applied. Existing applications are not affected.first,prev,next, andlastlinks of list endpoints such asGET /api/applications?types=SPA&types=Traditional&page=1now keep every value of a repeated query parameter, instead of joining them into a single comma-separated value.GET /api/one-time-tokensfilters byemailorstatus, theTotal-Numberheader now counts only the matching tokens.SAML applications
o365roleortenant1idwere sent as the literal{attr…}placeholder instead of the user's value. They now carry the mapped value.Console and Account Center
Documentation
Cannot find 'client' in scopeerror when they are copied into an Xcode project (#9788). Thanks to @timokoethe.Connectors
expires_inas a string, as some providers such as Criipto do, no longer fail with an invalid response error.scopeas a JSON array, as some providers such as Twitch do, no longer fail with an invalid response error. The scopes are normalized to a space-delimited string.410 Gone. The connector now requests profile fields from the Patreon API v2 identity endpoint, so Patreon sign-in works again.jsonGuardandjsonObjectGuardnow build their recursive JSON schema once instead of once per nested value, which cuts the time spent validating large JSON payloads. Validation results are unchanged.Self-hosting & OSS notes
npm run alteration deployin the@logto/cli/core image, orlogto db alteration deploy) before starting the new version. See the upgrade guide.ENOTFOUND,EAI_AGAIN), instead of exiting immediately. The CLI database commands, such asdb seedanddb alteration deploy, now retry transient connection errors the same way, DNS failures included./consolerequest reaches the default tenant because the request origin does not match any configured admin endpoint. If you see it, check the Console URL andADMIN_ENDPOINT.Contributors
Huge thanks to the community members whose work shipped in this release:
deliveryId(#9882),hasPasswordfor organization members (#9883), organization filter by just-in-time provisioning domain (#9912),customClientMetadatakey validation (#9931), unreachable social provider errors (#9879), declined social authorization errors (#9880), database connection retries on DNS failures (#9881, #9928), and connector request errors in logs and responses (#9849)ADMIN_ENDPOINTmismatch warning (#9408)Full Changelog: logto-io/logto@v1.45.0...v1.46.0
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Renovate Bot.