Highlights
- Device flow support: Logto now supports OAuth 2.0 Device Authorization Grant for smart TVs, CLI tools, IoT devices, and other input-limited apps.
- Passkey sign-in: A full passkey-first authentication experience is now available, including button-based, identifier-first, and autofill-assisted flows.
- Adaptive MFA and optional MFA onboarding: MFA can now be triggered based on sign-in context, and users can be prompted to enable MFA after sign-in.
- Session and grant management: This release adds user session management, authorized app management, and app-level concurrent grant limits across APIs and Console.
- More OSS operator controls: OIDC session TTL is now configurable, and tenant-level OIDC settings are now exposed in Console.
New features & enhancements
OAuth 2.0 Device Authorization Grant
Logto now supports OAuth 2.0 Device Authorization Grant, allowing users to sign in on input-limited devices such as smart TVs, CLI tools, IoT gadgets, and gaming consoles by completing authentication on another device.
Included in this release:
- Full protocol support in core and schemas.
- Device flow support in the sign-in experience.
- Device flow support in Console.
- Device-flow-specific phrases and built-in demo support.
- A device-flow-specific guide in the application settings page.
Console now supports creating a device flow application by:
- Selecting Input-limited app / CLI under the Native framework list.
- Creating an app without framework and choosing Device flow as the authorization flow.
- Creating a third-party Native app and choosing Device flow as the authorization flow.
Passkey sign-in
This release introduces passkey sign-in as a first-class authentication method.
Included capabilities:
- A passwordless sign-in experience using platform authenticators such as Face ID, Touch ID, and Windows Hello.
- Prompting new users to bind a passkey during registration.
- Guiding existing users to bind a passkey in a later sign-in flow.
- Reusing an existing WebAuthn MFA credential for passkey sign-in without an extra registration step.
Supported user journeys:
- Passkey sign-in button: Users can click Continue with passkey to trigger the browser passkey chooser immediately.
- Identifier-first flow: Users first enter an identifier, then are prompted to Verify via passkey before falling back to password or verification code.
- Allow autofill: Supported browsers can suggest saved passkeys directly from the identifier input.
Documentation: https://docs.logto.io/end-user-flows/sign-up-and-sign-in/passkey-sign-in
Adaptive MFA
Logto now supports adaptive MFA.
Included changes:
- Console always exposes the adaptive MFA option on the MFA settings page.
adaptiveMfais stored in the sign-in experience payload.- The sign-in flow evaluates adaptive MFA rules against the current sign-in context.
- MFA verification is required when adaptive rules are triggered.
- The sign-in context is consistently persisted into interaction data, so custom-claims scripts can read it from
context.interaction.signInContext. - A new
PostSignInAdaptiveMfaTriggeredwebhook event is emitted when adaptive MFA forces MFA during sign-in.
Optional MFA onboarding
A new MFA onboarding page is added for users who are not required to set up MFA.
- After credential verification, users can be explicitly asked whether they want to enable optional MFA for better account security.
- This is especially useful when passkey sign-in is enabled, since passkeys can be used for both sign-in and MFA verification, and some users may not want to enable them as an MFA factor at the same time.
User session management
This release adds user session management across APIs and Console.
Account APIs:
GET /my-account/sessionsDELETE /my-account/sessions/:sessionId
Management APIs:
GET /users/:userId/sessionsGET /users/:userId/sessions/:sessionIdDELETE /users/:userId/sessions/:sessionId
Session revocation details:
revokeGrantsTarget=allrevokes grants for all apps.revokeGrantsTarget=firstPartyrevokes only first-party app grants.- When grants are revoked, previously issued opaque access tokens and refresh tokens for those grants are invalidated.
Permission and scope updates:
- A new account center permission setting
sessionis added withoff,readOnly, andedit. - A new user scope
urn:logto:scope:sessionsis introduced to gate session-related account API access.
Session context:
- User IP, user agent, and GEO location can now be recorded in interaction submission data and returned in
session.lastSubmission.
Console support:
- A new Active sessions section is added on the user details page.
- Users can navigate to a dedicated session details page.
- Sessions can be revoked from the session details page.
- Revoking a session removes the sign-in session and revokes associated first-party app grants, forcing reauthentication for future requests.
User application grant management
This release introduces application grant management endpoints for both account and management APIs.
Account API:
GET /my-account/grantsto list active application grants for the current user.DELETE /my-account/grants/:grantIdto revoke a specific grant for the current user.
Management API:
GET /users/:userId/grantsto list active application grants for a given user.DELETE /users/:userId/grants/:grantIdto revoke a specific grant for a given user.
Grant listing supports an optional appType query parameter:
appType=firstPartyappType=thirdParty- Omit
appTypeto return all active grants
Authorized third-party apps in Console
Console now includes an Authorized third-party apps section on the user details page.
- It lists active third-party application authorizations for a user.
- It shows app name, app ID, and access creation time.
- It includes a revoke action with a confirmation modal.
- Revoking an app removes all active third-party grants associated with that app for the user.
App-level concurrent grant limits
This release adds app-level concurrent grant limits.
Core and schemas:
- Application
customClientMetadatanow supports an optionalmaxAllowedGrantsfield. - A new OIDC
authorization.successevent listener validates concurrent grants for the current authorization client and user. - When the active grant count exceeds the configured limit, the oldest grants are revoked automatically.
Console:
- A new Concurrent device limit section is added to the Application details page.
- Developers can configure the maximum number of concurrent active grants per user for the current app.
Configurable OIDC session TTL
This release adds configurable OIDC session TTL support.
Core:
- OIDC provider initialization now respects
oidc.session.ttlfromlogto-config. - When
oidc.session.ttlis provided, it overrides the default session TTL. - New management APIs are added:
GET /api/configs/oidc/sessionPATCH /api/configs/oidc/session
Schemas:
- A new optional
oidc.session.ttlfield is added tologto-config. - The value is configured in seconds.
- If not provided, the default remains
14 days.
For OSS deployments:
- Restart the service instance after config changes so the server can pick up updated OIDC config.
- To apply OIDC config updates automatically without restart, enable central Redis cache.
Tenant settings page and OIDC settings in Console
Console now exposes tenant-level OIDC settings in OSS.
- A new Tenant -> Settings page is added.
- The original Signing keys page is deprecated and removed.
- A new OIDC settings tab is added under Tenant -> Settings.
- Signing key configuration is migrated to Settings -> OIDC settings.
- A new Session maximum time to live field is added to configure tenant-level session TTL in days.
- The Console field uses days for input and display, while the underlying OIDC session TTL config and API use seconds.
Account Center improvements
This release includes several improvements to the out-of-the-box Account Center.
- Added support for replacing the authenticator app through a dedicated
/authenticator-app/replaceroute. - Added a new PUT endpoint in Account API for idempotent TOTP replacement.
- Added support for the
identifierURL parameter to pre-fill identifier input fields. - Added support for overriding the out-of-the-box Account Center language with the
ui_localesURL parameter.
Access token exchange for service-to-service delegation
Logto now supports access token exchange for service-to-service delegation.
- The standard
subject_token_typevalueurn:ietf:params:oauth:token-type:access_tokennow supports access token exchange. - Both opaque and JWT access tokens issued by Logto can be exchanged for new access tokens with different audiences.
- This enables service-to-service delegation scenarios.
Token validation order:
- If the token starts with
sub_, treat it as a legacy impersonation token. - Try to find it as an opaque access token via
oidc-provider. - Fall back to JWT verification using the issuer's JWK set.
Additional detail:
- Access tokens are not consumption-tracked, so the same token can be exchanged multiple times.
- A new
urn:logto:token-type:impersonation_tokentype is added for explicit impersonation token handling.
Password-hash export for migrations
The following endpoints now support an includePasswordHash query parameter:
GET /usersGET /users/:userId
When set to true, the response includes:
passwordDigestpasswordAlgorithm
This is intended for migration scenarios where the raw password hash is needed.
Localization
- Czech language support is added to the sign-in experience. (Credit @ppotaczek @leoshusar)
Bug fixes & stability
MFA verification Sentinel protection
TOTP, WebAuthn, and backup code MFA verifications now report activity to Sentinel.
- Repeated MFA failures can be detected and blocked more consistently during MFA.
- MFA-specific Sentinel actions keep MFA attempts isolated from the shared primary sign-in pool.
- This avoids lockouts leaking across unrelated verification stages or factors.
OIDC adapter query optimization
Improved OIDC adapter findByUid and findByUserCode queries.
- Literal JSONB keys are now used so expression indexes can be used under prepared generic plans.
Postgres startup resilience
Improved startup stability for Postgres deployments.
- Logto now retries Postgres pool initialization on transient connection errors.
Legacy password import compatibility
Improved compatibility for legacy user import.
- Legacy password verification now supports
hex:-prefixed PBKDF2 salt values.
Token exchange performance
Improved token exchange performance.
- Minimal OIDC resource lookup is now cached at the query layer.
- Grant IDs are pre-generated during token issuance to avoid an extra write just for grant creation.
Account Center password autofill
Improved Account Center password forms for better browser autofill and password manager support.
Twilio SMS formatting fix
Fixed Twilio SMS To formatting by normalizing non-E.164 numbers to include a leading +.
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.
New Contributors
- @taka-guevara made their first contribution in #8555
- @synchrone made their first contribution in #8504
- @ppotaczek and @leoshusar made their first contribution in #8526
Full Changelog: v1.37.0...v1.38.0