loading
Preparing LoginRadius developer resources
Mission: Help enterprises accelerate digital transformation with our fully-managed Customer IAM technology.
Skip to main content

Pushed Authorization Request (PAR)

Pushed Authorization Request (PAR) is defined in RFC 9126. It allows a client to push its authorization parameters directly to the authorization server — before redirecting the user — receiving back a short-lived request_uri reference. This eliminates sensitive parameters from the browser URL and enables richer payloads such as authorization_details (RFC 9396) to be transmitted securely over a back-channel.


Key Concepts

ConceptDescription
request_uriOpaque reference (urn:ietf:params:oauth:request_uri:<token>) returned by the PAR endpoint. Valid for 90 seconds by default.
authorization_detailsStructured JSON object (RFC 9396) describing the authorization context — e.g. payment amount, payee, currency. Passed by the client at PAR time and propagated through the entire flow into the final JWT.
linking_idServer-generated UUID created during PAR for SCA flows. Correlates the browser session with the mobile MFA device. See Step-Up Authentication for details.

Enable PAR in the Admin Console

In the Admin Console, navigate to Applications → select your OIDC app → Tokens tab → Authorization Requests section.

  • Toggle Pushed Authorization Request (PAR) ON.
  • Optionally enable Require PAR to force all authorization requests through the PAR endpoint.
warning

Only enable Require PAR on a dedicated app. Any /authorize call without a request_uri will be rejected. Create a separate app for PAR flows and leave standard login apps unchanged.

To attach authorization_details to PAR requests, also enable Rich Authorization Request (RAR):

  • Toggle Rich Authorization Request (RAR) ON.
  • Under Allowed RAR Types, click + Add Type and enter your type string (e.g. lr_payment). This value must match the type field in authorization_details. Matching is case-insensitive.

Step 1 — Push Authorization Request

The client makes a back-channel POST to the PAR endpoint with all authorization parameters.

Endpoint

POST https://{SiteURL}/api/oidc/{OIDCAppName}/par

Request

POST /api/oidc/MyApp/par
Content-Type: application/x-www-form-urlencoded

client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&response_type=code
&scope=openid profile
&redirect_uri=https://your-app.com/callback
&authorization_details=[{"type":"lr_payment","amount":"500","currency":"EUR","payee":"Stripe"}]

Response

{
"request_uri": "urn:ietf:params:oauth:request_uri:abc123xyz",
"expires_in": 90
}

PAR Request Parameters

ParameterRequiredDescription
client_id✅ RequiredYour OIDC application client ID
client_secret✅ RequiredYour OIDC application client secret
response_type✅ RequiredMust be code
scope✅ RequiredSpace-delimited scopes. Must include openid.
redirect_uri✅ RequiredCallback URL. Must be whitelisted in Admin Console.
authorization_detailsOptionalJSON array (RFC 9396) describing the authorization context. Propagated into the final JWT authorization_details claim.
nonceOptionalReplay attack prevention for id_token.
code_challengeOptionalPKCE code challenge.
code_challenge_methodOptionalPKCE method. Must be S256.
workflowOptionalName of the IO Workflow to invoke (required for SCA flows).

Step 2 — Authorization Request with request_uri

The client redirects the user's browser to /authorize using the request_uri reference. No sensitive parameters appear in the URL.

Endpoint

GET https://{SiteURL}/service/oidc/{OIDCAppName}/authorize

Example Request

GET https://your-app.hub.loginradius.com/service/oidc/MyApp/authorize
?request_uri=urn:ietf:params:oauth:request_uri:abc123xyz
&client_id=YOUR_CLIENT_ID

What happens:

  1. LoginRadius resolves the request_uri and retrieves your authorization parameters from its cache.
  2. All parameters you submitted — including authorization_details and linking_id if present — are restored.
  3. LoginRadius bundles these into a short-lived, signed session token and redirects the user to begin the authorization flow.

Step 3 — Token Exchange

After the workflow completes and the client receives an authorization_code, it exchanges it for tokens. Any authorization_details from the PAR request are included as a claim in the returned JWT.

Endpoint

POST https://{SiteURL}/api/oidc/{OIDCAppName}/token

Success Response

{
"access_token": "<JWT>",
"token_type": "Bearer",
"expires_in": 3600,
"id_token": "<JWT with authorization_details claim>",
"refresh_token": "<refresh-token>"
}

Decoded id_token payload (example)

{
"sub": "user-uid",
"iss": "https://your-app.hub.loginradius.com/",
"aud": "YOUR_CLIENT_ID",
"iat": 1714000000,
"exp": 1714003600,
"authorization_details": {
"type": "lr_payment",
"amount": "500",
"currency": "EUR",
"payee": "Stripe"
},
"linking_id": "<linking_id>"
}

Differences from Standard Authorization Code Flow

AspectStandard Auth Code FlowPAR Flow
Authorization params locationBrowser URL (query string)Back-channel POST to /par
authorization_details supportNot availableAvailable via RFC 9396
Sensitive params exposureVisible in browser history / server logsNever reach the browser
request_uriNot usedShort-lived opaque reference (90s)