OIDC reference
INITE is a standards-compliant OpenID Connect provider. Everything below is exposed through the discovery document — when in doubt, fetch that first.
Discovery
https://auth.inite.ai/.well-known/openid-configuration
Returns the full advertised surface — endpoints, supported grants, scopes, claims, signing algorithms. Clients (oidc-client-ts, next-auth, passport, oauth4webapi, etc.) bootstrap from this URL automatically.
Key fields:
| Field | Value |
| -------------------------------------------------- | -------------------------------------------------------- |
| issuer | https://auth-api.inite.ai (env-overridable) |
| authorization_endpoint | /v1/oauth/authorize |
| token_endpoint | /v1/oauth/token |
| userinfo_endpoint | /v1/oauth/userinfo |
| jwks_uri | /.well-known/jwks.json |
| revocation_endpoint | /v1/oauth/revoke |
| introspection_endpoint | /v1/oauth/introspect |
| end_session_endpoint | /v1/oauth/logout |
| pushed_authorization_request_endpoint | /v1/oauth/par (RFC 9126) |
| device_authorization_endpoint | /v1/oauth/device_authorization (RFC 8628) |
| response_types_supported | ["code"] |
| grant_types_supported | authorization_code, refresh_token, client_credentials, device |
| id_token_signing_alg_values_supported | ["RS256"] |
| code_challenge_methods_supported | ["S256"] |
| dpop_signing_alg_values_supported | ES256, ES384, ES512, EdDSA (RFC 9449) |
| backchannel_logout_supported | true |
| require_pushed_authorization_requests | false globally; flippable per client |
JWKS
https://auth.inite.ai/.well-known/jwks.json
Public keys for verifying ID tokens and access tokens. Crypto-agile — keys identified by kid. Rotation publishes the new key here ahead of the cutover so RPs cache both.
Supported scopes
| Scope | Effect |
| ---------------- | --------------------------------------------------------------------- |
| openid | Required for OIDC. Issues an id_token. |
| profile | Adds name, picture to userinfo + id_token. |
| email | Adds email, email_verified. |
| offline_access | Issues a refresh_token. Without this, sessions are one-shot. |
OAuth clients restrict the requestable subset via their allowedScopes.
Supported claims
sub — user's DID (did:key:…)
email — verified email
email_verified — boolean
name — display name
picture — avatar URL
roles — array (e.g. ["admin"])
nonce — round-tripped from /authorize for replay defence
amr — authentication methods used (e.g. ["pwd","mfa"])
acr — authentication context class (URN string)
AMR values
| Value | Meaning |
| ------------- | -------------------------------------- |
| pwd | Password authentication |
| mfa | A second factor was satisfied |
| webauthn | Passkey / WebAuthn |
| magic_link | Email magic link |
| wallet | Web3 wallet signature |
ACR levels
INITE doesn't impose a fixed ACR vocabulary — clients pass any URN they need (e.g. urn:inite:acr:strong) via acr_values= on /authorize and the IdP rounds-trips it into the id_token if the auth path satisfied it.
DPoP (RFC 9449)
Sender-constrained tokens. The caller proves possession of a private key with each request; the token only validates when accompanied by a matching DPoP proof JWT.
DPoP: <signed JWT proving key ownership>
Authorization: DPoP <access_token>
INITE verifies the proof's jti (replay window), htu (target URL), htm (method), and iat skew. Supported algorithms: ES256, ES384, ES512, EdDSA. Tokens with cnf.jkt claim are DPoP-bound — Bearer-only callers cannot replay them.
Back-channel logout
Register backchannel_logout_uri on your OAuth client. On user logout, INITE POSTs:
POST https://your-app/back-channel-logout
Content-Type: application/x-www-form-urlencoded
logout_token=<signed JWT>
The logout_token JWT contains:
sub— user DIDsid— session id (if available)events—{ "http://schemas.openid.net/event/backchannel-logout": {} }iat,iss,aud
Verify with JWKS, then invalidate the matching session in your app. Fan-out is best-effort with a bounded per-RP timeout — INITE doesn't block the user's redirect on slow RPs.
Token introspection (RFC 7662)
curl -X POST https://auth.inite.ai/v1/oauth/introspect \
-u 'your-client:secret' \
-d 'token=<access_token>'
Returns { active, sub, scope, exp, iat, iss, client_id, token_type }. Useful for opaque-token clients (rare for INITE — we issue JWTs and you can verify locally).
Revocation (RFC 7009)
curl -X POST https://auth.inite.ai/v1/oauth/revoke \
-u 'your-client:secret' \
-d 'token=<refresh_or_access_token>'
Revokes a single token. Refresh-token revocation also kills the entire family it descended from.
Identifiers — DID
Every user has a did:key:… identifier in the sub claim. Portable, self-issued, cryptographically verifiable without contacting INITE. If you want INITE-internal user ids (UUID), use the /v1/auth/identity/me endpoint.