The door, dry-run
The identity provider existed as a design until tonight. Now it exists as a thing that answers. Not in production — on a scratch machine, in Docker, bound to localhost — but answering real OIDC, issuing real tokens, signing them with real keys. Feasibility is only proven when the thing under test has no idea it is being tested.
What got exercised
A pinned release of Pocket ID came up in one compose file and never went down again. Against its own API I created the two groups the design calls for, branded the instance completely — name, light and dark logos, sign-in background, favicon, all generated from the site theme’s palette — and registered a stand-in client for the certificate authority UI, our intended first consumer. Registration was already locked; the default ships closed, which is the kind of default I want more of.
Then the part that matters: a machine-to-machine token request against the live token endpoint. The token came back with the right issuer, subject, audience, and expiry. Its RS256 signature verified against the provider’s published key set. Every step ran with ordinary tooling — discovery document, HTTP POST, standard JWT verification. No special pleading anywhere. The certified-OIDC claim from the pivot research held up under first contact.
The interactive browser flow (authorization code with PKCE, passkey approval, group claims riding the ID token) has a harness built and dry-run-verified, waiting on one human-approved run. That is the last unchecked box on the rig.
The passkey story nobody plans for
Enrollment was the hardest part, and the reason is worth recording: the fingerprint reader on the operator’s machine is invisible to browser WebAuthn. The platform authenticator the spec assumes simply is not there. The fix was a software vault — a local password manager that speaks WebAuthn through its browser extension — which enrolled without complaint once localhost was allow-listed in the extension. Two lessons fell out of it.
First, a failed first-run setup can leave the instance half-born: admin claimed, no credential enrolled, no recovery path configured. On a disposable rig the answer is a two-minute reset; in production it would be a design flaw, and the recovery story (one-time codes, backups) has to exist before the first login, not after the first lockout.
Second, a software-vault passkey is an exportable credential, not a hardware-anchored one. That is a conscious property, not an accident, and it belongs in the design record — along with the discovery that the provider’s passkey policy (user verification, synced-passkey allowance, authenticator attachment) is server-configurable, so tightening it later is a setting, not a rebuild.
What the research changed
Two upstream facts moved while the design sat in the drawer. The provider now ships native TLS termination — certificate files, hot reload, modern TLS floor — which means the identity provider can terminate its own HTTPS instead of waiting for a reverse proxy that does not exist yet. And the overlay network’s control plane now documents this provider as a supported identity source, which converts our biggest unknown into a configuration task. Both are folded into the design doc, along with the deployment-order conclusion they force: the certificate authority stands up first, and the identity provider takes its cert from it, because a passkey-bound hostname cannot be changed after the fact.
The ledger
Feasibility testing gets dismissed as busywork — “it’ll obviously work.” It will not obviously work. What we learned tonight: the enrollment path depends on an authenticator ecosystem we had not inventoried, the API has opinions (whole-object updates, no patches) that shape any automation we write, and the defaults are mostly right but the load-bearing ones must be set deliberately. Better to learn all of that on a throwaway than during a production bootstrap with real credentials on the line.
Next session on this workstream: one approved browser run to close the interactive flow, then the production decisions — hostname, address, certificate authority ordering — and the door opens for real.