Identity Core · single sign-on
Sign in with your key.
No password to steal.
Identity Core is the single sign-on we wrote from scratch in Rust. People sign in with a passkey or a security key: to web applications through OpenID Connect, and to Fedora Linux at the login and lock screens. Sudo rules name the exact command. It runs our own sign-in at id.h2.io.
One identity for apps, Linux and sudo
Each person has one account, held by Identity Core. Applications ask it who is signing in, and Linux machines take from it who may log in and what each person may run. Disable someone, and their sessions and open invitations are revoked at once; a machine working offline learns of it when it reconnects or its lease runs out.
Applications. Web applications sign in through OpenID Connect. Before an application learns who the person is, Identity Core asks for their consent and names the application; the organisation’s own applications can be set to skip that screen.
Linux. The security key opens the login screen and the lock screen with its PIN and a touch. A laptop keeps working offline for a set time, under a signed lease.
Sudo. Each rule names the exact command, its arguments and the account it runs as, and every command is checked again when it runs.
Accounts without a password
Identity Core holds no password to steal, phish or reset: neither the server nor its pages handle one. People sign in with a passkey or a security key, and a key’s PIN goes into the browser’s own prompt, which the page cannot read.
Table 1 An account, from the invitation to a lost key.
-
01 / invite
By invitation only
An administrator issues an enrolment token. It works once, expires after 15 minutes and is stored only as a hash.
-
02 / sign in
A key, then a session
The person enrols a passkey or a security key and signs in with it. On id.h2.io a sign-in lasts a fixed 8 hours, and extending it asks for a fresh touch.
-
03 / keys
Several keys each
People name their keys, add a spare and remove a lost one. Changes need a touch of a key already on the account, which can unlock key changes for five minutes, and the last key cannot be removed.
-
04 / recover
Every key lost
An administrator recovers the account. All the old keys and server sessions are revoked, and the account keeps its permissions.
-
05 / leave
Someone leaves
Disabling a person revokes their server sessions and their open invitations at once.
-
06 / admin
Changes need a key
The admin pages change nothing until an administrator verifies with a key, which opens a five-minute window. Successful enrolments, sign-ins and identity changes are recorded.
Failure logs without secrets. A failed attempt shows the person a reference they can quote. The failure log holds only fixed fields and that reference: never credentials, tokens, cookies, usernames or request bodies.
Sign-in for your applications
Applications sign in through OpenID Connect. Identity Core supports a deliberately narrow profile: the authorisation code flow with PKCE for people, exact redirects, and refresh tokens that rotate.
What an application gets
- Code flow with PKCEThe authorisation code flow, with S256 PKCE only. Redirects must match the registered address exactly. ID tokens are signed (RS256), and discovery, signing keys and UserInfo are published.
- ConsentIdentity Core names the application and the account, and the person chooses “Allow and continue” before the application learns anything. The organisation’s own applications can be set to skip this screen.
- Refresh tokens that rotateRefresh is switched on per application. Every refresh returns a new token, and replaying an old one revokes the whole family. A family lasts at most an hour, ends after 15 minutes without use, and never outlives the sign-in.
- Tools and servicesCommand-line and headless tools sign in with the device flow, approved in a browser. A service gets a token for one named API and scope with client credentials, and never becomes a person.
- Logout and revocationApplications that register a logout address get a signed back-channel message when a session ends, retried for up to an hour. Access and refresh tokens can be revoked, and an API can look up the service tokens it receives.
- Several accountsIdentity Core holds up to eight accounts in one browser, chosen per tab, and one account never silently becomes another. An application keeps accounts apart per tab only if it supports this itself.
An existing company sign-in can stay. Identity Core accepts sign-ins from OpenID Connect issuers an administrator names. An administrator links each person, or the person links themselves with a key touch and a fresh sign-in upstream. Upstream usernames and roles never become local accounts or rights. We have tested it with one outside product, Keycloak 26.7.2, as the company issuer, passkeys at Keycloak included (26 of 26 checks, 5 October 2026). Identity Core sees that the company sign-in happened, though it cannot see how the person proved who they were.
Linux, with rights granted one by one
Each machine enrols with its own key and receives a signed policy: who may log in, which way, and which commands they may run as whom. Logging in, working offline and using sudo are separate grants: a login grant includes neither offline use nor sudo.
Identities in one place. User and group IDs are set centrally and stay the same on every machine. An existing local account can be linked in place and keeps its IDs, groups, home and files. Matching usernames alone never link anything.
A signed policy. Each machine’s policy is signed with Ed25519. Before installing it, the machine checks the signature, that the policy names this machine, its expiry and its sequence.
A lost machine. One step revokes the old machine and invites a clean replacement, and access to it is restored explicitly.
Table 2 Four ways onto a machine, each its own grant.
-
01 / console
Console, approved in a browser
The terminal shows a sign-in link, and the person approves it in a browser, so the key can stay on another device.
-
02 / desktop
Login and lock screen
The security key’s PIN and a touch, at the graphical login and at the lock screen, with no browser involved. If access is revoked while the screen is locked, it stays locked. Login and the lock screen are tested with LightDM and Xfce on Fedora 44; login with GDM on Fedora Silverblue was confirmed by hand.
-
03 / offline
Offline, for a set time
Login without a network for a set time, under a signed lease that counts from the last successful refresh. A rejection from the server ends it. A machine without a network learns of a revocation when it reconnects, or when the lease runs out. Keeping the lease across a reboot, and sudo while offline, are each a separate opt-in.
-
04 / sudo
Sudo, by exact command
Each rule names the executable, its arguments and the target user. One touch can cover five minutes in the same terminal, and the permission is checked again on every command. A refused command never falls back to the local sudoers file, and
sudo -llists the rules.
Installers that keep a way back. The installers for Fedora 44 and Fedora Silverblue keep root and the local administrator’s normal login working. Uninstalling puts back the original PAM and sudoers files byte for byte, and every package is signed.
We run it ourselves
Our own sign-in at id.h2.io is Identity Core. It signs our team in to our web applications and to our Linux machines, from three servers, any two of which commit each change.
One file, or three members. By default Identity Core is one program and one database file on your server. For sign-in that keeps answering with a server stopped, it runs as three members on three of your machines.
Two of three agree. Any two members can commit a change. A member on its own cannot sign anyone in from an old copy, and no cookie, token or signed policy goes out until the majority has accepted the change.
The test. At launch on 7 October 2026 we stopped each of the three members in turn, behind our one public entry point, and the public sign-in and its discovery document kept answering. All ten launch checks passed.
Upgrades and backups. Compatible upgrades roll through one member at a time, from signed release manifests. In the one-file setup, backups are taken while the server runs and checked for integrity. They leave out sessions and pending invitations, always restore to a new place, and are not encrypted, so they need the same care as the database.
Built small, on purpose
One server program, built on well-known libraries, with each key kept to one job.
One server program
Written in Rust on Axum and Tokio, with SQLite compiled in and rustls for TLS. Passkeys go through webauthn-rs, and there is no home-made cryptography.
Plain pages
The sign-in and admin pages are plain HTML, CSS and JavaScript inside the program. There is no framework and no CDN, and no Node or Java at run time.
One key per job
Releases, TLS, machine policies, each machine and OpenID Connect signing each have their own key, with its own rotation and recovery procedure.
Strict at the edge
The pages at id.h2.io carry a strict content security policy, refuse framing and caching, and send no referrer. Cookies carry the __Host- prefix.
What is tested, and how
All of it is our own testing. The automated tests use virtual or software keys in browsers, containers and virtual machines. Physical security keys were used by hand on our team’s machines.
| What the report covers | Checks | Date | Keys |
|---|---|---|---|
| Sign-in and applications | |||
| Passkeys in the browser: enrol, sign in, replay, origin, restart, backup and restore | 44/44 | 5 Oct | virtual |
| OpenID Connect with a separate application | 92/92 | 12 Oct | virtual |
| Refresh, revocation, logout and the device flow | 127/127 | 12 Oct | virtual |
| Confidential clients and service tokens | 78/78 | 7 Oct | virtual |
| Company sign-in between two Identity Core issuers | 56/56 | 12 Oct | virtual |
| Company sign-in from Keycloak 26.7.2 | 26/26 | 5 Oct | virtual |
| Keys and accounts | |||
| Naming, adding and removing keys | 38/38 | 5 Oct | virtual |
| Recovery after every key is lost | 34/34 | 12 Oct | virtual |
| Rate limits and caps on pending sign-ins | 20/20 | 6 Oct | none |
| Linux | |||
| Console login in a virtual machine, approved in a browser | 31/31 | 5 Oct | software |
| Graphical login and lock screen, Fedora 44 with LightDM and Xfce | 29/29 | 5 Oct | software |
| Machine enrolment and signed policy, two machines | 73/73 | 5 Oct | software |
| Sudo by exact command, two machines | 38/38 | 5 Oct | virtual |
| Offline login | 37/37 | 5 Oct | software |
| Offline login across a reboot | 63/63 | 5 Oct | software |
| Sudo while offline | 28/28 | 5 Oct | software |
| Replacing a lost machine | 52/52 | 5 Oct | software |
| The Fedora 44 installer, from install to uninstall | 110/110 | 6 Oct | none |
| The Fedora Silverblue package, from install to uninstall | 101/101 | 6 Oct | none |
| Running it | |||
| Real HTTPS, and moving the service between machines | 54/54 | 5 Oct | software |
| Recovery from a compromised policy key | 48/48 | 5 Oct | software |
| Recovery of the OpenID Connect signing key | 46/46 | 7 Oct | software |
| Signed release bundles | 30/30 | 5 Oct | none |
| Three members, any two committing each change | 33/33 | 6 Oct | none |
| Launch checks at id.h2.io, each member stopped in turn | 10/10 | 7 Oct | none |
Keys: virtual is a browser’s built-in test authenticator, software a security key emulated in software, and none a test that needs no key.
Confirmed by hand, with physical keys
- A Nitrokey 3, in a containerOn 5 October 2026: offline login with a Nitrokey 3 in a container. Its PIN retry counter read 8 before and after.
- Offline across a rebootOn 6 October 2026: graphical login with a security key, offline, before and after a reboot. The key’s PIN retry counter read 8 before and after.
- A key at id.h2.ioOn 7 October 2026: one security key enrolled by hand and used to sign in to the live service.
- Login and sudoOn 7 October 2026: graphical login and sudo on a team machine after it moved to id.h2.io.
- A second desktopOn 9 October 2026: login at a username greeter, and offline login, on another team machine with a different desktop.
Talk to us about your sign-in
Identity Core runs our own sign-in today: our team, our web applications and our Linux machines, at id.h2.io. Tell us what your people sign in to, and we go through it with you, part by part.
- KeysPasskeys and security keys. No passwords, accounts by invitation, spare keys and recovery.
- AppsOpenID Connect. Consent, PKCE, refresh tokens that rotate, and back-channel logout.
- LinuxFedora 44 and Silverblue. Login and lock screen by key, offline leases and exact sudo rules.
- ServersYours. One program and one database file, or three members, any two of which commit each change.