Skip to content

OIDC Endpoints

All OIDC endpoints are mounted under a configurable base path (oidc.path, default /oidc/v1). Discovery is published at <base>/.well-known/openid-configuration and returns the full machine-readable configuration: endpoints, scopes, claims, grants, signing algorithms.

Terminal window
curl https://your-host/oidc/v1/.well-known/openid-configuration

OIDC client libraries use the discovery endpoint for automatic configuration.

All paths are relative to the OIDC base path.

MethodPathAuthUse case
GET / POST/authorizesession (interactive)Initiate authentication. Response modes: query, fragment, form_post.
POST/tokenper token_endpoint_auth_methodExchange code / refresh token / client credentials / device code for tokens.
GET / POST/userinfoBearer access tokenReturns claims about the authenticated user (CORS-enabled).
GET/jwkspublicJSON Web Key Set used to verify token signatures.
POST/token/introspectionclient authRFC 7662 — validate access / refresh tokens.
POST/token/revocationclient authRFC 7009 — revoke access / refresh tokens.
GET / POST/session/endsessionRP-Initiated Logout. Supports post_logout_redirect_uri.
POST/device/authclient authRFC 8628 device authorization. Returns device_code, user_code, verification_uri.
GET / POST/devicesessionDevice-flow verification UI.
POST/backchannelclient authCIBA — server-to-server-initiated authentication.
POST/register-rpinitial access tokenRFC 7591 Dynamic Client Registration.
POST/requestclient authRFC 9126 Pushed Authorization Request.

Backchannel logout sends a logout_token JWT to each registered client’s backchannel_logout_uri. Enable per feature toggle below.

Each feature is off-by-default unless noted. Toggle in features.oidc.<feature>.enabled.

FeatureDefaultConfig keySpec / notes
Token introspectionenabledtoken_introspection.enabledRFC 7662
Token revocationenabledtoken_revocation.enabledRFC 7009
Device flowenableddevice_flow.enabledRFC 8628
Dynamic Client Registration (DCR)disableddynamic_client_registration.enabledRFC 7591; initial-access-token always required
DCR Managementdisabledclient_registration_management.enabledRFC 7592; supports rotate_registration_access_token
Pushed Authorization Request (PAR)disabled(always available at /request)RFC 9126
JWT encryptiondisabledencryption.enabledJWE for ID tokens / UserInfo / introspection
JWT response modes (JARM)disabledjwt_response_modes.enabledSigned (optionally encrypted) authorization responses
JWT UserInfodisabledjwt_userinfo.enabledSigned JWT instead of plain JSON
JWT introspectiondisabledjwt_introspection.enabledPer draft “JWT Response for OAuth Token Introspection”
Request objectsdisabledrequest_objects.enabledrequest / request_uri parameters
Backchannel logoutdisabledbackchannel_logout.enabledServer-to-server logout via logout_token
Resource indicators (RFC 8707)disabledresource_indicators.enabledAudience-restricted tokens
Refresh token rotationenabledrotate_refresh_tokenRotates on each use
Clock tolerance15sclock_toleranceValidation skew tolerance

Enable with features.oidc.resource_indicators.enabled: true. Clients then declare allowedResources (the URIs they can request) and resourcesScopes (the scopes for resource-server access).

{
"client_id": "my-api-consumer",
"allowedResources": ["urn:parako:api:v1"],
"resourcesScopes": "parako:users:read parako:clients:read",
"grant_types": ["client_credentials"],
}

Parako.ID registers urn:parako:api:v1 as a built-in resource. M2M clients request Management API tokens by passing resource=urn:parako:api:v1. Tokens are JWTs with that audience. Full scope list: Management API → Authorization Scopes.

Clients with the client_credentials grant (and not authorization_code) are automatically discovered as resource servers. Their audience (or urn:resource:{client_id}) becomes the resource identifier; their scope defines available scopes.

ScopeReturned claims
openidsub
profilename, family_name, given_name, picture, locale, username
emailemail, email_verified
phonephone_number, phone_number_verified
addressaddress
offline_access(Issues a refresh token)

Claims appear in the ID token, the UserInfo response, or both, depending on response_type and client configuration.

TypeEffect
publicSame sub value across all clients (default).
pairwiseDifferent sub per client; prevents cross-client tracking.

Configure with features.oidc.subject_types. Pairwise subjects use oidc.secrets.pairwise_salt; in production, set PAIRWISE_SALT to a strong random value.

This is the canonical Token-TTL table. Other docs link here.

TokenDefaultDescription
Access token3,600 s (1 h)Bearer token for API access
ID token3,600 s (1 h)Identity assertion
Refresh token86,400 s (24 h)Used to obtain new access tokens; rotated on each use
Authorization code600 s (10 m)One-time use; exchanged for tokens
Device code600 s (10 m)User-code lifetime
Client credentials3,600 s (1 h)M2M token
Grant3,600 s (1 h)User authorization grant
Session86,400 s (24 h)Browser session
Interaction600 s (10 m)Multi-step authentication flow timeout
Backchannel auth600 s (10 m)CIBA flow request timeout

Configure in oidc.token_ttl:

{
"oidc": {
"token_ttl": {
"access_token": 3600,
"refresh_token": 86400,
"id_token": 3600,
"authorization_code": 600,
"device_code": 600,
"client_credentials": 3600,
"grant": 3600,
"session": 86400,
"interaction": 600,
"backchannel_auth": 600,
},
},
}

Refresh tokens rotate on each use by default (features.oidc.rotate_refresh_token: true). The clock tolerance for token validation is 15 seconds (features.oidc.clock_tolerance: 15).