Internet-Draft Policy Binding in OAuth July 2026
Liu, et al. Expires 8 January 2027 [Page]
Workgroup:
Web Authorization Protocol
Internet-Draft:
draft-liu-oauth-policy-binding-01
Published:
Intended Status:
Standards Track
Expires:
Authors:
D. Liu
Alibaba Group
H. Zhu
Alibaba Group
S. Krishnan
Cisco
H. Xue
Alibaba Group

Policy Language Binding for OAuth 2.0 Authorization

Abstract

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.

Status of This Memo

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.

Table of Contents

1. Introduction

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.

1.1. Domain-Specific Authorization Schemas

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).

1.2. Requirements Language

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.

1.3. RAR Integration

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:

  • Authorization Data Types: Each domain-specific authorization schema is identified by a distinct authorization details type registered per RFC 9396. This specification defines the transaction_authority type as the initial registration (see Section 3.1) and the requirements that additional domain schema types MUST satisfy.
  • Token Response: Per RFC 9396 Section 7.1, the access token includes enriched authorization_details as the primary mechanism for carrying the approved schema instance.
  • Complementary Use: Implementations MAY combine domain-specific authorization schemas with other RAR types in a single request.

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.

2. Terminology

Domain-Specific Authorization Schema:
A structured definition of behavioral boundaries for a particular application domain, identified by an authorization details type registered per [RFC9396]. A schema defines constraint fields whose values are machine-verifiable at runtime through deterministic evaluation.
Schema Instance:
A concrete authorization details object conforming to a domain-specific authorization schema, carried in 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.
transaction_authority:
The domain-specific authorization schema defined in this specification for transactional operations, such as e-commerce transactions. It constrains agent behavior through transaction boundaries including amount limits, operations, categories, merchants, and time windows.
AS Review Policy:
Server-side authorization policies used by the Authorization Server to review requested schema instances before approval. Review policies are managed by the Authorization Server and are never carried in authorization requests or access tokens. They MAY be expressed in any policy language (e.g., Rego [Rego]) as an implementation decision.
Policy Enforcement Point (PEP):
The entity that enforces authorization decisions, allowing, denying, or adapting the agent's request. In this specification, the Resource Server acts as the PEP, verifying each behavior against the approved schema instance.
Rich Authorization Requests (RAR):
A framework defined in [RFC9396] for expressing fine-grained authorization requirements through the authorization_details parameter.
Schema Reference:
An identifier for an approved schema instance that has been registered by the Authorization Server, included in JWT [RFC7519] access tokens via the schema_ref claim defined in this specification.

3. Domain-Specific Authorization Schema Framework

This specification defines a framework for domain-specific authorization schemas used with Rich Authorization Requests (RAR), and the transaction_authority schema as the initial registration. A domain-specific authorization schema is identified by an authorization details type registered per [RFC9396]. Schema instances carried in authorization_details are structured data; when approved by the Authorization Server, the instance is bound to the access token and verified by the Resource Server at runtime through deterministic constraint evaluation.

Authorization details types intended for use as domain-specific authorization schemas MUST satisfy the following requirements:

  1. Structured Constraints: The type MUST define its constraint fields with unambiguous data types and deterministic verification semantics, such that a Resource Server can verify a behavior against an approved instance without policy interpretation;
  2. Deny by Default: Behaviors not explicitly permitted by the approved instance MUST be denied;
  3. Common Fields: The type uses the common fields defined in RFC 9396 Section 2 (actions, locations, datatypes, identifier) to declare a declarative upper bound on the requested operations and resources;
  4. Subset Definition: The type SHOULD define what it means for one instance to be a subset of another, to support progressive narrowing in Token Exchange (Section 8).

3.1. transaction_authority

The transaction_authority authorization data type defines transaction boundaries within which an agent is permitted to operate, carried within authorization_details. When approved by the Authorization Server, the schema instance is bound to the access token and verified by the Resource Server at runtime.

3.1.1. Type Definition

Type Name:
transaction_authority
Data Type:
Object
Usage:
authorization_details (RFC 9396)

3.1.2. Structure

The following example shows the authorization_details request parameter containing a transaction_authority instance for an e-commerce transaction:

{
  "authorization_details": [
    {
      "type": "transaction_authority",
      "domain": "ecommerce",
      "transaction_id": "urn:uuid:txn-abc-123",
      "boundary": {
        "total_amount_limit": { "value": 50, "currency": "USD" },
        "operations": ["ecommerce.search", "ecommerce.cart.add"],
        "category": ["apparel"],
        "merchant": ["https://shop.example"],
        "time_window": {
          "start": "2026-08-20T00:00:00Z",
          "end": "2026-08-21T00:00:00Z"
        }
      },
      "subset_rule": "strict",
      "actions": ["search", "cart.add"],
      "locations": ["https://api.shop.example"]
    }
  ]
}
Figure 1

In addition to the common fields defined in RFC 9396 Section 2 (such as actions, locations, datatypes, and identifier), the transaction_authority authorization data type defines the following type-specific fields:

domain:
REQUIRED. A string identifying the application domain the schema instance applies to (e.g., "ecommerce").
transaction_id:
OPTIONAL. An identifier for the transaction the instance governs. When used together with the authorization evidence mechanism ([I-D.liu-oauth-authorization-evidence]), the transaction_id correlates the approved instance with the corresponding consent record.
boundary:

REQUIRED. An object containing the transaction boundary constraints. All fields are OPTIONAL; only behaviors consistent with every present constraint are permitted:

total_amount_limit:
An object with value (number) and currency (string) members. The aggregate amount of the agent's transactions MUST NOT exceed value in the given currency.
operations:
An array of namespaced operation identifiers (e.g., "ecommerce.cart.add"). Only the listed operations are permitted.
category:
An array of product category identifiers the agent is permitted to operate on.
merchant:
An array of merchant URIs the agent is permitted to interact with.
time_window:
An object with start and end members, each a timestamp per RFC 3339. Only behaviors occurring within the window are permitted.
subset_rule:
OPTIONAL. Controls progressive narrowing in Token Exchange (Section 8). The value "strict" (the default) requires a derived instance to be a subset of the original instance; the value "loose" permits the Authorization Server to apply its own review policies when deriving instances.
context:
OPTIONAL. An object providing additional structured data for behavior verification at resource access time (see Section 3.3).

The common RAR fields and the boundary constraints serve different consumers at different stages of the authorization flow. The common fields (actions, locations) provide a declarative upper bound on the requested operations and resources, enabling the Authorization Server to approve or reject the request without interpreting the boundary constraints. The boundary constraints define the behavioral limits that the Resource Server verifies against each agent behavior at runtime. This layered design allows Authorization Server implementations to review requests declaratively, while the Resource Server performs per-behavior verification through deterministic constraint evaluation.

The AS SHOULD verify that the boundary constraints are consistent with the common fields (Section 6). The Resource Server bears responsibility for ensuring each verified behavior is consistent with the approved schema instance at runtime.

Additional constraint fields and additional domain-specific authorization schemas are expected to be registered through future revisions and follow-up specifications.

3.1.3. Schema Instance Requirements

Schema instances used with this specification MUST adhere to the following requirements:

  1. Schema Conformance: Every instance MUST validate against the definition of the schema it instantiates. Unknown fields not defined by the schema MUST be rejected by the Authorization Server.
  2. Constraint Values: Constraint values MUST be within the ranges and formats defined by the schema (e.g., monetary amounts as numbers with an ISO 4217 currency, timestamps per RFC 3339).
  3. Deny by Default: An instance constrains behavior only through its present fields. Any behavior not consistent with every present constraint is denied; an empty or absent boundary grants no behavior (Section 7).

Because instances are structured data rather than executable code, verification at the Resource Server is deterministic constraint evaluation. No policy engine or policy language runtime is required at the Resource Server. Policy languages, where used at all, are confined to the Authorization Server's internal review of instances (Appendix A).

3.2. schema_ref Claim

The schema_ref claim is an OPTIONAL shorthand mechanism for referencing an approved schema instance in access tokens. When the AS uses Rich Authorization Requests (RAR), the enriched authorization_details array in the access token (per RFC 9396 Section 7.1) is the primary mechanism for carrying the approved schema instance. The schema_ref claim MAY be used as a lightweight alternative when:

  • The inline instance content would make the access token exceed practical size limits (see Section 9);
  • The Resource Server already has a cached copy of the instance and only needs an identifier to look it up;
  • The deployment uses opaque (non-JWT) access tokens where token introspection [RFC7662] provides the instance content.

When schema_ref is used, the AS performs instance registration as described in Section 6.

3.2.1. Claim Definition

Claim Name:
schema_ref
Claim Type:
String
Usage:
JWT access tokens (the claim may also appear in introspection responses for opaque tokens per [RFC7662])

3.2.2. Structure

The schema_ref claim value is a string containing the unique instance identifier assigned by the Authorization Server during instance registration.

{
  "iss": "https://as.example.com",
  "sub": "agent-xyz",
  "schema_ref": "schema-instance-abc123"
}
Figure 2

The Resource Server uses this identifier to look up the full approved instance from a local cache or via token introspection ([RFC7662]).

3.3. Schema Context

The context field within a schema instance provides additional structured data that the client wishes to include at authorization request time. Typical context data includes:

  • User identity: the principal on whose behalf the agent operates (e.g., user ID, organizational role);
  • Execution environment: runtime conditions such as source IP address, machine identifier, or network segment from which the request originates.

The verification data used for constraint evaluation at the Resource Server is assembled by the Resource Server and is not limited to the context field. When the Resource Server assembles verification data, it SHOULD keep the context data under a distinct context key to avoid key collisions with other data categories.

The specific verification data structure is determined by bilateral agreement between the client and the resource server, typically documented in developer integration guides.

4. Protocol Flow

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   |                |
    |<--------------------------------|
Figure 3: Schema Binding Flow

4.1. Step Details

  1. Authorization Request: The authorization request includes 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.
  2. Instance Validation: AS validates that the instance conforms to the definition of the declared schema (see Section 6).
  3. Review and Approval: AS determines whether the proposed behavioral boundaries are appropriate for the specific client and resource owner, based on client registration metadata, organizational review policies, resource owner consent, and token binding context (see Section 6). The AS does not perform per-behavior verification (which occurs at the Resource Server).
  4. Token Binding: AS issues an access token with enriched 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.
  5. Behavior Execution: Client (agent) presents the token to the Resource Server when performing a behavior.
  6. Instance Extraction: RS extracts the approved schema instance from the enriched authorization_details in the access token.
  7. Behavior Verification: The RS verifies the agent's current behavior (action, target resource, context) against the boundary constraints of the approved instance through deterministic constraint evaluation. No policy engine is required.
  8. Enforcement: RS enforces the per-behavior decision, allowing or denying the agent's action.
  9. Response: RS returns the result to the client.

5. Reverse-Guided Authorization

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.

5.1. Error Response Format

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.

HTTP/1.1 403 Forbidden
Content-Type: application/json
WWW-Authenticate: Bearer error="insufficient_authorization",
  schema_profile="eyJwcm9maWxlX3VyaSI6Imh0dHBzOi8vcmVzb3VyY2UuZXhhbXBsZS9..."

{
  "error": "insufficient_authorization",
  "error_description": "Additional authorization required"
}
Figure 4: Reverse-Guided Authorization Error Response

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"
}
Figure 5: Decoded schema_profile

5.2. Relationship to insufficient_scope

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.

5.3. Schema Profile Structure

The schema_profile object contains the following fields:

profile_uri:
OPTIONAL. URI identifying the authorization profile for this resource. This URI is an opaque identifier that the agent MUST NOT dereference programmatically to derive authorization requirements. The resource server and intermediaries MAY use it as a cache key or audit reference. If the URI is resolvable, the retrieved document is intended for human consumption (e.g., developer documentation) and MUST NOT be parsed by the agent as part of the authorization flow.
required_scope:
OPTIONAL. Array of scope values that the access token MUST include.
required_claims:
OPTIONAL. Array of attribute names (e.g., 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.
constraints:
OPTIONAL. Object defining boundary constraint descriptors that MUST be satisfied. Each key is a constraint name; the value is an object with the following descriptors: type (data type), description (human-readable explanation), enum (allowed values), and required (boolean, whether the constraint must be provided).
confirmation_required:
OPTIONAL. Boolean indicating whether explicit user authorization is required for the requested behavioral boundaries. If true, the agent MUST initiate an OAuth authorization flow to obtain the resource owner's explicit consent for the submitted schema instance. This does not mean local user confirmation (e.g., a modal dialog) is sufficient; the authorization must be obtained through the AS to produce a token with appropriate grants. The specific interaction mechanism depends on the OAuth flow in use (e.g., the 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).
auth_server:
REQUIRED. Identifier of the authorization server capable of issuing tokens that satisfy these requirements. The agent can discover the token endpoint and other metadata via OAuth 2.0 Authorization Server Metadata ([RFC8414]) or OAuth 2.0 Protected Resource Metadata ([RFC9728]) using this identifier.

5.4. Agent Adaptive Behavior

Upon receiving a reverse-guided authorization response, the AI agent SHOULD:

  1. Parse the schema_profile to understand authorization requirements.
  2. Verify that the specified auth_server is trusted before proceeding.
  3. Construct a new authorization request including required scopes, a schema instance that satisfies the constraints specified in the schema_profile, and any additional parameters required by the resource server.
  4. If confirmation_required is true, initiate user consent flow.
  5. Discover the token endpoint via the 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.

5.5. Security Considerations

Security considerations specific to reverse-guided authorization, including auth server verification and constraint validation, are described in Section 9.

6. Authorization Server Processing

6.1. Instance Validation

Upon receiving an authorization_details request containing a domain-specific schema instance, the AS MUST perform the following validation steps:

  1. Type Check: Verify that the type field identifies a domain-specific authorization schema known to the AS (e.g., transaction_authority, Section 3.1).
  2. Schema Conformance: Validate the instance against the definition of the declared schema, including required fields, value types, and formats. Unknown fields not defined by the schema MUST be rejected.
  3. Constraint Values: Verify that constraint values are within the ranges and formats defined by the schema (e.g., non-negative monetary amounts, well-formed RFC 3339 timestamps with start earlier than end).
  4. Behavioral Boundary Check: Verify that the RAR common fields (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.

6.2. Instance Registration

When the AS issues a schema_ref claim instead of embedding the full approved instance in authorization_details, the AS MUST register the instance:

  1. Assign a unique instance identifier;
  2. Store the approved instance content;
  3. Associate the instance with the authorization session;
  4. Optionally, pre-process the instance for faster verification.

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.

6.3. Error Responses

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:

Table 1: AS Error Taxonomy for Schema Binding
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"
}
Figure 6

6.4. Approval Basis

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:

  • Client registration metadata: Pre-registered client capabilities, allowed scopes, and trust level established during OAuth 2.0 Dynamic Client Registration [RFC7591] or out-of-band provisioning.
  • Organizational review policies: Administrative rules defining which behavioral patterns are permitted for specific client types, user roles, or resource classes within the deployment. These rules are internal to the AS and are never carried in authorization requests or access tokens (Appendix A).
  • Resource owner consent: Explicit authorization from the resource owner approving the submitted behavioral boundaries, obtained through the OAuth 2.0 authorization interaction (e.g., the consent screen in the authorization code flow, or the interaction_uri mechanism in JWT Grant Interaction Response).
  • Token binding context: The authorization grant type, requested scopes, and other token request parameters that establish the context in which the schema instance is reviewed.

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.

6.5. Refresh Token Handling

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.

7. Resource Server Enforcement

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.

7.1. Instance Retrieval

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:

  • Local Cache: Use a cached copy if available and not expired.
  • Introspection: Retrieve the instance content via token introspection [RFC7662].

7.2. Constraint Evaluation

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:

  • The behavior's operation identifier is contained in boundary.operations;
  • The cumulative transaction amount including the current behavior does not exceed boundary.total_amount_limit;
  • The target merchant is contained in boundary.merchant;
  • The current time is within boundary.time_window.

The verification data assembled by the RS for these checks is described in Section 3.3.

7.3. Enforcement Decision

Based on the constraint evaluation:

  • If the behavior is consistent with every present constraint: Allow the behavior;
  • If the behavior violates any present constraint, or if the behavior cannot be mapped to the approved instance: Deny with 403 Forbidden. When the denial results from behavioral drift, the RS MAY apply the reverse-guided mechanism (Section 5) to guide the agent toward a new authorization;
  • If the instance cannot be retrieved or parsed: Deny with 403 Forbidden.

8. Applicability to Different Authorization Flows

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.

8.1. JWT Grant with Interaction Response

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
Figure 7: JWT Grant Request with Schema Binding
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
}
Figure 8: Interaction Required Response

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.

8.2. Client Credentials Grant

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
Figure 9

8.3. Token Exchange (RFC 8693)

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
Figure 10

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.

9. Security Considerations

9.1. Trust Model

The behavioral authorization framework defined in this specification relies on the following trust assumptions, which deployments MUST evaluate before adoption:

  • AS-to-RS trust: The Resource Server trusts the Authorization Server to validate, review, and bind approved schema instances to access tokens. The RS enforces the instance approved by the AS and does not re-evaluate the AS's approval decision at runtime. This trust relationship is consistent with the OAuth 2.0 trust model in which the RS trusts the AS's issuance of access tokens.
  • Client-to-AS trust: The client (agent) trusts the AS to validate its submitted schema instance and issue a token reflecting the approved behavioral boundaries. The client MUST NOT trust instances or profiles received from other parties (including resource servers) without AS approval.
  • AS/RS-to-client distrust: Neither the AS nor the RS trusts the client to act within its approved behavioral boundaries without verification. The AS performs validation and review; the RS performs per-behavior runtime verification.

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:

  • A hard deny list of dangerous or privileged actions that cannot be authorized by any token-bound instance;
  • Rate limiting or transaction caps that apply regardless of the approved instance;
  • Restriction of trusted ASes to a pre-registered allowlist, discoverable via Protected Resource Metadata ([RFC9728]).

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.

9.2. No Executable Content

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.

9.3. Instance Integrity

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).

9.4. Instance Size Limits

Instances embedded inline within authorization_details can increase token request and access token size. Implementations MUST enforce limits on:

  • Maximum instance size (RECOMMENDED limit: 4 KB for inline instances). Note that JWT access tokens are typically carried in HTTP Authorization headers, where many proxies and load balancers enforce an 8 KB total header size limit;
  • Maximum instance complexity (e.g., nesting depth, number of constraint entries);
  • Total authorization_details payload size in token requests.

For instances exceeding these limits, clients SHOULD use pre-registered instances referenced via schema_ref rather than inline instance content.

9.5. Reverse-Guided Authorization

Implementations of reverse-guided authorization (Section 5) MUST consider the following security aspects:

  • Auth Server Verification: Agents MUST verify that the 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.
  • Constraint Validation: Agents SHOULD validate that constraint values are reasonable before including them in authorization requests. Malicious resource servers might attempt to induce agents to request excessive permissions.

All communications in the reverse-guided flow MUST use TLS to prevent man-in-the-middle attacks on error responses.

10. Privacy Considerations

Implementations of this specification MUST consider the following privacy aspects per BCP 188 [RFC6973]:

11. IANA Considerations

11.1. RAR Authorization Data Type Registration

This specification defines the following authorization data type for use with the authorization_details parameter defined in RFC 9396:

Type Name:
transaction_authority
Description:
A domain-specific authorization schema instance defining transaction behavioral boundaries (amount limits, permitted operations, categories, merchants, and time windows) for per-behavior authorization verification.
Change Controller:
IETF
Specification Document:
Section 3.1 of this document

11.2. Domain-Specific Authorization Schema Types Registry

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:

  1. The proposed type identifier is syntactically valid (lowercase ASCII string with optional underscore separators, no spaces, no leading or trailing whitespace);
  2. The referenced specification defines a complete schema: the full set of fields, their types and formats, which fields are required, deny-by-default semantics, and subset semantics for use in Token Exchange, consistent with the framework requirements defined in Section 3;
  3. The schema carries structured data only and defines no executable content;
  4. The identifier does not conflict with or confusingly resemble existing registrations;
  5. The change controller is clearly identified and reachable for future maintenance of the registration.

The initial registry contents are:

Table 2: Initial Domain-Specific Authorization Schema Types Registry Contents
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:

  • Type identifier (lowercase ASCII string, no spaces);
  • Description of the schema and its intended domain;
  • Reference to the specification defining the schema;
  • Change controller.

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.

11.3. JWT Access Token Claims Registration

This specification registers the following claim in the "JWT Access Token JWT Claims" registry established by [RFC9068]:

Claim Name:
schema_ref
Claim Description:
A reference to a registered, approved schema instance in JWT access tokens.
Change Controller:
IETF
Specification Document:
Section 3.2 of this document

11.4. OAuth 2.0 Bearer Token Error Values Registration

This specification registers the following error code in the "OAuth 2.0 Bearer Token Error Values" registry established by [RFC6750]:

Name:
insufficient_authorization
Error Usage Location:
Resource server error response using the WWW-Authenticate header per [RFC6750].
Related Error Codes:
The existing 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.
Reference:
Section 5 of this document

11.5. WWW-Authenticate Parameter Definition

This specification defines a new parameter for use in the WWW-Authenticate header field with the Bearer authentication scheme, as defined in [RFC6750].

Parameter Name:
schema_profile
Parameter Usage Location:
WWW-Authenticate response header field, used in resource server error responses per [RFC6750] Section 3.
Parameter Description:
A base64url-encoded JSON object containing structured boundary constraint descriptors and authorization requirements that guide the client toward obtaining sufficient authorization. The structure is defined in Section 5 of this document.
Change Controller:
IETF
Specification Document:
Section 5 of this document

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.

12. References

12.1. Normative References

[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 8126, DOI 10.17487/RFC8126, , <https://www.rfc-editor.org/info/rfc8126>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC4648]
Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, , <https://www.rfc-editor.org/info/rfc4648>.
[RFC6749]
Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", RFC 6749, DOI 10.17487/RFC6749, , <https://www.rfc-editor.org/info/rfc6749>.
[RFC6750]
Jones, M. and D. Hardt, "The OAuth 2.0 Authorization Framework: Bearer Token Usage", RFC 6750, DOI 10.17487/RFC6750, , <https://www.rfc-editor.org/info/rfc6750>.
[RFC6973]
Cooper, A., Tschofenig, H., Aboba, B., Peterson, J., Morris, J., Hansen, M., and R. Smith, "Privacy Considerations for Internet Protocols", RFC 6973, DOI 10.17487/RFC6973, , <https://www.rfc-editor.org/info/rfc6973>.
[RFC7519]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/info/rfc7519>.
[RFC9068]
Bertocci, V., "JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens", RFC 9068, DOI 10.17487/RFC9068, , <https://www.rfc-editor.org/info/rfc9068>.
[RFC9396]
Lodderstedt, T., Richer, J., and B. Campbell, "OAuth 2.0 Rich Authorization Requests", RFC 9396, DOI 10.17487/RFC9396, , <https://www.rfc-editor.org/info/rfc9396>.

12.2. Informative References

[RFC8414]
Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 Authorization Server Metadata", RFC 8414, DOI 10.17487/RFC8414, , <https://www.rfc-editor.org/info/rfc8414>.
[RFC9728]
Jones, M.B., Hunt, P., and A. Parecki, "OAuth 2.0 Protected Resource Metadata", RFC 9728, DOI 10.17487/RFC9728, , <https://www.rfc-editor.org/info/rfc9728>.
[RFC8693]
Jones, M., Nadalin, A., Campbell, B., Ed., Bradley, J., and C. Mortimore, "OAuth 2.0 Token Exchange", RFC 8693, DOI 10.17487/RFC8693, , <https://www.rfc-editor.org/info/rfc8693>.
[RFC7662]
Richer, J., Ed., "OAuth 2.0 Token Introspection", RFC 7662, DOI 10.17487/RFC7662, , <https://www.rfc-editor.org/info/rfc7662>.
[RFC7591]
Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and P. Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", RFC 7591, DOI 10.17487/RFC7591, , <https://www.rfc-editor.org/info/rfc7591>.
[I-D.parecki-oauth-jwt-grant-interaction-response]
Parecki, A., Campbell, B., and D. Liu, "JWT Authorization Grant Interaction Response", Work in Progress, Internet-Draft, draft-parecki-oauth-jwt-grant-interaction-response-00, , <https://datatracker.ietf.org/doc/html/draft-parecki-oauth-jwt-grant-interaction-response-00>.
[OPA]
Cloud Native Computing Foundation, "Open Policy Agent", , <https://www.openpolicyagent.org/>.
[Rego]
Open Policy Agent, "Rego Policy Language", , <https://www.openpolicyagent.org/docs/latest/policy-language/>.
[I-D.liu-oauth-chain-delegation]
Liu, D., Zhu, H., Krishnan, S., and A. Parecki, "Delegation Chain for OAuth 2.0", Work in Progress, Internet-Draft, draft-liu-oauth-chain-delegation, , <https://datatracker.ietf.org/doc/html/draft-liu-oauth-chain-delegation>.
[I-D.liu-oauth-authorization-evidence]
Liu, D., Zhu, H., Krishnan, S., and A. Parecki, "Authorization Evidence and Audit Trail for OAuth 2.0 Access Tokens", Work in Progress, Internet-Draft, draft-liu-oauth-authorization-evidence, , <https://datatracker.ietf.org/doc/html/draft-liu-oauth-authorization-evidence>.

Appendix A. AS-Side Policy Review

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).

A.1. Scope of AS Review Policies

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).

A.2. Example: Rego Review Policy

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
  )
}
Figure 11

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.

Appendix B. Example Schema Instances

B.1. Amount-Limited Transaction

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"]
}
Figure 12

B.2. Time-Window Authorization

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"]
}
Figure 13

B.3. Merchant- and Category-Restricted Authority

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"]
}
Figure 14

Acknowledgments

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.

Authors' Addresses

Dapeng Liu
Alibaba Group
Hongru Zhu
Alibaba Group
Suresh Krishnan
Cisco
Hui Xue
Alibaba Group