DATE:
AUTHOR:
Ory Team
Ory Hydra Ory Kratos Ory Keto Ory Enterprise License

Ory Hydra, Ory Kratos, Ory Keto v26.3.5 released

DATE:
AUTHOR: Ory Team

Ory Hydra

Add oauth2.grant_types_disabled config key

Ory Hydra's configuration schema now supports oauth2.grant_types_disabled: a list of OAuth 2.0 grant type identifiers clients may not be registered with. An absent or empty list disables nothing, so deployments that never set the key are unaffected.

The key can only disable grant types; it cannot enable grant types the server does not implement. In particular, the Resource Owner Password Credentials grant remains unavailable in Ory Hydra OSS — it is implemented only in Ory Network and Ory Enterprise License (OEL) deployments.

Registering a new client with a disabled grant type, or adding a disabled grant type to an existing client, is rejected with invalid_client_metadata (HTTP 400). Clients that already carry the grant type are unaffected: they keep working at runtime and remain fully maintainable through the API — updates, secret rotation, and lifespan changes still succeed.

Disabled grant types are also omitted from grant_types_supported in the OpenID Connect discovery and OAuth 2.0 authorization server metadata documents, so new integrations only see grant types they can register.

Hydra warns at startup about list entries that do not match a registered OAuth 2.0 grant type and are not custom extension grant URIs — for example device_code instead of urn:ietf:params:oauth:grant-type:device_code, or a misspelled grant type URN — since unknown entries disable nothing.

Set the key through an environment variable as a comma-separated list (OAUTH2_GRANT_TYPES_DISABLED='password,urn:ietf:params:oauth:grant-type:device_code') or as a JSON array.


This is now available on Ory Network, for the Ory Enterprise License, and will be part of the next Ory Open Source release.


Ory Kratos

Passkey display names now follow one deterministic precedence rule

When an identity schema flags more than one trait with passkey.display_name: true (for example email and phone), the settings flow previously picked the display name for a new passkey at random from the populated flagged traits. A user adding a passkey from account settings would sometimes see it named after their email and sometimes after their phone number.

The display name is now resolved by a single rule in every flow: traits flagged with passkey.display_name take precedence over traits flagged with webauthn.identifier, and within each group the alphabetically-first trait with a non-empty value wins. With email and phone flagged, the email address is now always used when it is set.

For schemas that flag both passkey.display_name and webauthn.identifier traits, this also changes the candidate order the registration flow publishes to the browser: passkey.display_name traits now come first, where previously all flagged traits were sorted alphabetically in one list. A passkey created during registration may therefore get its name from a passkey.display_name trait where an alphabetically-earlier webauthn.identifier trait was used before. Existing passkeys keep their names, and schemas that flag only one kind of trait see no change at registration.

Prometheus metrics for the Jsonnet process pool

The Prometheus endpoint now reports the state of the Jsonnet worker process pool, which evaluates webhook payload templates, OIDC claims mappers, and session token claims. Use these metrics to see whether requests are queueing for a free worker.

The metrics mirror the existing SQL connection pool metrics and carry no labels, because each process holds exactly one pool:

MetricTypeDescriptionory_jsonnet_pool_max_processesgaugeMaximum number of worker processes.ory_jsonnet_pool_processesgaugeStarted worker processes, in use and idle.ory_jsonnet_pool_in_use_processesgaugeWorker processes currently in use.ory_jsonnet_pool_idle_processesgaugeIdle worker processes.ory_jsonnet_pool_constructing_processesgaugeWorker processes currently starting.ory_jsonnet_pool_wait_count_totalcounterAcquires that had to wait for a worker.ory_jsonnet_pool_wait_duration_seconds_totalcounterTotal time blocked waiting for a worker.ory_jsonnet_pool_acquired_processes_totalcounterWorker processes ever acquired.ory_jsonnet_pool_acquired_duration_seconds_totalcounterTotal duration of all acquires.ory_jsonnet_pool_canceled_acquires_totalcounterAcquires canceled before a worker was free.

The courier now evaluates Jsonnet in an isolated process

The courier renders the request body of an HTTP delivery channel from a Jsonnet template, and SMS delivery always uses an HTTP channel. It was evaluating those templates inside the courier process instead of in a sandboxed worker, so a template that consumed excessive memory or CPU affected message delivery as a whole. The courier now uses the same isolated worker pool as the rest of Kratos, where evaluation runs under a memory limit and a filesystem sandbox.

No configuration changes are needed, and template behavior is unchanged.

Serve the WebAuthn Related Origin Requests document

Ory Kratos now serves the WebAuthn Related Origin Requests document at /.well-known/webauthn. It lists the relying party origins configured for the enabled WebAuthn and passkey methods.

Browsers that support Related Origin Requests (Chrome 128+, Safari 18+) consult this document when a page requests a WebAuthn relying party ID that does not match the page's own origin. This lets passkeys bound to a relying party ID served by Ory work on additional origins, for example across several custom domains: add the extra origins to the relying party origins of the WebAuthn or passkey configuration and they appear in the document automatically.

See https://www.w3.org/TR/webauthn-3/#sctn-related-origins for details.

Webhooks now receive enrolled credential types and available AAL

Login, registration, settings, recovery, and verification webhooks now receive the identity's enrolled credential types and available authenticator assurance level. The payload's identity.credentials lists each enrolled credential's type and identifiers, plus its version and its creation and update timestamps when known — never secrets: credential configuration is stripped and identity-provider (OIDC and SAML) credentials list no identifiers. identity.available_aal reports whether the identity has a usable second factor. Use this to build risk-based skip-vs-challenge decisions in your webhook.


This is now available on Ory Network, for the Ory Enterprise License, and will be part of the next Ory Open Source release.


Ory Keto

Strict mode requires subject sets

If you run Ory Keto with feature_flags.strict_mode (or the deprecated namespaces.experimental_strict_mode) enabled, creating relationships or checking permissions with a plain subject_id now fails with 400 Bad Request (InvalidArgument over gRPC). Reading and deleting existing subject_id relationships keeps working.

Before upgrading, rewrite subject_id relationships as subject sets or disable strict mode. See the migration guide.

Faster permission checks

Ory Permissions now applies optimizations based on your OPL schema, making permission checks significantly faster. This is enabled by default for all new projects.

If you have an existing project, you can opt in from the console under Permissions > Namespaces & Rules. Review the migration guide first to ensure your OPL schema and your use of subjects are compatible.


This is now available on Ory Network, for the Ory Enterprise License, and will be part of the next Ory Open Source release.


Ory Network, Ory Oathkeeper, Ory Polis, Ory Elements, and Ory Terraform

No significant changes in this release.

Powered by LaunchNotes