|
| 1 | +## v26.3.4 |
| 2 | + |
| 3 | +### Account linking now works when registration is disabled |
| 4 | + |
| 5 | +Automatic account linking now works when registration is disabled. Signing in with an OIDC or SAML provider whose email matches an |
| 6 | +existing account starts the account linking flow even if `selfservice.flows.registration.enabled` is `false`. New sign-ups remain |
| 7 | +blocked. Previously, the linking attempt failed with "Registration is not allowed because it was disabled." |
| 8 | + |
| 9 | +### Bound the password identifier-similarity check by length |
| 10 | + |
| 11 | +The password validator's identifier-similarity check now bounds the length of the identifier and password it compares. Real |
| 12 | +identifiers and passwords are far shorter than this bound, so legitimate flows are unaffected. This hardens the check against |
| 13 | +excessive resource use on very long inputs. |
| 14 | + |
| 15 | +### Exclude already registered credentials in WebAuthn and passkey settings |
| 16 | + |
| 17 | +The WebAuthn and passkey settings flows now populate `excludeCredentials` in the registration challenge with the identity's |
| 18 | +already registered credentials. Browsers no longer silently overwrite an existing platform-authenticator entry (Touch ID, Windows |
| 19 | +Hello, Android) when a user re-enrolls the same device; instead the authenticator reports the credential as already registered. |
| 20 | +Kratos additionally rejects a registration response whose credential ID is already registered on the identity. |
| 21 | + |
| 22 | +### Metrics endpoints now support OpenMetrics and trace exemplars |
| 23 | + |
| 24 | +The Prometheus metrics endpoints of Kratos, Keto, Hydra, Oathkeeper, and Talos now additionally serve the OpenMetrics exposition |
| 25 | +format. The format is selected automatically through standard HTTP content negotiation: scrapers that ask for OpenMetrics receive |
| 26 | +it, and all other scrapers keep receiving the classic text format. No configuration or scraper change is necessary. |
| 27 | + |
| 28 | +OpenMetrics enables exemplars, which attach a trace reference to a metric sample. Two sets of metrics use this: |
| 29 | + |
| 30 | +- The HTTP request duration histograms and request counters attach an exemplar when a request runs under a sampled trace, so |
| 31 | + latency dashboards can link slow-request outliers and error spikes to the traces that caused them. |
| 32 | +- The `ory_x_popx_cockroach_transaction_retries_total` counter attaches an exemplar whose value is the transaction's retry count |
| 33 | + when a transaction is retried during a traced request, and the trace records a `db.transaction.retry` span event. Dashboards can |
| 34 | + link retry spikes directly to the traces that caused them. |
| 35 | + |
| 36 | +That counter's `caller` label now also more reliably attributes automatic CockroachDB transaction retries to the business |
| 37 | +operation that opened the transaction, for example the OAuth2 refresh token flow, instead of a generic persistence `Transaction` |
| 38 | +wrapper method. This makes it possible to see which operation is causing database contention. Dashboards or alerts that match |
| 39 | +specific `caller` label values may need updating, because existing label values change with this release. |
| 40 | + |
| 41 | +### Opt-in cleanup of expired data on CockroachDB |
| 42 | + |
| 43 | +Ory Kratos Enterprise License deployments on CockroachDB can now set up row-level TTL jobs that automatically delete expired data. |
| 44 | +Run the new `kratos migrate row-ttl up` command to configure these retention periods: |
| 45 | + |
| 46 | +- Self-service flows, one-time codes, tokens, and continuity containers: 7 days after they expire. |
| 47 | +- Sessions: 30 days after they expire. |
| 48 | +- Courier messages, message dispatches, and self-service errors: 30 days after they are created. |
| 49 | + |
| 50 | +The command is opt-in: `kratos migrate sql up` does not change TTL settings. Use `kratos migrate row-ttl dump` to print the SQL |
| 51 | +statements — for review, or to adapt the retention periods and apply them manually. `kratos migrate row-ttl status` shows which |
| 52 | +TTL migrations are applied, and `kratos migrate row-ttl down` removes the TTL configuration again. |
| 53 | + |
| 54 | +Running `kratos migrate row-ttl up` replaces any custom row-level TTL settings on the affected tables with the defaults above. The |
| 55 | +command requires CockroachDB and exits with an error on other databases. |
| 56 | + |
| 57 | +CockroachDB deletes expired rows on a schedule, not at the exact moment the retention period ends. Expired rows can remain in the |
| 58 | +database for some time: either the TTL job has not processed them yet, or it has deleted them but garbage collection has not yet |
| 59 | +removed them. |
| 60 | + |
| 61 | +### Persist WebAuthn and passkey sign counter for clone detection |
| 62 | + |
| 63 | +Ory now updates the stored WebAuthn and passkey authenticator state after every successful login. The signature counter, |
| 64 | +clone-warning flag, and backup state are written back to the credential, so W3C WebAuthn clone detection works as intended. |
| 65 | + |
| 66 | +Previously the signature counter stayed at its registration value, which left clone detection inert. A login that presents a |
| 67 | +non-increasing counter is still allowed — synced passkeys (such as Apple iCloud or Google) legitimately report a static counter — |
| 68 | +but the possible-clone warning is now recorded on the credential and is visible through the admin identity API. |
| 69 | + |
| 70 | +### Revoke a single DeviceAuthn key by identifier |
| 71 | + |
| 72 | +`DELETE /admin/identities/{id}/credentials/deviceauthn` now revokes a single DeviceAuthn key selected by the `identifier` query |
| 73 | +parameter, where the identifier is the key's `client_key_id`. This is the same parameter that OIDC and SAML credential deletion |
| 74 | +already use. |
| 75 | + |
| 76 | +Because the `client_key_id` is unique per identity, administrators can revoke exactly one device key without affecting other keys |
| 77 | +— including keys that share the same device name. Before, deleting the `deviceauthn` credential type removed all device keys at |
| 78 | +once. |
| 79 | + |
| 80 | +The endpoint returns `404 Not Found` when the identity has no `deviceauthn` credential or when no key matches the identifier, and |
| 81 | +`400 Bad Request` when the identifier is missing. Removing the last key leaves the `deviceauthn` credential with no keys. |
| 82 | + |
| 83 | +Find the client key ids by calling `GET /admin/identities/{id}?include_credential=deviceauthn`. |
| 84 | + |
| 85 | +### Second-factor enrollment now refreshes the session's authenticated_at timestamp |
| 86 | + |
| 87 | +Setting up a second factor — authenticator app (TOTP), security key, passkey, or lookup secret — in a settings flow now refreshes |
| 88 | +the session's `authenticated_at` timestamp, in addition to elevating the session to AAL2. Linking a social sign-in provider in a |
| 89 | +settings flow also refreshes the timestamp. |
| 90 | + |
| 91 | +Previously, enrolling a second factor raised the session to AAL2 but left `authenticated_at` unchanged. Because AAL2 |
| 92 | +re-authentication prompts are timed from `authenticated_at`, users could be asked to re-authenticate immediately after proving |
| 93 | +possession of the factor they had just enrolled. The timestamp now reflects the enrollment as the most recent authentication |
| 94 | +event. |
| 95 | + |
| 96 | +### YugabyteDB support for Kratos, Hydra, and Keto (OEL) |
| 97 | + |
| 98 | +Ory Enterprise License deployments can now run Ory Kratos, Ory Hydra, and Ory Keto against YugabyteDB. |
| 99 | + |
| 100 | +#### Enabling YugabyteDB |
| 101 | + |
| 102 | +Point the `dsn` at your YugabyteDB cluster using the `yugabyte://` scheme (the synonym `yugabytedb://` also works): |
| 103 | + |
| 104 | +``` |
| 105 | +yugabyte://user@host:5433/database?sslmode=disable |
| 106 | +``` |
| 107 | + |
| 108 | +#### Recovering an interrupted migration |
| 109 | + |
| 110 | +YugabyteDB applies DDL with autocommit. Old PostgreSQL migrations inherited by YugabyteDB can contain multiple statements, so an |
| 111 | +interruption may leave the first statements applied without a row in `schema_migration`. Current versions of Ory no longer use |
| 112 | +multi-statement migrations and are safe. |
0 commit comments