Skip to content

OIDC Endpoints

Parako.ID publishes its OpenID Connect configuration at the standard discovery endpoint:

GET https://your-parako.example.com/oidc/v1/.well-known/openid-configuration

This returns a JSON document with all supported endpoints, scopes, claims, grant types, and signing algorithms. OIDC client libraries use this endpoint for automatic configuration.

All OIDC endpoints are mounted under a configurable base path. The default is /oidc/v1.

Change it in the oidc.path configuration:

{
"oidc": {
"path": "/oidc/v1",
},
}

All endpoint paths below are relative to this base path.

GET /authorize
POST /authorize

Initiates the authentication flow. The client redirects the user here with the required parameters (client_id, redirect_uri, response_type, scope). Parako.ID presents the login UI, then redirects back to the client with an authorization code.

Supports response modes: query, fragment, form_post.

POST /token

Exchanges an authorization code, refresh token, client credentials, or device code for tokens. Confidential clients must authenticate using their configured token_endpoint_auth_method (default: client_secret_basic).

GET /userinfo
POST /userinfo

Returns claims about the authenticated user. Requires a valid access token in the Authorization: Bearer header. CORS-enabled for browser-based clients.

GET /jwks

Returns the JSON Web Key Set containing the public keys used to sign tokens. Clients use these keys to verify token signatures. Keys are rotated according to the security.key_store.rotation_interval_days setting.

POST /token/introspection

Allows resource servers to validate access tokens and retrieve their metadata. Requires client authentication. Returns active: true/false and token metadata (scope, client_id, exp, etc.).

Enabled by default. Disable with features.oidc.token_introspection.enabled: false.

POST /token/revocation

Revokes an access token or refresh token. Requires client authentication. Returns 200 OK regardless of whether the token was valid (per RFC 7009).

Enabled by default. Disable with features.oidc.token_revocation.enabled: false.

GET /session/end
POST /session/end

RP-Initiated Logout (OpenID Connect RP-Initiated Logout 1.0). Ends the user’s session and optionally redirects to a post_logout_redirect_uri registered with the client.

Backchannel logout is also supported — Parako.ID sends logout tokens to registered backchannel_logout_uri endpoints.

POST /device/auth

Initiates the device flow (RFC 8628). Returns a device_code, user_code, and verification_uri. The user visits the verification URI on a separate device and enters the user code.

GET /device
POST /device

Device flow verification page where users enter their user code.

Enabled by default. Disable with features.oidc.device_flow.enabled: false.

POST /backchannel

Client-Initiated Backchannel Authentication (CIBA). Allows clients to initiate authentication of a user without direct browser interaction — the authentication request is sent server-to-server, and the user is authenticated out-of-band (e.g., via push notification).

The token endpoint is then polled with the urn:openid:params:grant-type:ciba grant type to retrieve the resulting tokens.

POST /register-rp

RFC 7591 Dynamic Client Registration. Allows clients to register programmatically. Requires an initial access token when require_initial_access_token is true (default).

Disabled by default. Enable with:

{
"features": {
"oidc": {
"dynamic_client_registration": {
"enabled": true,
},
},
},
}
POST /request

Allows clients to push authorization request parameters to the server before redirecting the user. Returns a request_uri that the client includes in the authorization request. Improves security by keeping sensitive parameters server-side.

JWT encryption for ID tokens, UserInfo, and introspection responses. When enabled, the server supports accepting and issuing encrypted tokens.

Enable with features.oidc.encryption.enabled: true.

Authorization responses can be returned as signed (and optionally encrypted) JWTs instead of plain query/fragment parameters.

Enable with features.oidc.jwt_response_modes.enabled: true.

The UserInfo endpoint can return a signed JWT instead of a plain JSON object.

Enable with features.oidc.jwt_userinfo.enabled: true.

Clients can pass authorization request parameters as signed JWTs (request parameter) or by reference (request_uri parameter).

Enable with features.oidc.request_objects.enabled: true.

Server-to-server logout notifications. When a user logs out, Parako.ID sends a logout_token JWT to each registered client’s backchannel_logout_uri.

Enable with features.oidc.backchannel_logout.enabled: true.

The introspection endpoint returns a signed JWT instead of a plain JSON object, per the JWT Response for OAuth 2.0 Token Introspection draft specification.

Enable with features.oidc.jwt_introspection.enabled: true.

Allows dynamically registered clients to update or delete their registration using the registration access token. Supports automatic rotation of registration access tokens.

Enable with:

{
"features": {
"oidc": {
"client_registration_management": {
"enabled": true,
"rotate_registration_access_token": true,
},
},
},
}

Resource indicators let clients scope access tokens to specific APIs or resource servers.

Enable with features.oidc.resource_indicators.enabled: true.

Parako.ID registers a built-in resource server for its Management API:

  • URI: urn:parako:api:v1
  • Scopes: All parako:* management scopes
  • Token format: JWT

M2M clients request Management API tokens by passing resource=urn:parako:api:v1 in the token request.

Clients must declare which resource servers they can access:

FieldTypeDescription
allowedResourcesstring[]Resource server URIs this client can request tokens for
resourcesScopesstringSpace-separated scopes the client can request for resource access

Example client configuration:

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

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

ScopeDescription
openidRequired for OIDC flows. Returns the sub claim
profileName, family name, given name, picture, locale, username
emailEmail address and verification status
phonePhone number and verification status
addressPostal address
offline_accessRequest a refresh token

Claims returned per scope:

ScopeClaims
openidsub
profilename, family_name, given_name, picture, locale, username
emailemail, email_verified
phonephone_number, phone_number_verified
addressaddress

Claims are returned in the ID token and/or the UserInfo endpoint response, depending on the response_type and client configuration.

Parako.ID supports two subject identifier types:

TypeDescription
publicSame sub value for all clients (default)
pairwiseDifferent sub value per client, preventing cross-client user tracking

Configure per client or globally:

{
"features": {
"oidc": {
"subject_types": ["public", "pairwise"],
},
},
}

Pairwise subjects require a salt configured in oidc.secrets.pairwise_salt (default: parako-id-salt). In production, set the PAIRWISE_SALT environment variable to override the default with a strong random value.

TokenDefaultDescription
Access token3,600s (1h)Bearer token for API access
ID token3,600s (1h)Identity assertion
Refresh token86,400s (24h)Used to obtain new access tokens
Authorization code600s (10m)One-time use, exchanged for tokens
Device code600s (10m)Device flow user code lifetime
Client credentials3,600s (1h)Machine-to-machine token
Grant3,600s (1h)User authorization grant
Session86,400s (24h)Browser session lifetime
Interaction600s (10m)Multi-step authentication flow timeout
Backchannel auth600s (10m)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 are rotated on each use by default (features.oidc.rotate_refresh_token: true). A clock tolerance of 15 seconds is applied for token validation (features.oidc.clock_tolerance: 15).