Rich Authorization Requests (RAR)

instead of a flat `scope` string, the client sends `authorization_details`, a JSON array of typed objects that say exactly what it wants, such as one payment of a given amount to a given account.

Where it stands
Published RFC
Official text
RFC 9396
Documented support
3
Activity
2 signals in 90 days

Read the RFC side by sideExplainer source on GitHub

When you reach for it

  • A payment initiation API: the user must consent to a specific transfer, with amount, currency and creditor, and a scope like payments cannot carry that. authorization_details carries the transaction itself, so the consent screen and the access token are both tied to it (Section 1).
  • An API where access is per resource, not per category: locations, actions and datatypes let the client say which resource server, which operations and which kinds of data, instead of inventing a scope string per combination (Section 2.2).
  • A resource server that needs the granted details, not just a scope list: the authorization server must make the granted authorization_details available to the resource server, as a JWT claim or through introspection (Sections 9, 9.1 and 9.2).
  • A deployment that cannot tell what a client is asking for from scope alone: the token response echoes authorization_details as granted by the resource owner, so the client knows what it actually got (Section 7).
Diagram
flowchart LR
    A["Client needs consent for one specific action"] -->|"scope=payments: coarse, cannot name amount or payee"| B["Over-broad grant, consent screen cannot show the transaction, RS cannot check the specifics"]
    A -->|"authorization_details: typed JSON objects"| C["Exact request, exact consent, exact token content the RS can enforce"]

The problem it solves

scope is a list of strings. It can say what kind of access a client wants, but not which resource, which amount or which recipient. For a payment the authorization server has to show the user the actual transaction to obtain meaningful consent, and the resource server later has to enforce exactly that transaction. Neither fits in a string the client and server had to agree on in advance.

RAR introduces the authorization_details parameter, which lets clients specify their fine-grained authorization requirements using the expressiveness of JSON data structures (Section 1). The authorization server controls how each type is interpreted (Section 2.1), and whatever was granted flows to the token and on to the resource server.

How it works

Diagram
sequenceDiagram
    participant C as Client
    participant AS as Authorization Server
    participant RS as Resource Server
    C->>AS: authorization request with authorization_details, array of objects, each with type and fields such as locations, actions, datatypes, identifier, privileges
    AS->>AS: reject unknown type with invalid_authorization_details
    AS-->>C: consent shown from the details, then code
    C->>AS: token request, optionally authorization_details to narrow what the token should carry
    AS-->>C: access_token plus authorization_details as granted
    C->>RS: request with the access token
    RS->>AS: introspection, or read the authorization_details JWT claim
    RS-->>C: enforce the granted details

authorization_details contains, in JSON notation, an array of objects, and each object has a required type that identifies the authorization details type as a string (Section 2). The spec defines common fields usable across APIs: locations, actions, datatypes, identifier and privileges (Section 2.2). The client sends the parameter in the authorization request in the same places scope is used (Section 3). The authorization server must refuse any unknown type and answer with invalid_authorization_details (Section 5). At the token endpoint the client may send authorization_details again to say which details it wants assigned to this access token (Section 6), and the token response must return the authorization_details as granted by the resource owner (Section 7). For resource servers, a JWT access token should carry the details as a top-level authorization_details claim filtered to the audience (Section 9.1), and an introspection response must contain the same structure (Section 9.2).

What the spec requires

  • The request parameter authorization_details is a JSON array of objects, and type is required in each (Section 2).
  • The authorization server controls the interpretation of the type value (Section 2.1).
  • It is recommended that a given API use only one of scope and authorization_details (Section 3.1).
  • The authorization server must refuse to process any unknown authorization details type and return invalid_authorization_details in the listed cases (Section 5).
  • The token response must also return the authorization_details as granted by the resource owner, and the attached details may differ from what the client requested (Sections 7 and 7.1).
  • The authorization server must make the granted data available to the resource server, as a top-level JWT claim or in the introspection response with the same structure (Sections 9, 9.1 and 9.2).
  • Server metadata advertises authorization_details_types_supported, and client metadata uses authorization_details_types (Section 10).

Watch out

  • authorization_details passes through the user agent, so if its integrity matters, clients must protect it against tampering and swapping with a signed request object or a pushed request_uri (Section 12).
  • An authorization server should not rely on simple object comparison when deciding whether a token request's details are a subset of what was granted, because intersections of fields can have side effects (Section 6.1).
  • Each type is a deployment of its own: define it, publish it in server metadata, decide how it is shown in the consent prompt, and decide how the resource server processes it (Section 11.1).
  • Large authorization_details make the authorization URL large, so use pushed authorization requests with request_uri (Section 11.4).
  • It is especially important to design and use authorization details in a privacy-preserving manner (Section 13).

Sources

How it relates to other specs

Relations diagram
flowchart LR
  s_rar["Rich Authorization Requests"]
  s_oauth2["OAuth 2.0"]
  s_rar_metadata_remediation["RAR Metadata and Error Remediation"]
  style s_rar stroke-width:3px
  s_rar -->|Extends| s_oauth2
  s_rar_metadata_remediation -->|Extends| s_rar

Documented support

Adoption lists only support stated in official documentation (the vendor's or project's own, or a standards body's page naming it), and a weekly check confirms the cited phrase is still on that page. Experimental, alpha and beta support is counted separately as preview.

Products, identity providers and services

  • Auth0 (Identity provider): authorization_details in the authorization code flow with PAR, and in CIBA source (verified 2026-11-11)
  • PingFederate (Identity provider): Supports OAuth rich authorization requests source (verified 2026-11-11)

Open-source implementations

  • node-oidc-provider (Library): RFC 9396 is in its list of implemented specs source (verified 2026-11-11)

Activity

Revisions from the Datatracker, explanations from this site's daily runs, and mailing-list subjects naming the draft.

Explanations on this site

  • New proposalOAuth WG

    Agent Passport author spells out -01 rules for cumulative limits, RAR grants and per-constraint attenuation of delegation receipts.

    New draft: Agent Passports and Delegation Receipts (draft-le-agent-passport-00) (2 new messages)

    Read the explanation

    In reply to Kieran Sweeney, Ben Le says -01 will require a receipt with a cumulative limit to name exactly one relying party, which alone counts for the receipt and all its children. A limit without a single named party will be invalid. Sharing a total across relying parties is out of scope, and whether another party in the call path could keep the total is left open. He will define an RFC 9396 authorization_details type for grants so an authorization server that supports RAR can issue root receipts directly, while Token Exchange remains the path for an agent that obtains a receipt using its passport as actor token. He also gives a per-constraint subsumption table (host, port, methods, paths, tools, max_body_bytes, max_calls, max_spend, exp, aud). A child attenuates its parent only if every rule holds, unknown members are rejected, and anything not comparable is rejected. -01 has only a fixed limit of 8 receipts per chain and no depth claim. He plans to join Niki's comparison side meeting on 16 November and hold his own on 17 November, ahead of IETF 127.

    • An authorization server that already supports RAR could issue root delegation receipts for agents using a new authorization_details type.
    • A relying party enforcing a cumulative spend or call cap on an agent chain must be the one named counter in the receipt.
    • Implementers of several agent delegation drafts can use the per-constraint attenuation table as a basis for shared test vectors.
    • Related in IETF WIMSE: draft-asor-wimse-agent-delegation-chain. Named in the thread as having its own subsumption rule to compare against.
    • Related in IETF WIMSE: draft-hulea-wimse-agent-mandate. Named in the thread (as Hulea) among the drafts whose attenuation rules are to be compared.
    • Related in IETF WIMSE: draft-sweeney-wimse-credential-delegation. Kieran Sweeney, who replies in the thread, authors this credential delegation draft. This is an inference from the author name only.
  • New proposalOAuth WG

    A new individual draft defines Agent Passports and Delegation Receipts, issued through Token Exchange.

    New draft: Agent Passports and Delegation Receipts (draft-le-agent-passport-00)

    Read the explanation

    draft-le-agent-passport-00 defines two signed objects. An Agent Passport is a JWT that binds an agent's key (cnf) to the accountable organisation and to a digest of its build. Delegation Receipts form a chain from a user through agents and sub-agents. Each step is key-bound and can only narrow the one before, and the relying party verifies the chain and intersects it with the user's own access. Root receipts are obtained with RFC 8693 Token Exchange, using the passport as actor token and a new requested_token_type urn:ietf:params:oauth:token-type:agent-delegation. Status uses the Token Status List draft. The open question is whether grants should be an RFC 9396 authorization_details type. The author mentions a side meeting at IETF 127 and an IPR disclosure, and says the draft complements draft-klrc-aiagent-auth and AAuth.

    sequenceDiagram
      participant U as User
      participant A as Agent
      participant AS as Authorization Server
      participant RP as Relying Party
      A->>AS: Token Exchange, actor_token = Agent Passport
      AS-->>A: root Delegation Receipt (agent-delegation type)
      A->>A: sub-agent receipt, narrower than parent
      A->>RP: passport and receipt chain
      RP->>RP: verify chain, intersect with user access
    • An authorisation server that already supports RAR and wants to issue agent delegation grants as authorization_details
    • A relying party that must check, across organisations, that a sub-agent's authority is a subset of the user's
    • Related in OpenID: openid/aauth. The author says the draft is meant to complement AAuth.