OpenID provider interoperability¶
Local assessment on 31 October 2026, using altero at d06783c:
the OpenID Foundation suite's Config OP passed. Basic OP did not pass.
This is a development assessment, not OpenID certification or an exhaustive
claim of protocol support. The mandatory S256 PKCE policy was retained.
Independent client in CI¶
tests/test_authlib.py runs 24 live HTTP cases using stock Authlib 1.9.1 and
its native httpx2 integration. Public clients, HTTP Basic secrets and form
secrets each exercise code + PKCE, ID-token signature/claim validation,
userinfo, refresh rotation/replay, revocation, device consent and RP logout.
It also checks bearer/cookie separation and refuses bad proof and code reuse.
No external IdP is needed and no opt-in variable skips these tests.
The harness uses an isolated SQLite database and loopback port 18765. It approves consent through the browser's cookie/CSRF HTTP endpoints and hands the callback URL to Authlib. It does not provide a separate RP listener or prove consent-page rendering. See the fixture details. Combined Authlib and existing OAuth regressions passed 181 cases locally. Changing the nonce or access-token hash in actual server-issued ID tokens made Authlib reject them; the intact 24 cases passed again after restoring source.
The hosted test job at fcf8460
passed on 31 October 2026 (UTC): 3,556 tests, no skipped tests, including these
24 Authlib cases. The same job ran the real Keycloak and SimpleSAMLphp cases.
This is CI evidence for the supported flows, separate from the Foundation
profile results below.
Foundation suite environment¶
The official conformance suite
reported version 5.3.4, tag release-v5.3.4, revision e8d5167.
The reviewed source checkout was
e8d5167c84f1913a137c260f7ee991f03908ce8f.
The downloaded images were pinned by digest:
registry.gitlab.com/openid/conformance-suite@sha256:74fe707b772ca48f0be0762027eabf89de463367770e3f9318c6b7c1cbbbbcef
mongo@sha256:b9924c330a8bbc5800fe9c69f04a84e221eca7b28fd049a0354147d9908fa142
MongoDB belongs to the suite and stores its plans and results. altero used SQLite; it gained no MongoDB dependency. Both containers were disposable and bound only to loopback, with MongoDB on 27174 and the suite on HTTPS 18084. The suite ran its development profile with its dummy local administrator. This configuration is for isolated testing, never a public deployment.
altero served HTTPS on 18766 with public_url=https://127.0.0.1:18766 and a
fresh test account. A short-lived local certificate covered 127.0.0.1 and
localhost; the suite's Java trust store and the httpx2 driver trusted it.
Chromium accepted this local certificate when executing the suite's callback
JavaScript and capturing its requested error-page screenshots. No production
accounts, identity providers or library databases were used.
Profile results¶
| Profile | Passed | Failed | Warning | Review | Skipped |
|---|---|---|---|---|---|
| Config OP (1 module) | 1 | 0 | 0 | 0 | 0 |
| Basic OP (35 modules) | 2 | 27 | 1 | 2 | 3 |
The retained local plans are kdzACvYOP0Vjk (Config) and qi0Q55XJAGHiD
(Basic), with per-module logs and complete JSON exports.
All modules were invoked. These are the suite's results, including its skips
and review requirements; they are not converted into passes. It commonly
records an asserted protocol failure with status INTERRUPTED and result
FAILED.
The 27 failed Basic modules reached authorization without a PKCE challenge.
altero returned invalid_request with code_challenge is required. That
prevents the later checks named by those modules from running: this assessment
does not establish their userinfo, refresh, prompt, locale or code-reuse
behavior. The explicit valid-PKCE module completed the code flow successfully,
including the suite's token and identity checks. The independent Authlib cases
separately exercise supported flows with PKCE.
The missing-response-type module reported PASSED on that same missing-PKCE
error. This does not prove a correct missing-response-type check: altero
currently defaults an omitted response type to code. The authorization POST
module received 405 and reported WARNING after its 30-second callback wait.
The address, phone and all-scopes modules were skipped by the suite because
the required scopes were not advertised. Two unregistered-redirect cases
displayed the expected local error; actual Chromium screenshots were uploaded
and inspected, and their suite result remains REVIEW.
For Basic OP, every module name below has the prefix oidcc-:
| Module | Result |
|---|---|
server |
FAILED |
response-type-missing |
PASSED (limited as explained above) |
userinfo-get |
FAILED |
userinfo-post-header |
FAILED |
userinfo-post-body |
FAILED |
ensure-request-without-nonce-succeeds-for-code-flow |
FAILED |
scope-profile |
FAILED |
scope-email |
FAILED |
scope-address |
SKIPPED |
scope-phone |
SKIPPED |
scope-all |
SKIPPED |
alternate-happy-flow |
FAILED |
display-page |
FAILED |
display-popup |
FAILED |
prompt-login |
FAILED |
prompt-none-not-logged-in |
FAILED |
prompt-none-logged-in |
FAILED |
max-age-1 |
FAILED |
max-age-10000 |
FAILED |
ensure-request-with-unknown-parameter-succeeds |
FAILED |
id-token-hint |
FAILED |
login-hint |
FAILED |
ui-locales |
FAILED |
claims-locales |
FAILED |
ensure-request-with-acr-values-succeeds |
FAILED |
codereuse |
FAILED |
codereuse-30seconds |
FAILED |
ensure-registered-redirect-uri |
REVIEW |
ensure-post-request-succeeds |
WARNING |
server-client-secret-post |
FAILED |
unsigned-request-object-supported-correctly-or-rejected-as-unsupported |
FAILED |
claims-essential |
FAILED |
ensure-request-object-with-redirect-uri |
REVIEW |
refresh-token |
FAILED |
ensure-request-with-valid-pkce-succeeds |
PASSED |
Config OP's oidcc-discovery-endpoint-verification passed without warnings.
It checked discovery, required metadata, JWKS and HTTPS endpoint URLs; it does
not execute a sign-in or certify the TLS configuration of a public deployment.
Repeating the assessment¶
Use the official suite's
local Docker instructions
with the pinned image above and an isolated database. Configure HTTPS for the
suite and altero, trust the test CA in Java, and set altero's public URL to its
actual issuer. Register two confidential clients through altero oauth add,
both with scopes openid profile email and the suite's exact callback:
https://127.0.0.1:18084/test/a/altero/callback for alias altero in this run.
In the suite configuration, set server.discoveryUrl to altero's discovery
URL. Supply client and client2 objects with their respective client_id,
client_secret and scope. Also supply client_secret_post with the first
client's values: the Basic plan uses that separate object for its form-secret
module. An absent object is a setup failure, not protocol evidence.
Run oidcc-config-certification-test-plan with its fixed defaults. Run
oidcc-basic-certification-test-plan with server_metadata=discovery and
client_registration=static_client; the plan fixes response type, mode and
authentication method per module. Follow its actual authorization URLs,
authenticate the disposable account, approve consent where offered, and run
the suite's callback JavaScript. Upload the requested real error screenshots.
Do not insert PKCE into the suite's requests or relax altero's PKCE requirement
to turn this profile green.
Retain raw plans, per-module logs and screenshots privately: suite exports
contain client secrets, session cookies and tokens. Publish only sanitized
results. The local assessment retained these under /tmp/altero-p74-oidf;
the containers and live server were stopped afterwards. The hosted Authlib
result is linked above; the Foundation assessment itself remains a local run.