| Internet-Draft | Policy Binding in OAuth | July 2026 |
| Liu, et al. | Expires 8 January 2027 | [Page] |
AI agents exhibit dynamic, unpredictable behavior that cannot be
fully described by traditional OAuth 2.0 scopes. This
specification defines a behavioral authorization framework in
which domain-specific authorization schemas are carried in
authorization requests and bound to OAuth 2.0 access tokens
via authorization_details. A domain-specific
authorization schema is a structured, machine-verifiable
description of the behavioral boundaries approved for an
agent, such as transaction limits for an e-commerce domain.
Resource servers verify agent behaviors against the approved
schema instance at runtime through deterministic constraint
evaluation, without a policy engine. Authorization servers
review requested schema instances against server-side
authorization policies, which MAY be expressed in any policy
language as an implementation detail. This specification also
defines a reverse-guided authorization mechanism allowing
resource servers to return structured schema requirements in
error responses, enabling agents to dynamically adapt their
behavior and construct appropriate authorization requests.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 8 January 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
AI agents differ fundamentally from traditional OAuth clients in that their behavior space is dynamic and often unpredictable at authorization time. When a human delegates a task such as "help me find and buy a laptop" to an AI agent, the specific sequence of operations (product comparison, price checking, coupon search, cart management, payment, shipping selection) emerges at runtime based on available products, pricing, user preferences, and agent reasoning. Traditional OAuth 2.0 scopes, which grant broad access rights without behavioral context, cannot express the fine-grained constraints needed to govern such behavior: an overly broad scope grants unchecked power (violating least privilege), while an overly narrow scope causes frequent authorization failures that interrupt the agent's task execution.¶
This specification builds on OAuth 2.0 [RFC6749] and Rich Authorization Requests (RAR) [RFC9396] by introducing a behavioral authorization framework based on domain-specific authorization schemas. A domain-specific authorization schema is a structured, machine-verifiable description of behavioral boundaries for a particular application domain, such as transaction boundaries for e-commerce operations. An agent requests authorization by submitting a schema instance in the authorization request; the Authorization Server reviews the instance against server-side authorization policies and, upon approval, binds it to the access token. At runtime, the Resource Server verifies each of the agent's behaviors directly against the approved schema instance, without requiring a policy engine. This shifts the authorization model from "what resources can the client access" to "within what behavioral boundaries can the client operate," enabling the agent to act freely within approved constraints while every individual behavior is verified at execution time.¶
The approved schema instance also serves as a formal expression of human intent: when a human delegates a task to an agent, the instance encodes the boundaries of that delegation in a machine-verifiable form. The agent retains behavioral autonomy: it decides what to do and when, but every action is constrained by the approved schema instance. This enables a balance between agent autonomy and human oversight that is not achievable with static scope-based authorization.¶
This specification enables:¶
Domain-specific authorization schemas can be used in
conjunction with the delegation_chain claim
([I-D.liu-oauth-chain-delegation]). When a
delegation hop carries a schema instance, the instance
defines the fine-grained authorization constraints that were
approved at that hop, complementing the delegation lineage
and attestation provided by delegation_chain.¶
This specification defines a framework for
domain-specific authorization schemas:
structured definitions of behavioral boundaries for a
particular application domain. Each schema is identified
by an authorization details type registered per
[RFC9396], and schema instances are carried
in authorization requests and access tokens via
authorization_details. Schema instances are
structured data, not executable code: Resource Servers
verify agent behaviors against them through deterministic
constraint evaluation. How the Authorization Server
reviews requested instances is an implementation decision:
server-side authorization policies MAY be expressed in any
policy language (e.g., Rego [Rego]), but no
policy language constructs are carried in authorization
requests or access tokens (see
Appendix A).¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals.¶
This specification defines a framework for domain-specific
authorization schemas used with Rich Authorization Requests
(RAR) [RFC9396]. Schema instances are carried
within the authorization_details parameter as the
primary mechanism.¶
Key aspects of the RAR integration:¶
transaction_authority type as the initial
registration (see Section 3.1) and
the requirements that additional domain schema types MUST
satisfy.¶
authorization_details as the primary mechanism
for carrying the approved schema instance.¶
Resource Servers MAY advertise supported authorization
details types via the
authorization_details_types_supported attribute in
Protected Resource Metadata ([RFC9728]),
enabling clients to discover which domain-specific
authorization schemas are accepted before constructing
authorization requests. This discovery mechanism is
particularly valuable in multi-tenant or federated
environments where different resource servers may require
different schema structures.¶
The authorization_details parameter provides one
mechanism for carrying a schema instance in the
authorization request; this specification standardizes the
binding of the approved schema instance to the access
token, not the specific input channel by which the
instance reaches the Authorization Server.¶
authorization_details. When approved by the
Authorization Server, the schema instance is bound to the
access token and verified by the Resource Server against
each agent behavior at runtime.¶
authorization_details parameter.¶
schema_ref claim defined in this specification.¶
The following figure illustrates the end-to-end schema binding flow. The client proposes a domain-specific schema instance in the authorization request; the Authorization Server reviews and approves it; and the Resource Server verifies each agent behavior against the approved instance through deterministic constraint evaluation.¶
+--------+ +--------+ +--------+
| Client | | AS | | RS |
| | | | | |
+--------+ +--------+ +--------+
| | |
| (1) AuthZ Req | |
| with schema | |
| instance | |
| (type= | |
| transaction_ | |
| authority) | |
|--------------->| |
| | |
| | (2) Validate |
| | instance |
| | |
| | (3) Review |
| | and approval |
| | |
| (4) Access | |
| Token with | |
| approved | |
| schema | |
| instance | |
|<---------------| |
| | |
| (5) Agent | |
| Behavior | |
| with token | |
|-------------------------------->|
| | |
| | | (6) Extract
| | | approved
| | | schema
| | | instance
| | |
| | | (7) Verify
| | | behavior
| | | against
| | | instance
| | | constraints
| | |
| | | (8) Enforce
| | | decision
| | |
| (9) Response | |
|<--------------------------------|
authorization_details containing a schema instance
(e.g., of type transaction_authority, with the
boundary constraints and optional
context field). This leverages RAR (RFC 9396)
for structured authorization requests.¶
authorization_details array per RFC 9396
Section 7.1, binding the approved schema instance
to the token.
The AS MAY include additional metadata in the
authorization_details object (e.g., server-assigned
identifiers or normalized instance content) but MUST NOT
alter the semantic meaning of the instance without client
consent.¶
authorization_details
in the access token.¶
Traditional OAuth error responses indicate authorization failure without providing guidance on how to obtain valid authorization. In behavioral authorization, this is particularly important: when an agent encounters behavioral drift (its next planned behavior falls outside the approved schema instance), the agent needs structured guidance to recover autonomously. Resource servers can provide this guidance through structured error responses that enable agents to construct appropriate authorization requests with updated behavioral constraints.¶
When an agent's request lacks sufficient authorization, the resource
server returns an HTTP 403 Forbidden response with a
WWW-Authenticate header containing the
insufficient_authorization error code and a
schema_profile parameter. This parameter provides machine-readable
guidance on the required authorization conditions.¶
Per RFC 6750 [RFC6750] Section 3 and
RFC 6749 [RFC6749] Section 5.2, the error
response includes both the WWW-Authenticate header
with the insufficient_authorization error code and a
JSON error body. The schema_profile parameter in the
WWW-Authenticate header provides machine-readable
guidance on the required authorization conditions.¶
The schema_profile parameter value is a base64url-encoded
JSON object. Implementations SHOULD use base64url encoding
without padding (no trailing = characters) per
RFC 4648 [RFC4648] Section 5 to avoid
quoting issues in the WWW-Authenticate header.
The decoded object has the following structure:¶
{
"profile_uri": "https://resource.example/policies/purchase",
"required_scope": ["purchase.create"],
"required_claims": ["agent_id", "user_id"],
"constraints": {
"max_amount": {
"type": "number",
"description": "Maximum transaction amount in USD",
"required": true
},
"trigger_source": {
"type": "string",
"enum": ["user_initiated", "scheduled"],
"description": "Source of the operation trigger"
}
},
"confirmation_required": true,
"auth_server": "https://as.example.com"
}
RFC 6750 [RFC6750] defines the
insufficient_scope error for cases where the access
token lacks the scopes required by the resource server.
The insufficient_authorization error defined in this
specification addresses a broader condition: the token may
include adequate scopes but lack the schema-based authorization
structure (e.g., boundary constraints or user
confirmation) required by the resource server.¶
For example, consider an agent holding an access token with
scope purchase that attempts to create a $500
purchase. The resource server requires a schema
instance that limits transaction amounts and
requires user confirmation for purchases above $200. The
scope is sufficient, but the token lacks the required
schema binding. The insufficient_scope error
cannot express this condition because the deficiency is
structural (missing boundary constraints and confirmation
signal), not scope-based. The
insufficient_authorization error with a
schema_profile payload allows the resource server
to convey both the missing boundary constraints (e.g.,
max_amount: 200) and the need for user
confirmation (confirmation_required: true) in a
machine-parseable form that the agent can act on
autonomously.¶
Resource servers SHOULD use insufficient_scope when
the deficiency is purely scope-based and
insufficient_authorization when the deficiency involves
boundary constraints that cannot be expressed as additional scopes.¶
The schema_profile object contains the following fields:¶
agent_id, user_id) that MUST be
present in the authorization context established by
the access token. For JWT access tokens, these are
claim names that MUST appear in the JWT. For opaque
access tokens validated via introspection
([RFC7662]), these are field names
that MUST appear in the introspection response.¶
type (data type),
description (human-readable explanation),
enum (allowed values), and required
(boolean, whether the constraint must be provided).¶
interaction_required error with JWT Grant Interaction
Response
[I-D.parecki-oauth-jwt-grant-interaction-response],
or the prompt parameter in the authorization code flow).¶
Upon receiving a reverse-guided authorization response, the AI agent SHOULD:¶
schema_profile to understand authorization requirements.¶
auth_server is trusted before
proceeding.¶
schema_profile, and any additional
parameters required by the resource server.¶
confirmation_required is true, initiate user consent flow.¶
auth_server's metadata (RFC 8414) and
submit the authorization request.¶
This adaptive approach enables agents to "learn" authorization requirements dynamically, reducing the need for pre-programmed knowledge of each resource server's policies.¶
During multi-step task execution, an agent may encounter
behavioral drift: situations where the next
behavior in its plan falls outside the approved schema
constraints. When this occurs, the agent has three options:
(1) request a new authorization with an updated schema instance that
accommodates the new behavior (using the reverse-guided
authorization mechanism described above); (2) degrade its
behavior to stay within the approved constraints (e.g.,
selecting an alternative, less privileged action); or
(3) request human confirmation to approve an expanded
behavioral boundary. The choice among these options depends
on the agent's task context and the
confirmation_required signal from the resource
server. Implementations SHOULD prefer degradation over
re-authorization for minor boundary violations to avoid
excessive authorization round-trips in long-running agent
workflows.¶
Security considerations specific to reverse-guided authorization, including auth server verification and constraint validation, are described in Section 9.¶
Upon receiving an authorization_details request containing a
domain-specific schema instance, the AS MUST perform the following
validation steps:¶
type field identifies
a domain-specific authorization schema known to the AS
(e.g., transaction_authority,
Section 3.1).¶
start earlier than
end).¶
actions, locations) do not exceed the
client's registered permissions. The AS SHOULD also verify
that the boundary constraints are consistent with the
common fields (e.g., every operation listed in
boundary.operations corresponds to a declared
action).¶
Because the request carries structured data rather than executable code, no syntax parsing, entry point resolution, or safety analysis of program code is required. This eliminates the class of vulnerabilities associated with evaluating client-submitted policy code.¶
When the AS issues a schema_ref claim instead of
embedding the full approved instance in authorization_details,
the AS MUST register the instance:¶
When the AS embeds the approved instance directly in the
enriched authorization_details (the primary path),
explicit registration is not required; the instance travels
with the token.¶
Instance registration in this specification is dynamic and on-demand. The Authorization Server does not need to maintain a pre-configured catalog of instances. When a schema instance is submitted for binding, the AS reviews it against pre-established approval principles (see Section 6.4) and registers it only if approved. This eliminates the operational burden of pre-deploying instances for every anticipated agent behavior, which is impractical given the dynamic and unpredictable nature of AI agent workflows.¶
Deployments MAY also pre-register instances for well-known agent workflows (e.g., automated reconciliation, scheduled reporting) where the behavioral boundaries are stable and known in advance. In such cases, the agent can reference the pre-registered instance by identifier rather than submitting the full instance content in each authorization request. Both modes are supported: dynamic registration is the default for exploratory agent tasks, while pre-registration is an optimization for predictable workflows.¶
If instance validation or approval fails, the AS MUST return an error response per RFC 6749 Section 5.2. The following table consolidates the error taxonomy for schema-instance-related conditions. The AS selects the error code based on the nature of the failure:¶
| Condition | Error Code | Rationale |
|---|---|---|
Unknown type (schema not known to the AS) |
invalid_request
|
Schema identifier not recognized |
Missing required schema field (e.g., boundary) |
invalid_request
|
Instance does not conform to the schema |
| Unknown field not defined by the schema |
invalid_request
|
Instance contains fields outside the schema |
| Constraint value out of range or malformed |
invalid_request
|
Constraint value violates the schema definition |
| RAR common fields exceed client's registered permissions |
invalid_scope
|
Behavioral boundary exceeds pre-approved scope |
| Other review failures (e.g., organizational review policy denies this pattern) |
invalid_request
|
Approval basis not satisfied |
| User consent required before binding |
interaction_required
|
Per JWT Grant Interaction Response |
Example error response:¶
{
"error": "invalid_request",
"error_description": "Invalid schema instance: boundary.total_amount_limit.value must be a non-negative number"
}
The Authorization Server's approval of a schema instance is not limited to conformance validation. The AS determines whether the proposed behavioral boundaries are appropriate for the specific client and resource owner based on the following factors:¶
interaction_uri mechanism in JWT Grant Interaction
Response).¶
For example, the AS MAY maintain a per-client allowlist of
approved behavioral patterns (e.g., permitted actions, maximum
transaction limits, allowed resource classes). When a new
schema instance is submitted, the AS verifies
that the declared RAR common fields
(actions, locations) and the boundary
constraints fall within the client's
pre-approved boundaries. If the proposed instance exceeds these
boundaries, the AS SHOULD return invalid_scope when
the behavioral boundaries exceed the client's registered
permissions, or invalid_request for other review
violations (see the consolidated taxonomy in
Section 6.3). Alternatively, the AS MAY escalate to the resource
owner for explicit consent before issuing the token.¶
Because instances are structured data with schema-defined fields, this review is a comparison of constraint values against the AS's approval principles, rather than analysis of arbitrary program code. The AS MAY implement its review policies in any policy language or rule system of its choosing; such implementation is an AS-internal concern (Appendix A).¶
This layered approval model ensures that the schema instance carried in the access token is trusted not only for its schema conformance but also for its alignment with the review policies governing the client-resource owner relationship. The Resource Server can rely on this trust when enforcing the approved instance at runtime.¶
When an access token carrying an approved schema instance expires and the client obtains a new access token via a refresh token, the AS re-binds the same approved instance to the new access token. The client does not resubmit the instance in the refresh request; the AS retrieves it from the authorization session state associated with the refresh token.¶
Refresh is a token-renewal operation, not an authorization request. A refresh request MUST NOT modify the approved schema instance. If the agent's task requires different behavioral boundaries, the agent MUST either initiate a new authorization request (using the reverse-guided mechanism described in Section 5 if applicable) or use Token Exchange ([RFC8693]) as described in Section 8. Both paths go through the full validation and approval process defined in this section.¶
The refresh token lifetime SHOULD NOT exceed the validity period of the associated schema instance. If the instance has a natural expiration (e.g., a time-window constraint), the AS SHOULD align the refresh token lifetime accordingly.¶
The Resource Server acts as the Policy Enforcement Point (PEP) in the behavioral authorization framework. It extracts the approved schema instance from the access token, verifies each agent behavior against the boundary constraints through deterministic constraint evaluation, and enforces the resulting decision (allow or deny). No policy engine or policy language runtime is required at the Resource Server.¶
The RS obtains the approved instance from the access token. The
primary mechanism is to extract the instance from the enriched
authorization_details array included in the token
per RFC 9396 Section 7.1.¶
The binding between the instance and the access token depends
on the token type. For JWT access tokens, the instance content
or schema_ref claim is integrity-protected by the
token signature. For opaque tokens, the binding is established
through token introspection [RFC7662] or a
shared back-channel between the AS and RS.¶
When the token uses the schema_ref claim instead
of inline instance content, the RS retrieves the instance using
one of the following methods:¶
After extracting the approved instance from the token, the RS
verifies each agent behavior against every constraint present
in the boundary object. Each constraint check is a
deterministic comparison between the behavior's attributes and
the constraint value, for example:¶
boundary.operations;¶
boundary.total_amount_limit;¶
boundary.merchant;¶
boundary.time_window.¶
The verification data assembled by the RS for these checks is described in Section 3.3.¶
Based on the constraint evaluation:¶
The domain-specific authorization schema types defined in this
specification (e.g., transaction_authority,
Section 3.1) can be used with any OAuth 2.0
authorization flow that supports Rich Authorization Requests (RAR)
[RFC9396]. This section illustrates usage with
flows that are particularly relevant to AI agent scenarios.¶
The JWT Authorization Grant Interaction Response
[I-D.parecki-oauth-jwt-grant-interaction-response]
is the RECOMMENDED flow for AI agent scenarios. In this flow,
an agent presents a JWT assertion to the token endpoint. If
user interaction (e.g., consent) is required before the token
can be issued, the AS returns an interaction_required
error with an interaction_uri where the user can
complete the interaction. The agent then polls for the token.¶
When combined with schema binding, the agent includes
authorization_details containing a schema
instance in the JWT grant request. The AS
validates the instance, performs
behavioral boundary checks, and determines whether user
consent is needed before issuing the token.¶
POST /token HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer &assertion=eyJhbGciOiJSUzI1NiJ9... &authorization_details=%5B%7B%22type%22%3A%22transaction_authority%22%2C %22domain%22%3A%22ecommerce%22%2C%22boundary%22%3A%7B%22total_... %22actions%22%3A%5B%22search%22%2C%22cart.add%22%5D%7D%5D
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": "interaction_required",
"interaction_uri": "https://as.example.com/interact/abc123",
"interval": 5,
"expires_in": 600
}
After the user completes the interaction, the agent retries
the same JWT grant request. The AS then issues the access
token with the enriched authorization_details
containing the approved instance.¶
In machine-to-machine scenarios using client credentials, a schema instance can be included in the token request:¶
POST /token HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &client_id=spiffe%3A%2F%2Fagent.example%2Fagent &client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer &client_assertion=eyJhbGciOiJSUzI1NiIs... &authorization_details=%5B%7B%22type%22%3A%22transaction_authority%22%2C %22domain%22%3A%22ecommerce%22%2C%22boundary%22%3A%7B...%7D%7D%5D
When exchanging tokens [RFC8693], a new schema instance can be provided to refine or restrict the approved behavioral boundaries:¶
POST /token HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange &subject_token=eyJhbGciOiJSUzI1NiJ9... &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token &authorization_details=%5B%7B%22type%22%3A%22transaction_authority%22%2C %22domain%22%3A%22ecommerce%22%2C%22boundary%22%3A%7B...%7D%7D%5D
The resulting access token MUST include the new approved
schema instance. Unlike policies written in a general-purpose
policy language, structured schema instances make subset
verification decidable: each constraint in the new instance
can be compared field-by-field against the corresponding
constraint of the original instance (e.g., a lower
total_amount_limit, a subset of
operations, or a narrower time_window).
When subset_rule is "strict"
(Section 3.1), the AS MUST verify that
the derived instance is a subset of the original instance and
reject the exchange otherwise. When subset_rule is
"loose", the AS MAY apply its own review policies
(Appendix A) when deriving the new
instance.¶
Token Exchange is a common trigger for behavioral
drift: when an agent's next planned behavior falls
outside the approved schema constraints, the Resource Server
can return an insufficient_authorization error with
a schema_profile (as defined in
Section 5), guiding the agent toward
constructing an appropriate Token Exchange request with an
updated schema instance. This enables
multi-hop delegation scenarios where each hop progressively
refines the behavioral boundaries to match the delegatee's
specific task requirements.¶
The behavioral authorization framework defined in this specification relies on the following trust assumptions, which deployments MUST evaluate before adoption:¶
A compromised or malicious AS could embed a wildly permissive instance in an access token, causing the RS to allow behaviors that the RS operator did not intend. To mitigate this risk, the RS MAY impose overlay constraints on top of the token-bound instance, such as:¶
The choice of which ASes to trust is a deployment
decision. Resource Servers SHOULD restrict the set of
trusted Authorization Servers and reject tokens issued
by untrusted ASes. The authorization_servers
field in Protected Resource Metadata
([RFC9728]) provides a mechanism for the
RS to advertise its trusted ASes to clients.¶
Schema instances carried in authorization requests and access tokens are structured data conforming to registered schema definitions; they contain no executable code. This eliminates the class of attacks associated with client-submitted policy code, including non-terminating or resource-intensive evaluations, catastrophic regular-expression backtracking, and built-in functions with side effects (e.g., outbound HTTP requests from within a policy evaluation). Neither the AS nor the RS executes client-supplied content at any point in the flow.¶
To preserve this property, the AS MUST reject instances containing fields not defined by the declared schema, and the RS MUST ignore or reject instances containing unknown fields. Policy languages, where used at all, are confined to the Authorization Server's internal review of instances (Appendix A) and are never supplied by clients.¶
The schema_ref claim in access tokens MUST reference
instances registered and stored securely by the AS. When the
access token is opaque, the Resource Server
retrieves the instance through token introspection
([RFC7662]). The introspection response
SHOULD include the approved schema instance using
the same mechanisms as the access token: either the
enriched authorization_details array containing
the approved instance (the primary
mechanism), or the schema_ref claim (the
lightweight alternative). When a JWT access token is
introspected, the introspection response SHOULD reflect
the claims present in the JWT, including
authorization_details and schema_ref,
per RFC 7662 Section 2.2.¶
Resource Servers SHOULD invalidate cached instance content
when the associated access token expires. If the AS
revokes a registered instance before the token expires, the
AS SHOULD also revoke the associated access token,
causing subsequent introspection calls to return
active: false per RFC 7662. Resource servers
that observe active: false (or that are
otherwise notified of instance revocation through a
deployment-specific mechanism) MUST treat subsequent
verifications for the token as failed
(deny-by-default).¶
Instances embedded inline within authorization_details can increase token request and access token size. Implementations MUST enforce limits on:¶
For instances exceeding these limits, clients SHOULD use
pre-registered instances referenced via schema_ref
rather than inline instance content.¶
Implementations of reverse-guided authorization (Section 5) MUST consider the following security aspects:¶
auth_server specified in the
schema_profile is trusted before submitting
authorization requests. Verification SHOULD be performed
by comparing the auth_server value against one
of the following trust anchors: (1) the
authorization_servers field in the Protected
Resource Metadata ([RFC9728]) obtained
from the resource server that returned the error;
(2) a pre-registered allowlist of trusted authorization
servers configured at client provisioning time; or
(3) a deployment-specific trust registry. If none of
these trust anchors are available, agents MUST NOT submit
authorization requests to the specified
auth_server. Agents MUST use only the token
endpoint discovered from the auth_server's
Authorization Server Metadata
([RFC8414]). Blindly following redirects
or trusting unverified auth_server values could
lead to credential theft.¶
All communications in the reverse-guided flow MUST use TLS to prevent man-in-the-middle attacks on error responses.¶
Implementations of this specification MUST consider the following privacy aspects per BCP 188 [RFC6973]:¶
authorization_details may carry
identifying data (e.g., user identifiers in the
context field, or merchant and category values in
the boundary).
When instances are carried in JWT access tokens, this data
is visible to any party that can decode the token.
Implementations SHOULD avoid embedding personally identifiable
information (PII) directly in instance content and instead
use correlation identifiers (e.g.,
transaction_id) that the Resource Server or an
audit service resolves when needed.¶
schema_profile returned in error responses reveals
the required boundary constraints to the requesting client.
While this disclosure is necessary for the reverse-guided
authorization flow, resource servers SHOULD limit the
information to what is strictly needed for the client to
construct a valid authorization request, and MUST NOT include
internal implementation details, database schemas, or
infrastructure information.¶
auth_server field in schema_profile reveals
the Authorization Server's identifier. Deployments SHOULD
use well-known identifiers rather than
exposing internal service URLs.¶
This specification defines the following authorization data type
for use with the authorization_details parameter
defined in RFC 9396:¶
This specification establishes a new IANA registry titled
"Domain-Specific Authorization Schema Types" for identifiers
used in the type field of schema instances carried
in authorization_details.
The registry is intended to be extensible; new schema type
identifiers can be registered to cover additional domains
and behavioral constraint vocabularies.¶
Registration requests MUST be sent to the oauth-ext-review@ietf.org mailing list for review and comment, using the "Specification Required" policy ([RFC8126]).¶
The Designated Expert for this registry SHOULD verify that each registration request satisfies the following criteria before approval:¶
The initial registry contents are:¶
| Type Identifier | Description | Change Controller | Reference |
|---|---|---|---|
| transaction_authority | Transactional behavioral boundaries (amount, operations, category, merchant, time window) for agent authorization. | IETF | Section 3.1 of this document |
Future registrations MUST include:¶
Additional domain-specific authorization schemas are expected to be registered via follow-up specifications that define the schema per the framework requirements in Section 3.¶
This specification registers the following claim in the "JWT Access Token JWT Claims" registry established by [RFC9068]:¶
This specification registers the following error code in the "OAuth 2.0 Bearer Token Error Values" registry established by [RFC6750]:¶
WWW-Authenticate header per [RFC6750].¶
insufficient_scope error defined in
[RFC6750] addresses scope insufficiency.
insufficient_authorization (this specification) addresses the case where the
resource server returns structured boundary constraints
(schema_profile) for clients capable of constructing
schema-based authorization requests.¶
This specification defines a new parameter for use in the
WWW-Authenticate header field with the Bearer
authentication scheme, as defined in [RFC6750].¶
WWW-Authenticate response header field, used in
resource server error responses per [RFC6750]
Section 3.¶
RFC 6750 does not establish an IANA sub-registry for Bearer
authentication scheme parameters. This section serves as the
specification reference for the schema_profile parameter.¶
In this specification, policy languages are not part of the wire protocol. Authorization requests and access tokens carry domain-specific schema instances — structured data — as defined in Section 3.1. Policy languages appear, if at all, only inside the Authorization Server, where they implement the AS's review of submitted instances (Section 6.4).¶
An AS review policy expresses the AS's approval principles: per-client allowlists of behavioral patterns, organizational limits (e.g., maximum transaction amounts per client class), and rules requiring resource owner consent for specific boundary combinations. When an instance is submitted, the AS evaluates the instance's structured fields against these review policies and approves or rejects the request.¶
AS review policies MUST NOT be transmitted to clients or
embedded in access tokens. They are an implementation detail
of the Authorization Server; the only normative artifacts on
the wire are the schema instance and, optionally, the
schema_ref identifier assigned by the AS. Because
the AS never executes client-supplied content and clients
never observe the review policies, the attack surface
associated with policy exchange is eliminated (see the
"No Executable Content" subsection of
Section 9).¶
The following non-normative example shows how an AS might
implement one review rule using Rego [Rego]
and Open Policy Agent (OPA) [OPA]. The rule
approves a transaction_authority instance only if
the requested amount limit is within the client's registered
maximum and consent is recorded when the amount exceeds a
consent threshold:¶
package as.review
default approve = false
approve if {
input.instance.type == "transaction_authority"
input.instance.boundary.total_amount_limit.value <= input.client.max_amount
(
input.instance.boundary.total_amount_limit.value <= 100
or input.consent_recorded == true
)
}
Here input.instance is the schema instance
submitted by the client, input.client is the
client's registration metadata, and
input.consent_recorded reflects the outcome of the
resource owner interaction. Equivalent rules could be written
in any rule system; the choice of Rego is illustrative only.¶
An agent authorized to search products and add items to the cart, with purchases capped at 50 USD:¶
{
"type": "transaction_authority",
"domain": "ecommerce",
"boundary": {
"total_amount_limit": { "value": 50, "currency": "USD" },
"operations": ["ecommerce.search", "ecommerce.cart.add",
"ecommerce.purchase"]
},
"subset_rule": "strict",
"actions": ["search", "cart.add", "purchase"]
}
An agent authorized to submit orders only within a defined 24-hour window:¶
{
"type": "transaction_authority",
"domain": "ecommerce",
"boundary": {
"operations": ["ecommerce.order.submit"],
"time_window": {
"start": "2026-08-20T09:00:00Z",
"end": "2026-08-21T09:00:00Z"
}
},
"actions": ["order.submit"]
}
An agent restricted to a single merchant and a single product
category, correlated with a consent record via
transaction_id
([I-D.liu-oauth-authorization-evidence]):¶
{
"type": "transaction_authority",
"domain": "ecommerce",
"transaction_id": "urn:uuid:txn-def-456",
"boundary": {
"total_amount_limit": { "value": 200, "currency": "EUR" },
"operations": ["ecommerce.purchase"],
"category": ["electronics"],
"merchant": ["https://shop.example.com"]
},
"subset_rule": "strict",
"actions": ["purchase"],
"locations": ["https://api.shop.example.com"]
}
The authors would like to thank Brian Campbell for his valuable feedback and insightful discussions during the development of this specification. His contributions helped shape key design decisions. The authors also thank the OAuth WG community, including Jeff Lombardo, David Brossard, Yaron Sheffer, Yaron Zehavi, and Suresh Krishnan, for their collaborative input on the domain-specific schema approach.¶