| Internet-Draft | AI Agent Authorization | March 2026 |
| Liu, et al. | Expires 18 September 2026 | [Page] |
This document describes how to integrate multiple OAuth 2.0 extensions to enable secure authorization for AI agents acting on behalf of users. It combines cross-domain identity, policy-based authorization, user consent evidence, and multi-hop delegation into a cohesive framework for autonomous agent authorization.¶
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 18 September 2026.¶
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 increasingly need to access protected resources on behalf of users across different trust domains. Traditional OAuth 2.0 provides basic delegation mechanisms, but AI agent scenarios require additional capabilities:¶
This document describes how to combine several OAuth 2.0 extensions into an integrated framework for AI agent authorization. It does not define new protocol mechanisms, but rather profiles existing specifications for this use case.¶
Two key design principles guide this framework:¶
This framework integrates the following specifications:¶
| Component | Specification | Purpose |
|---|---|---|
| Agent Authentication | draft-ietf-oauth-spiffe-client-auth | Agent workload identity via SPIFFE/WIT-SVID |
| User Identity | draft-liu-oauth-cross-domain-id-token-hint | Cross-domain user identity assertion |
| Policy Authorization | draft-liu-oauth-rego-policy | Fine-grained Rego policy support |
| Consent Evidence | draft-liu-oauth-authorization-evidence | User confirmation records |
| Multi-hop Delegation | draft-liu-oauth-chain-delegation | Agent-to-agent delegation chains |
+------------------+ +------------------+ +------------------+
| Home IdP | | AI Agent | | External AS |
| | | | | |
| - User authn | | - SPIFFE identity| | - Policy engine |
| - ID Token issue | | - PAR client | | - Token issuance |
+------------------+ +------------------+ +------------------+
| | |
| ID Token | |
|----------------------->| |
| | |
| | PAR + id_token_hint |
| |----------------------->|
| | |
| | Access Token |
| |<-----------------------|
| | |
| | +------------------+
| | | Resource Server |
| | | |
| | API Request | - Token validation|
| |---------------->| - OPA enforcement |
| | +------------------+
The framework uses JWT access tokens following OAuth 2.0 standards. Key claim semantics:¶
sub (Subject): MUST contain the user's
identifier at the Resource Application (third-party app), NOT the
Agent's internal user identifier. This enables the Resource Server
to immediately identify the resource owner without additional
identity mapping lookups. The AS extracts this value from the
third_party_binding.user_id claim in the
id_token_hint.¶
act (Actor): Identifies the entity
exercising delegated authority. Contains:¶
{
// Standard OAuth claims
"iss": "https://as.external.example",
"sub": "user_12345", // Resource App user ID
"aud": "https://api.external.example",
"exp": 1731369540,
"iat": 1731320700,
"jti": "urn:uuid:token-abc-123",
// Actor claim (RFC 8693) - identifies the agent acting on behalf of the user
"act": {
"sub": "wit://agent.example/sha256.abc123...",
"agent_user_id": "agent_user_001" // Optional: for agent-side audit
},
// Policy reference
"policy_ref": {
"id": "policy-abc123",
"endpoint": "https://as.external.example/policies/..."
},
// User consent evidence
"evidence": {
"id": "evidence-xyz",
"user_confirmation": { ... },
"as_signature": "..."
},
// Semantic traceability
"audit_trail": {
"evidence_ref": "evidence-xyz",
"semantic_expansion_level": "medium"
},
// Delegation chain (if delegated)
"delegation_chain": [ ... ]
}
+-------+ +-------+ +--------+ +-------+ +-------+ +-----+
| User | | Home | | AI | |External | RS | | OPA |
| | | IdP | | Agent | | AS | | | | |
+-------+ +-------+ +--------+ +-------+ +-------+ +-----+
| | | | | |
(1) | Authn | | | | |
|----------->| | | | |
| | | | | |
(2) | ID Token (aud=agent) | | | |
|<-------------------------> | | |
| | | | | |
(3) | | Agent builds PAR: | | |
| | - id_token_hint | | |
| | - policy_proposal | | |
| | - policy_context | | |
| | | | | |
(4) | | PAR Request | | |
| | + SPIFFE client auth | | |
| | |----------->| | |
| | | | | |
(5) | | | Validate: | | |
| | | - SPIFFE | | |
| | | - ID Token| | |
| | | - aud bind| | |
| | | - policy | | |
| | | | | |
(6) | Consent UI (via redirect or CIBA) | | |
|<-------------------------------------| | |
| | | | | |
(7) | User confirms | | | |
|------------------------------------->| | |
| | | | | |
(8) | | | Issue token with: | |
| | | - act | |
| | | - policy_ref | |
| | | - evidence | |
| | |<-----------| | |
| | | | | |
(9) | | | API Request| | |
| | |------------------------>| |
| | | | | |
(10)| | | | Validate | |
| | | | token | |
| | | | | |
(11)| | | | Policy | |
| | | | eval |---------->|
| | | | | |
(12)| | | | Decision | |
| | | | |<----------|
| | | | | |
(13)| | | Response | | |
| | |<------------------------| |
User Authentication at Agent: User authenticates with the Agent's Identity Provider (IdP). The Agent's IdP issues an ID Token containing:¶
sub: The user's identifier at the Agent system
(e.g., agent_user_001);¶
aud: The agent's SPIFFE ID, binding this token
to the specific agent;¶
third_party_binding (OPTIONAL): If the user has
completed OAuth login with a third-party Resource Application
(e.g., shop.example), this claim asserts the user's identity
at that application (e.g., user_12345). This enables
lazy binding scenarios where users authenticate with third-party
apps on-demand rather than pre-registering.¶
ID Token as id_token_hint: The Agent uses
this ID Token as the id_token_hint parameter in the PAR
request. The AS validates the Agent IdP's signature and extracts
the user's Resource Application identity from the
third_party_binding claim if present.¶
PAR Construction: Agent builds a PAR request including:¶
PAR Submission: Agent sends PAR to External AS with SPIFFE client authentication (WIT-SVID in headers).¶
AS Validation: AS validates:¶
User Consent: AS presents consent UI showing the interpreted operation (redirect or CIBA push).¶
User Confirmation: User reviews and approves the operation.¶
Token Issuance: AS issues access token containing:¶
API Request: Agent presents token to Resource Server.¶
Token Validation: RS validates token signature and claims.¶
Policy Evaluation: RS sends policy and request context to OPA.¶
Authorization Decision: OPA returns allow/deny decision.¶
Response: RS executes (or denies) the operation and returns response.¶
When Agent A needs to delegate operations to Agent B, the framework extends the basic workflow:¶
+---------+ +---------+ +--------+ +---------+
| Agent A | | AS | | Agent B| | RS |
+---------+ +---------+ +--------+ +---------+
| | | |
| (has token) | | |
| | | |
| Delegation PAR | | |
| - subject_token | | |
| - Agent B creds | | |
| - sub-scope | | |
|---------------->| | |
| | | |
| | Validate: | |
| | - Token A valid | |
| | - Scope subset | |
| | - Agent B auth | |
| | | |
| | Issue Token B | |
| | with delegation_chain |
| |---------------->| |
| | | |
| | | API Request |
| | |--------------->|
| | | |
| | | Validate |
| | | chain |
| | | |
| | | Response |
| | |<---------------|
The resulting token for Agent B includes a delegation_chain
recording the delegation hop, as defined in
draft-liu-oauth-chain-delegation.¶
The framework supports multiple consent mechanisms:¶
Traditional OAuth redirect flow where the agent redirects the user to the AS's consent page.¶
Client-Initiated Backchannel Authentication (CIBA) for out-of-band consent, useful when the agent cannot redirect the user.¶
When the user has a valid, non-expired ID Token and the agent's identity is already trusted, the AS MAY skip re-authentication and only prompt for consent to the specific operation.¶
The AOA framework supports progressive deployment through a two-dimensional matrix, allowing organizations to adopt capabilities gradually based on their security requirements and operational maturity.¶
Implementations MAY deploy agent identity at three progressive levels:¶
The agent generates its own key pair and self-issues identity assertions. Suitable for development, testing, and low-trust scenarios such as personal or small-team agents.¶
The agent obtains workload identity tokens through WIMSE infrastructure. Provides cross-domain verifiability without requiring full enterprise IdP deployment. This level can be enhanced with optional trusted execution environment verification using WIT Attestation.¶
The agent's identity is managed by an enterprise IdP with full X.509 or SAML/OIDC trust chains. Required for high-assurance enterprise deployments.¶
Authorization tokens can be deployed at three levels:¶
Static tokens configured at deployment time. No runtime AS interaction required. Suitable for internal services and well-known agents.¶
Tokens assigned by administrators through a management interface. Policy binding without end-user consent. Suitable for enterprise automation scenarios.¶
Full AOA flow with user consent, policy evaluation, and evidence recording. Required for high-sensitivity operations and cross-domain access. This level utilizes the JWT Grant Interaction Response mechanism for user consent.¶
The combination of identity and token levels creates a deployment matrix:¶
| Identity \ Token | A (Pre-configured) | B (Admin-assigned) | C (Runtime AOA) |
|---|---|---|---|
| 0 (Self-Issued) | Personal agents, IoT | Small team automation | Dynamic authorization |
| 1 (WIMSE) | Trusted lightweight agents | Enterprise operations | Cross-domain access |
| 2 (Enterprise) | High-trust static auth | Compliance scenarios | Full AOA enterprise |
Organizations typically progress through the matrix as their requirements evolve, starting from lower levels (e.g., 0A) and upgrading to higher levels (e.g., 2C) based on security needs.¶
Traditional OAuth error responses indicate authorization failure without guidance on how to obtain valid authorization. In AI agent scenarios, where agents may autonomously navigate authorization requirements, resource servers can provide structured guidance through error responses.¶
When an agent's request lacks sufficient authorization, the resource
server returns a 403 Forbidden response with a rego_profile
object that specifies:¶
The AI agent parses this guidance and constructs a new authorization request that satisfies the specified requirements. This enables agents to "learn" authorization requirements dynamically rather than requiring pre-programmed knowledge of each resource server's policies.¶
Detailed specification of the Rego Profile format and agent adaptive behavior is defined in draft-liu-oauth-rego-policy.¶
The framework establishes clear trust boundaries:¶
| Threat | Mitigation |
|---|---|
| Token substitution | Audience binding (id_token_hint.aud == agent ID) |
| Privilege escalation | Scope subset validation in delegation |
| Unauthorized actions | OPA policy enforcement at RS |
| Consent forgery | AS-signed evidence records |
| Delegation chain tampering | AS signature on each chain entry |
This framework assumes the agent implementation (including authorization logic) is trusted, while the Large Language Model (LLM) used to derive operations is NOT trusted. The policy-based authorization ensures:¶
This section clarifies the relationship between this framework and other OAuth 2.0 specifications. Understanding these relationships is essential for implementers to determine which specifications are required for their specific use cases.¶
This framework extends the Identity Assertion Authorization Grant ([I-D.ietf-oauth-identity-assertion-authz-grant]) by adding explicit user consent through the confirmation URL mechanism. While ID-JAG focuses on service-to-service scenarios where the requesting client already has user authorization, this framework addresses user-to-agent scenarios requiring explicit consent.¶
Key differences:¶
Implementations of this framework MUST implement ID-JAG as the base grant type.¶
This framework uses Token Exchange ([RFC8693]) as the base
delegation mechanism and extends it with the delegation_chain claim
for complete auditability. While RFC 8693 provides point-to-point token
exchange, this framework enables end-to-end delegation chain tracking.¶
Key extensions:¶
delegation_chain claim records all delegation hops with
cryptographic signatures;¶
Implementations MUST support RFC 8693 for token exchange operations and MAY implement the delegation chain extension for multi-hop scenarios.¶
Transaction Tokens (draft-ietf-oauth-transaction-tokens) focus on short-lived service-to-service authorization in microservices architectures. This framework focuses on longer-lived user-to-agent delegation with explicit human consent.¶
Comparison:¶
| Aspect | Transaction Tokens | AOA Framework |
|---|---|---|
| Primary use case | Service-to-service | User-to-agent |
| Human consent | Not required | Required |
| Token lifetime | Minutes | Hours to days |
| Authorization model | Capability-based | Policy-based |
The two specifications can be combined: AOA for initial user authorization, Transaction Tokens for subsequent service-to-service calls within the authorized scope.¶
This framework profiles the OpenID Connect Client-Initiated Backchannel Authentication (CIBA) specification for out-of-band user consent. While CIBA focuses on user authentication, this framework uses it for authorization and consent collection.¶
CIBA is used in this framework for:¶
The framework extends CIBA by adding policy presentation to the consent interface and evidence recording of the consent decision.¶
Rich Authorization Requests ([RFC9396]) provide a structured JSON format for authorization requests. This framework uses the Rego policy language instead of RAR for authorization requests.¶
Rationale for using Rego:¶
Implementations MAY support RAR as an alternative to Rego for simpler scenarios, but Rego is RECOMMENDED for AI agent authorization.¶
This framework uses OAuth SPIFFE Client Authentication ([I-D.ietf-oauth-spiffe-client-auth]) for agent authentication. SPIFFE provides workload identity through WIT-SVID (Workload Identity Token with SPIFFE Verifiable Identity Document).¶
The relationship is:¶
Implementations MUST support SPIFFE Client Authentication for agent identification.¶
The following table summarizes the implementation requirements for different components of this framework:¶
| Specification | Requirement Level | Component |
|---|---|---|
| OAuth 2.0 (RFC 6749) | MUST | All |
| PAR (RFC 9126) | MUST | All |
| ID-JAG | MUST | All |
| SPIFFE Client Auth | MUST | Agent, AS |
| Cross-Domain ID Token Hint | MUST | Agent, AS |
| Rego Policy | SHOULD | Agent, AS, RS |
| Authorization Evidence | SHOULD | AS, RS |
| Chain Delegation | MAY | AS (if supporting delegation) |
| Token Exchange (RFC 8693) | SHOULD | AS |
| CIBA | MAY | AS (if supporting out-of-band consent) |
This document has no IANA actions. All claims and parameters are defined in the referenced component specifications.¶
POST /par HTTP/1.1
Host: as.shop.example
Content-Type: application/x-www-form-urlencoded
OAuth-Client-Attestation: eyJ0eXAiOiJ3aXQrand0IiwiYWxnIjoiRVMyNTYifQ...
OAuth-Client-Attestation-PoP: eyJ0eXAiOiJvYXV0aC1jbGllbnQtYXR0ZXN0...
client_id=spiffe://myassistant.example/agent
&id_token_hint=eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lkc...
&redirect_uri=https://myassistant.example/callback
&policy_proposal={"type":"rego","content":"package agent...","entry_point":"allow"}
&policy_context={"user":{"id":"user_12345"},"action":"add_to_cart"}
{
"iss": "https://as.shop.example",
"sub": "user_12345", // Third-party app user ID
"aud": "https://api.shop.example",
"exp": 1731369540,
"iat": 1731320700,
"jti": "urn:uuid:token-shop-123",
"act": {
"sub": "wit://myassistant.example/sha256.xyz789...",
"agent_user_id": "agent_user_001" // Optional: correlation at agent side
},
"policy_ref": {
"id": "policy-cart-50",
"endpoint": "https://as.shop.example/policies/policy-cart-50"
},
"evidence": {
"id": "evidence-consent-abc",
"user_confirmation": {
"displayed_content": "Add items under $50 to cart",
"user_action": "confirmed_via_button_click",
"timestamp": 1731320595
},
"as_signature": "eyJhbGciOiJSUzI1NiJ9..."
}
}
The authors would like to thank Brian Campbell for his valuable feedback and insightful discussions on OAuth extension design. His contributions helped shape key aspects of this framework.¶