Built-in OpenID Connect identity provider. The handler is fully spec-compliant for Authorization Code + PKCE, exposes discovery + JWKS at the conventional /.well-known paths, and signs id_token / access_token with RS256.
The userinfo endpoint is part of the OIDC spec but requires a Bearer token issued by this IdP, so it’s excluded here. Everything else below is callable without an existing CodeB session.
Two URL shapes, one handler. Every endpoint below is reachable in either form — the conventional /oauth2/v1/<name> path (used by most commercial OIDC providers and what discovery advertises), or the legacy /oidc.ashx?action=<name> form. RP libraries that follow discovery automatically use the /oauth2/v1/* shape and need no special configuration.
Form POST that authenticates the visitor using the same HA1 (MD5(user:realm:password)) as the SIP credentials store. Computes HA1 client-side so plaintext passwords never reach the IdP. When the return URL points back to ?action=authorize, the code is minted directly — no cookie is set.
Request
Body fields: user, ha1 (32 hex), return (optional URL).
Response
Either a 302 redirect with ?code=… appended to return, or JSON { ok: true, code: "…" }.
Errors
400 / 401 { error: "invalid_credentials" }. 429 if IP exceeded 10 attempts in the last 60 s.
HA1 comparison is constant-time. The login is stateless: no session cookie is set on the IdP origin.
RFC 6749 token endpoint. Exchanges either an authorization code (with PKCE verifier) or a refresh token for a fresh id_token, access_token and rotated refresh_token.
Request
Form / JSON body: grant_type (authorization_code or refresh_token), code, redirect_uri, code_verifier, client_id, client_secret (confidential clients only), refresh_token.
OpenID Connect RP-Initiated Logout 1.0. Clears the IdP-side SSO assertion and bounces the browser back to post_logout_redirect_uri if it’s registered for the client.
RFC 7662 token introspection. Submit any token issued by this IdP — access_token, id_token, or refresh_token — and find out whether it’s still active, who it belongs to, and when it expires.
Request
Form / JSON body: token (required), token_type_hint (optional — access_token, id_token or refresh_token), client_id (required only when introspecting a token that was issued to a confidential client), client_secret (then required).
For an inactive / unknown / expired token — per RFC 7662 §2.2 the only field returned is active:
{ "active": false }
Errors
400 if token is missing. 401 if the named confidential client’s secret fails to verify. Never a 4xx for “token unknown” — that returns 200 {active: false} by spec.
Useful for resource servers that want to defer token-validation logic to the IdP instead of verifying JWT signatures themselves. Note: for high-traffic resource servers, local JWT verification using the JWKS is usually faster.
Need an admin endpoint? Admin-only and OIDC Bearer-gated routes
are documented inside the admin UI itself (visible only to signed-in admins
on this host). The public API set on this page is the surface you can
integrate against without provisioning a CodeB user.