Token exchange, back-channel logout, and realm isolation enforced by the type system
FerrisKey 0.9.0 adds RFC 8693 token exchange with delegation policies, OIDC Back-Channel Logout and a consent screen, and carries password hashes over from other systems. Underneath, every repository port now takes a realm scope, which closed a whole class of cross-realm access bugs.
- Implements RFC 8693 token exchange for downscoping, targeting another service, and delegation: per-client opt-in, delegation policies with a scope ceiling and separate impersonation and delegation switches, actor tokens, the act claim with chained actors, a console tab to manage policies, and an entry in the discovery document.
- Adds OIDC Back-Channel Logout with its console settings, the prompt and max_age parameters, a remember-me setting that now changes the SSO cookie lifetime, an SSO session handed out on the MFA login steps, and a themable consent screen for a client's optional scopes.
- Makes migrations from other identity systems keep their users: bcrypt password hashes are imported and re-encoded as argon2id on first sign-in, and a user can be created with a caller-supplied id so the sub claim survives. With the CLI, this lets teams import users from Supabase together with their passwords.
- Rebuilds webhook delivery on a persisted outbox with retry policies per realm and per webhook, delivery history, manual replay and signing secret regeneration, and translates the console into English and Simplified Chinese with API errors localised from a stable reason code.
- Threads the realm through every repository port with a RealmScope type, which turned a series of cross-realm access bugs into compile errors, and fixes around fifteen of them: login sessions, passkeys, roles, credentials, maintenance whitelists and delegated realm-admin roles are now confined to the realm in the URL, and the access token is no longer handed out in a cookie.
Where 0.8 turned inward to build foundations that could be verified, 0.9 spends them: the realm boundary is now checked by the compiler, and the protocol surface grows with token exchange, back-channel logout and consent on top of it.