Why PAR and JAR?
In the standard authorization code flow, all authorization parameters are sent as query parameters in the browser redirect URL. This has two problems:- Integrity: a network adversary or a compromised browser can tamper with the parameters before the request reaches the authorization server.
- Confidentiality: sensitive parameters (scope, claims, resource) are visible in browser history, server access logs, and referrer headers.
Standard flow (before PAR/JAR)
scope and resource, travel through
the browser address bar.
Flow with PAR
request_uri handle.
All sensitive parameters stay server-to-server.
Flow with JAR (on top of PAR)
The/oauth/par body includes a request JWT parameter instead of (or in
addition to) plain parameters:
request JWT is signed with the client’s private key. The AS verifies the
signature against the client’s registered public key (jwks_uri or inline
jwks). A tampered request JWT fails signature verification and is rejected
with invalid_request_object.
Advantage: even if the back-channel POST is intercepted or replayed, the
parameters cannot be altered without detection.
FAPI 2.0 baseline
FAPI 2.0 (Financial-grade API Security Profile 2.0) requires:- PAR (RFC 9126): mandatory.
- JAR (RFC 9101): mandatory.
- PKCE S256: mandatory (already mandatory in theauth-go by default).
- JWT-Bearer client authentication (RFC 7523): mandatory (added in v2.4, see JWT-Bearer).
Enabling PAR
pushed_authorization_request_endpoint: https://auth.example.com/oauth/par.
Enabling JAR
request_object_signing_alg_values_supported: ["ES256", "PS256"].
PAR endpoint reference
POST /oauth/par
Response (200 OK):
See also
- JWT-Bearer client auth and grants
- Authorization Server concepts
- Configuration reference
- RFC 9126: OAuth 2.0 Pushed Authorization Requests
- RFC 9101: The OAuth 2.0 JWT-Secured Authorization Request (JAR)