| Internet-Draft | DAAP | August 2026 |
| Kumar | Expires 3 March 2027 | [Page] |
AI agents increasingly invoke protected APIs on behalf of human users. This document defines an OAuth profile for identifying an agent client instance, obtaining an authenticated user's consent, issuing resource-bound and sender-constrained access tokens, attenuating authority through OAuth Token Exchange, and rotating refresh tokens safely. The profile uses existing OAuth and JOSE mechanisms wherever possible and defines no new JWT claims or OAuth endpoints. Operational facilities such as policy engines, audit stores, budgets, event streams, and credential vaults are outside the interoperable core. Grantex is an incomplete reference implementation and is not required for conformance.¶
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 3 March 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.¶
OAuth deployments already support software acting for users. AI agent deployments add operational pressure because agent instances can be created dynamically, can call high-impact APIs, and can delegate work to other agent instances. These characteristics do not justify replacing OAuth. They do justify a strict profile that removes unsafe choices and makes the acting client, user, resource, and sender key explicit.¶
This document profiles OAuth 2.0 [RFC6749] and the OAuth 2.0 Security Best Current Practice [RFC9700]. It uses pushed authorization requests (PAR) [RFC9126], Proof Key for Code Exchange (PKCE) [RFC7636], resource indicators [RFC8707], JWT access tokens [RFC9068], sender constraints, and OAuth Token Exchange [RFC8693].¶
The term "DAAP" is a convenient name for this profile. It is not a new authorization framework, a new credential format, or a claim that an AI agent is a legal person.¶
This document specifies:¶
security metadata associated with an agent's OAuth client registration;¶
an authorization-code flow with authenticated human consent;¶
resource-bound, sender-constrained JWT access tokens;¶
attenuated delegation using OAuth Token Exchange; and¶
refresh-token rotation requirements, including bounded recovery from a lost successful response.¶
This document does not standardize agent orchestration, model selection, policy languages, payments, budget ledgers, audit storage APIs, event delivery, credential vaults, SCIM, SSO configuration, or vendor deployment endpoints. Those features can be useful, but they require separate specifications and security analysis.¶
Discussion of this document is intended for the OAuth Working Group mailing
list at oauth@ietf.org. The archive is at
https://mailarchive.ietf.org/arch/browse/oauth/.¶
Author contact:¶
Source and issue tracking are maintained at
https://github.com/mishrasanjeev/grantex/tree/main/docs/ietf-draft.¶
Revision -02:¶
narrows the document to an OAuth profile and removes proprietary Grantex endpoint paths from the normative protocol;¶
requires authenticated human consent and prohibits policy automation from impersonating that consent;¶
requires exact redirect URI matching, state, PKCE S256, PAR, and a resource
indicator;¶
requires sender-constrained access and refresh tokens;¶
uses the standard scope, client_id, cnf, and act claims rather than
registering duplicate short claims;¶
defines safety properties for bounded lost-response refresh recovery;¶
makes DID use optional and requires proof of possession for any advertised agent key;¶
moves audit, budget, policy, events, and credential-vault behavior outside the interoperable core; and¶
reports the Grantex implementation as partial rather than conformant.¶
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, as shown here.¶
This document uses the OAuth roles defined by [RFC6749] and the following terms:¶
Software that plans or performs actions. An Agent is not itself an OAuth role.¶
An OAuth client instance that executes agent software. Its OAuth client_id
identifies its registration, not a human or legal identity.¶
The human resource owner whose authority is delegated. A deployment can use a non-human resource owner only when its trust and authorization model is defined outside this profile.¶
An asymmetric key controlled by the Agent Client Instance and used for DPoP or mutual-TLS sender constraint.¶
An access token issued by OAuth Token Exchange whose authority is derived from another token and attenuated in scope, resource, lifetime, or all three.¶
The authorization server is trusted to authenticate the Principal, display an accurate authorization request, enforce registered client metadata, issue tokens, and process revocation. A resource server is trusted to validate tokens and enforce scopes for its own resource identifier.¶
An Agent Client Instance is not trusted merely because a developer registered it or supplied an API key. Developer authentication and Principal authentication are separate security events. A developer credential MUST NOT be accepted as proof that the Principal approved a live authorization request.¶
For a live authorization, the authorization server MUST authenticate the Principal using a method appropriate to the risk of the requested authority. Phishing-resistant authentication is RECOMMENDED for high-impact scopes. Sandbox deployments MAY use test principals and simulated consent when they are clearly isolated from production resources and credentials.¶
An automated policy decision MAY deny, narrow, or require escalation of a request. It MUST NOT replace the Principal's authenticated approval unless a separate, explicitly authorized non-human resource-owner model applies.¶
An Agent Client Instance uses an OAuth client registration. Registration can be provisioned administratively or by a standards-based dynamic registration mechanism; the registration wire protocol is outside this document.¶
The registration MUST bind:¶
one or more exact redirect URIs for authorization-code clients;¶
the resources the client is permitted to request;¶
the scopes the client is permitted to request; and¶
key metadata sufficient to sender-constrain tokens.¶
The authorization server MUST reject redirect URIs containing fragments and MUST apply the redirect URI rules from [RFC9700]. Production web redirect URIs MUST use HTTPS, except for loopback redirects explicitly permitted for native applications.¶
The Agent Key MUST be asymmetric. The registration MUST NOT contain private key parameters. Before treating a key as controlled by an Agent Client Instance, the authorization server MUST verify possession through DPoP [RFC9449], mutual TLS [RFC8705], or another protocol that proves possession of the corresponding private key.¶
A deployment MAY associate an Agent Client Instance with a DID [DID-CORE].
DID support is not required by this profile. If a DID is placed in a token or
shown to a Principal, it MUST resolve to a document that contains the verified
Agent Key or a verifiable delegation to that key. An opaque database identifier
with a did: prefix is not sufficient.¶
Key rotation MUST preserve an auditable relationship between the old and new keys, invalidate future use of the retired key, and avoid silently changing the meaning of already-issued sender-constrained tokens.¶
Authorization servers conforming to this profile issue JWT access tokens [RFC7519] as profiled by [RFC9068]. The JWK Set requirements of [RFC7517], the JOSE requirements of [RFC7518], JWT validation guidance in [RFC8725], and authorization-server metadata in [RFC8414] apply.¶
The authorization server metadata MUST publish a jwks_uri. A JWKS document
alone is not authorization-server metadata and MUST NOT be described as
conformance with [RFC8414].¶
The token MUST contain the claims required by [RFC9068], including iss,
sub, aud, exp, iat, jti, and client_id. Granted scopes MUST use the
standard space-delimited scope claim.¶
aud MUST identify the single resource requested during authorization. Tokens
without the expected audience MUST be rejected by the resource server.¶
The token MUST be sender-constrained:¶
a DPoP-bound token carries the public-key thumbprint in cnf.jkt as defined
by [RFC9449]; or¶
an mTLS-bound token carries the certificate thumbprint in cnf as defined by
[RFC8705].¶
An authorization server MUST NOT emit cnf solely because a public key was
uploaded. It MUST first establish proof of possession. The resource server MUST
verify the DPoP proof or mutual-TLS binding on every protected request.¶
This profile defines no short aliases for scope, client_id, act, or
authorization_details. Private implementation claims MAY be used only under
collision-resistant names and MUST NOT be required for interoperability.¶
A resource server MUST validate at least:¶
an explicitly allowed signature algorithm and a valid signature;¶
iss against the configured authorization server;¶
aud against the resource server's identifier;¶
exp, iat, and any applicable not-before constraint;¶
the required values in scope;¶
the sender constraint represented by cnf; and¶
revocation or token status when the deployment's risk model requires online state.¶
The resource server MUST NOT treat signature verification alone as sufficient authorization.¶
Delegation uses OAuth Token Exchange [RFC8693]. The delegating token is the
subject_token. When an agent or service is acting as a distinct actor, the
authorization server represents that chain using the standard act claim.¶
The authorization server MUST authenticate the requesting client and validate the subject token before exchange. It MUST reject a requested scope that is not contained in the subject token, and it MUST reject a resource that is broader than or inconsistent with the original authorization.¶
A delegated token:¶
MUST NOT expire later than the subject token;¶
MUST be sender-constrained to the receiving Agent Client Instance;¶
MUST use a scope set no broader than the subject token;¶
MUST preserve the Principal as sub unless another specification defines a
subject transition; and¶
MUST represent the current actor and any nested actor chain as specified by [RFC8693].¶
Deployments SHOULD bound delegation depth and SHOULD support revoking all tokens derived from a root authorization. Database parent identifiers and cascade algorithms are implementation details, not JWT claims defined here.¶
Cross-domain delegation should be evaluated against OAuth Identity and Authorization Chaining [I-D.ietf-oauth-identity-chaining] rather than creating an incompatible chain format.¶
Refresh-token handling MUST follow [RFC9700]. Public clients MUST use refresh token rotation or sender-constrained refresh tokens. This profile requires both rotation and sender constraint for Agent Client Instances.¶
On a successful refresh, the authorization server MUST invalidate the presented refresh token and return a new refresh token atomically. The new access token MUST NOT expand the original resource, scope, delegation, sender binding, or grant lifetime.¶
Network failure can occur after the authorization server commits rotation but before the client receives the response. A deployment MAY provide bounded recovery for this case. The transport syntax for a recovery key is an implementation extension and is not part of core conformance.¶
If recovery is provided, all of the following requirements apply:¶
Before its first attempt, the client generates a high-entropy recovery key and persists it with the old refresh token until the response is durable.¶
Every transport retry of that same refresh request uses the same recovery key. A new logical refresh operation uses a new key.¶
The authorization server binds recovery state to the authenticated client, Agent Client Instance, old refresh token, and recovery key.¶
Recovery returns the exact committed access token and rotated refresh token; it MUST NOT mint a new token, extend a lifetime, or rotate again.¶
Recovery is allowed only while the rotated child refresh token is active and unused.¶
The recovery window MUST be short and bounded. This profile RECOMMENDS no more than 300 seconds.¶
A different or missing recovery key, an expired recovery window, or an already-used child token is treated as refresh-token reuse and MUST fail.¶
A server crash before transaction commit leaves the old token unused and the client can retry normally. A crash after commit is the lost-response case above and requires durable recovery state. Implementations MUST test both boundaries.¶
The following topics are intentionally outside core conformance:¶
tamper-evident audit storage and external witnessing;¶
policy decision points and policy languages;¶
financial budgets and atomic debit ledgers;¶
event streams and webhooks;¶
credential vaults;¶
anomaly detection; and¶
enterprise provisioning and SSO configuration.¶
An implementation MUST NOT claim that an operator-signed hash chain is operator-independent evidence. Such a claim requires publication to or countersignature by an independent witness. If JSON records are hashed across implementations, canonicalization should use the JSON Canonicalization Scheme [RFC8785] and SHA-256 should be specified using [RFC6234].¶
Financial constraints should use structured authorization details [RFC9396], including an unambiguous amount representation and currency, rather than a bare numeric JWT claim.¶
Potential extension documents are listed in the source repository. Their presence does not imply IETF submission, adoption, or interoperability.¶
The OAuth threat model and mitigations in [RFC9700] apply. This section calls out agent-specific consequences.¶
A developer API key, policy-engine decision, or agent assertion is not the Principal's consent. Conflating these identities lets the party requesting authority approve its own request. Live consent therefore requires independent Principal authentication and request-bound approval.¶
Bearer tokens are especially hazardous for autonomous software because agents may pass data through tools, logs, prompts, and subprocesses. Resource binding limits where a token can be used; sender constraint limits who can use it. This profile requires both.¶
Accepting an uploaded public key without proof of possession enables an attacker to register somebody else's key or create unusable identities. Authorization servers MUST verify possession and MUST define secure key rotation and recovery procedures.¶
Every delegation hop increases the attack surface. Scope and resource attenuation, bounded lifetime, sender constraint, depth limits, and root revocation SHOULD be enforced together. A textual claim that an agent is a sub-agent is not sufficient.¶
Recovery must not become a replay grace period. Only the same authenticated and request-bound retry can receive the previously committed response. Any other reuse can indicate token theft and SHOULD trigger family revocation or another risk-appropriate incident response.¶
Authorization servers and resource servers MUST NOT log authorization codes, refresh tokens, access tokens, DPoP private keys, PKCE verifiers, recovery keys, or upstream credentials. Security logs SHOULD record enough non-secret context to investigate consent, delegation, refresh reuse, and revocation events.¶
Agent authorization data can reveal a Principal's services, activities, relationships, and intended actions. Implementations SHOULD minimize token claims and consent records, use pairwise subject identifiers where appropriate, and avoid placing personal data in globally resolvable agent documents.¶
Resource indicators and fine-grained scopes can themselves be sensitive. They SHOULD be disclosed only to parties that require them. Audit retention and export must have a defined purpose, access policy, retention period, and deletion process.¶
Delegation chains reveal relationships among services and actors. A resource server should receive only the chain information needed for its authorization decision.¶
This document requests no IANA actions. It uses claims, parameters, endpoints, and confirmation methods defined by existing OAuth and JOSE specifications. Any future wire-level recovery key or agent-specific authorization detail will require separate specification and appropriate registry review.¶
OAuth Identity and Authorization Chaining Across Domains [I-D.ietf-oauth-identity-chaining] addresses identity and authorization continuity across trust domains. Implementations should use that work for cross-domain chains rather than defining private equivalents.¶
OAuth Transaction Tokens address short-lived, purpose-bound tokens for a transaction [I-D.ietf-oauth-transaction-tokens]. They may complement this profile for multi-service call chains; this document does not redefine transaction tokens.¶
The agent authorization use-cases draft [I-D.chen-oauth-agent-authz-use-cases] surveys emerging scenarios and gaps. The multi-agent collaboration draft [I-D.song-oauth-ai-agent-collaborate-authz] explores group authorization. This profile focuses more narrowly on a high-assurance OAuth authorization and delegation baseline and does not claim to supersede either effort.¶
This section follows the intent of [RFC7942] and is expected to be removed before publication as an RFC.¶
Grantex provides an implementation-specific JSON API inspired by this profile.
As of 2026-08-30 it implements exact registered redirects and resources for
profile-aware agents, PKCE S256 checks, live-consent WebAuthn checks,
resource-bound JWTs, key-thumbprint cnf claims, scope attenuation,
refresh-token rotation, and bounded request-bound recovery.¶
It is not yet a conformant implementation of this profile. In particular, its
custom /v1/authorize and /v1/token endpoints are not the standard OAuth
authorization and token endpoints; PAR is not implemented; DPoP proofs are not
validated at protected resources; legacy agent registrations can omit profile
metadata; and live Principal passkey enrollment is not yet anchored in an
independent identity-provider ceremony. The repository's implementation report
tracks these gaps.¶
The author thanks reviewers in the OAuth community whose published work on OAuth security, identity chaining, transaction tokens, and agent authorization helped narrow this document.¶
This appendix is informative. It helps reviewers compare the profile with the Grantex reference implementation; it does not define interoperable endpoints.¶
| Profile operation | Grantex implementation-specific path |
|---|---|
| Agent registration metadata |
POST /v1/agents
|
| Authorization request |
POST /v1/authorize
|
| Principal consent |
POST /v1/consent/{id}/approve
|
| Code exchange |
POST /v1/token
|
| Refresh rotation |
POST /v1/token/refresh
|
| Token status |
POST /v1/tokens/verify
|
| Grant revocation |
DELETE /v1/grants/{id}
|
| Delegation |
POST /v1/grants/delegate
|
| Authorization-server metadata |
GET /.well-known/oauth-authorization-server
|
| Signing keys |
GET /.well-known/jwks.json
|
The implementation transports its refresh recovery key in an
Idempotency-Key HTTP request header. That header use is implementation
specific in this revision and is not required for DAAP core conformance.¶
The following subjects should be developed independently if there is community interest:¶
externally witnessed agent audit checkpoints;¶
financial authorization details and atomic budget settlement;¶
agent delegation lifecycle and cascade revocation profiles; and¶
operational event, policy, and credential-handling interfaces.¶
Separating these topics keeps security assumptions, registries, and consensus boundaries reviewable.¶