Specification: RFC 9101
JAR carries the authorization request parameters as the claims of a JWT that the client signs, instead of as plain query parameters that a user agent could tamper with. A request object can be sent by value (request) to /authorize, or pushed ahead of time through RFC 9126 and redeemed by request_uri.
Status
Partially implemented. Checked claims: 17 of 19.
Request object
-
requestparameter carrying a signed JWT, sent to/authorize(§5.1) or pushed through/par(§5.2.1) (JarFlowSpec) - Only what the object carries is used; a query parameter cannot repeat or add to it (
JarFlowSpec) - Signature verified against the client’s registered JWK Set (§10), the same keys
private_key_jwtuses (JarFlowSpec) - Signing algorithm restricted to
request_object_signing_alg_values_supported(§4);alg: noneand HMAC algorithms are never accepted -
typ: oauth-authz-req+jwtaccepted when present and not required (§9.4.1, §10.8); other values are refused, exceptJWT -
client_idoutside the object must match theclient_idclaim inside (§6.3) (JarFlowSpec) -
issmust equalclient_id— only client-signed request objects are supported; objects signed by a third party (§1(d)) are not -
aud: on afapi2tenant exactly the issuer, as a string; on astandardtenant the issuer or the authorization endpoint URL (§4;JarFlowSpec) -
exprequired and bounded by the tenant’s client-assertion maximum — the RFC leaves it optional (§4) -
nbf: required on afapi2tenant, optional onstandard; when present it may be at most 60 minutes old, andexpat most 60 minutes after it (JarFlowSpec) -
iatandnbfup to 60 s in the future are accepted, further ahead is refused (JarFlowSpec) -
jtireplay guard — afapi2tenant requiresjti; astandardtenant checks it when the client sends one; a replayed object is refused (#358;JarFlowSpec) - Nested request objects are refused — an object naming its own
requestorrequest_uriclaim (§4, §10.7) - Cross-JWT confusion defence — an object carrying
sub, which would look like an RFC 7523 client assertion, is refused (§10.8) -
request_uriresolved by fetching a client-hosted URL (§5.2) — not implemented; arequest_uriat/authorizealways names a pushed request from/parand is never fetched over the network (§10.4 flags that fetch as a request-forgery surface) - Encrypted request objects (JWE) — not supported; only signed objects are accepted
Client metadata
-
require_signed_request_object(§10.5) — a client registered with it is refused a plain parameter set at/authorizeand an unsigned push at/par; registration rejects the flag when the client has no JWK Set (JarFlowSpec)
Authorization server metadata
-
request_object_signing_alg_values_supported(§4) -
request_parameter_supported: trueandrequest_uri_parameter_supported: true— the second one means pushed references only
Notes
- OpenID Connect Core §6 says the same for
request; see OpenID Connect Core. - On a
fapi2tenant thenbfandjtirules follow FAPI 2.0 Message Signing; see FAPI 2.0.
Where to look
Security profiles lists the nbf, jti and aud rules that differ between profiles.