logto
v1.46.0🧑🚀 Authentication and authorization infrastructure for SaaS and AI apps, built on OIDC and OAuth 2.1 with multi-tenancy, SSO, and RBAC.
- Maintenance
- ActiveBased on the last push: commit history is not collected yet
- License
- MPL-2.0Weak copyleft · OSI-approved
- Security
- 24 advisories1 critical, 15 high, 8 medium
- Supported versions
- No scheduleendoflife.date does not track this project
14.9k stars · 1.2k forks · 131 open issues · last release 10 days ago · data checked 5 hours ago
Breaking changes
What to check before upgrading, taken from the notes of the last 30 releases.
- v1.38.0Mar 31, 2026
Breaking changes
Connector kit cleanup
- Removed the long-deprecated
mockSmsVerificationCodeFileNameexport from@logto/connector-kit.
Mock connector file path update
Updated the file paths used by mock connectors to store sent messages.
/tmp/logto_mock_email_record.txt->/tmp/logto/mock_email_record.txt/tmp/logto_mock_sms_record.txt->/tmp/logto/mock_sms_record.txt
This creates a more consistent and organized structure for mock connector files and makes them easier to manage and mount in Docker environments.
- Removed the long-deprecated
Release history
All releases on GitHubHighlights
- OIDC step-up authentication: Apps can request
acr_valuesandmax_ageand readacr,amr, andauth_timefrom tokens. Account Center uses it to require a recent sign-in before sensitive changes. - Sign-In with Ethereum: A new Ethereum Wallet social connector lets users sign in with an EVM wallet.
- Keep the iOS "Save Password" prompt: The
confirm_redirect_policysign-in parameter shows a "Continue" page before returning to the app after the user enters a password. - Personal access tokens in Account Center: Users can create, rename, and revoke their own personal access tokens.
- GeeTest CAPTCHA: Use GeeTest CAPTCHA v4 for bot protection, which suits sign-in experiences targeting mainland China.
- Static attributes for SAML applications: Send fixed attribute values in every SAML assertion.
- Security fixes, one needing admin action: This release includes security fixes for MFA, social and enterprise sign-in, the Account API, and Logto Tunnel. Standard OAuth 2.0 and Microsoft Azure AD social connectors need a settings review after upgrading. See Security hardening below.
New features & enhancements
OIDC step-up authentication
OIDC clients can now ask for a recent or stronger sign-in:
- Request: Pass
acr_valuesandmax_agein the authorization request. Logto advertises the supported ACR values in the discovery document. - Result:
acr,amr, andauth_timeare returned in ID tokens, access tokens, and introspection responses. - Account Center: The built-in Account Center now authorizes sensitive Account API operations with a fresh first-party
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. - Recent authentication window: Set how recent the sign-in must be in Console > Sign-in experience > Account center > Recent authentication (10 minutes by default). A client can still request a shorter window with
max_age. - Compatibility: Apps that call the Account API directly can still use a verification record ID for sensitive operations.
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, ASWebAuthenticationSession closes 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=password in 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 new urn:logto:scope:personal_access_tokens scope (UserScope.PersonalAccessTokens in @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.
- Create a CAPTCHA v4 event in the GeeTest dashboard.
- Go to Console > Security > CAPTCHA and add GeeTest with its CAPTCHA ID and CAPTCHA key. The same configuration is available through
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_denied when sign-in is cancelled
- Consent page: Cancelling the built-in consent page now ends the interaction with
access_deniedand returns the user to the client application with the originalstateandiss. - Direct sign-in: A failed direct sign-in returns to the client the same way, instead of falling back to the hosted sign-in page.
- Custom sign-in experiences: End the current interaction with the same error through
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
- Require MFA setup for a user: Turn on Require MFA setup on the user details page in Console, or set
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. - Unlock a user: A new unlock action on the user details page clears sign-in and security verification lockouts keyed on the user's ID, primary email, primary phone, and username, so admins don't need to know which identifier triggered the lockout.
- SHA-crypt legacy password hashes: Import users with SHA-crypt hashes (
$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.
- Console: Use the Static attributes section on the SAML application's attribute mapping tab.
- Management API: Set
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 as site_id and siteId.
Cross-Origin-Opener-Policy for Bring your UI
Tenants with Bring your UI can choose same-origin-allow-popups or same-origin under Console > Sign-in experience > Branding > Bring your UI, or set crossOriginOpenerPolicy with 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_hint for Account Center
Add login_hint to any Account Center URL, for example https://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
- Search users by custom data:
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. - Find organizations by just-in-time provisioning domain:
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.- Webhook
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-oauth 1.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 email value 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-apple 1.6.11) now takes the user's email only from the Apple ID token, and recognizes email_verified whether Apple sends it as true or "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.