Repository navigation
feat(system-config): advertise the OpenID Provider on the public config - #573
Merged
Merged
Conversation
Covers each case where oidcProvider must be absent, refusing an ineligible oidc_cli_client_id, the advertisement disappearing when the application is disabled, deleted or has its exchange turned off, and clearing the key with null. Fails until the route and key exist.
Adds the oidc_cli_client_id key, refused unless it names an active application eligible for session exchange, and an optional oidcProvider on GET /system-config/public, sent whole or not at all (ADR 0003). The application is read on every request, so disabling it ends the advertisement at once. PATCH /system-config/admin answered 500 for any nullable key set to null, because system_config.value is NOT NULL. It now removes the row, which reads back as the schema's null.
The CLI learns the issuer and client from /system-config/public, and a loopback passkey step-up sends max_age=0, both confirmed by Brandon on 2026-11-05. Updates the API contract and configuration docs.
Bccorb
marked this pull request as ready for review
November 6, 2026 03:41
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Advertises the OpenID Provider on the public config, so
seamless profile logincan find it (ADR 0003, fells-code/seamless-cli#316). Today nothing public offers the issuer or a client id, and the API's/.well-known/openid-configurationanswers 404.Refs #544
Draft until the
@seamless-auth/typesrelease fromfeat/public-oidc-provideris out. Then bump to it, update the lock, and runnpm run generate:api. Until then CI fails at typecheck; local checks used a packed tarball.What it does
oidc_cli_client_id, through the normal admin routes with their step-up and audit. An unknown or ineligible application is refused.GET /system-config/publicgains optionaloidcProvider: { issuer, cliClientId }, present only when the provider is on, the issuer is set, and that application exists, is active, and is exchange enabled and eligible. Otherwise absent, never partial. Disabling the application makes it disappear at once, because the row is read on every request.no-store.Also in this PR
PATCH /system-config/adminanswered 500 for any nullable key set tonull, becausesystem_config.valueis NOT NULL. The route now removes the row, which reads back asnull. This also fixesoidc_issuer,hosted_uiandmax_concurrent_sessions.OIDC_CLI_CLIENT_ID, because a test requires every config key to be mapped. A value seeded from env skips the PATCH eligibility check, but the public route checks eligibility on every read. If an admin clears the key while the variable is set, it returns at the next start (documented).acr_values=phrwithmax_age=0, becausemax_age=300usually records no step-up; and with no browser session the user runs the command a second time, a stated cost. Treating a fresh passkey sign-in as a step-up was not adopted, because it changes what a step-up means.Known limits
no-storeis likely not forwarded (read from their source, not run). The CLI calls the API directly.sessionExchangeEnableddefault from the unreleased types, and the generated example prints"issuer": null, a generator placeholder.Checks
f73d4a8adds the tests alone and fails (11 of 28 on real Postgres). Lint, typecheck, format,check:changeset-bumpandgenerate:apipass. Unit coverage 2924 passed, 99.07% lines; unit plus Postgres 3172 passed on two consecutive runs. One unrelated test (identityFlowLimits.spec.ts) failed once and passed on every rerun.f73d4a8used--no-verify, because the hook runs coverage.