| Internet-Draft | Delegated-Auth | July 2026 |
| Li, et al. | Expires 25 January 2027 | [Page] |
This specification defines Delegated Authorization Tokens, key-bound tokens that enable an OAuth client to delegate a constrained subset of its authorization to another client without contacting the authorization server for each delegation. An authorization server issues the root token and binds it to a client key. That client can use the bound key either to prove possession when accessing a protected resource or to sign a further token bound to a delegate client's key. Resource servers validate the ordered token chain, the restrictions imposed at every delegation step, and a DPoP proof signed by the key bound to the leaf token.¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://liuchunchi.github.io/li-oauth-delegated-authorization/draft-li-oauth-delegated-authorization.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-li-oauth-delegated-authorization/.¶
Discussion of this document takes place on the WG Working Group mailing list (mailto:oauth@ietf.org), which is archived at https://datatracker.ietf.org/wg/oauth/about/. Subscribe at https://www.ietf.org/mailman/listinfo/oauth/.¶
Source for this draft and an issue tracker can be found at https://github.com/liuchunchi/li-oauth-delegated-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 25 January 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
OAuth enables a client to obtain authorization to access protected resources. In systems composed of agents, services, and other independently operated components, that client may need to authorize another client to perform only part of the authorized work. Giving the second client the original access token or the original client's private key grants excessive authority and prevents the client from independently constraining each delegation step.¶
This specification defines a key-bound token called a Delegated Authorization Token. An authorization server initially issues such a token to an OAuth client and binds the token to a public key held by that client. The client can then locally issue another Delegated Authorization Token to a delegate client. Each client-issued token is signed with the private key bound to the preceding token, is bound to the delegate client's public key, and can only reduce the authorization conveyed by the preceding chain.¶
A client controlling the private key bound to a Delegated Authorization Token can use the token in either of two ways. It can sign a further token when delegation remains permitted, or it can access a protected resource by presenting the complete token chain together with a DPoP proof [RFC9449]. These uses rely on the same client-held key pair.¶
The mechanism is intended to:¶
let a client delegate authorization without disclosing its private key or a reusable bearer credential;¶
make every delegation cryptographically attributable to the client controlling the key bound to the preceding token;¶
ensure that permissions, audiences, validity periods, and delegation depth can only be narrowed;¶
let a resource server validate a delegation chain without contacting the authorization server for every delegation; and¶
bind protected resource access to the client controlling the key bound to the leaf token.¶
The following non-normative use cases illustrate where local, constrained delegation is useful.¶
An enterprise or individual can use an orchestrator agent that coordinates specialized agents for research, software development, testing, or access to internal knowledge. The authorization server issues a root token to the orchestrator. For each task, the orchestrator issues a child token to the selected agent and limits the token to the resource servers, permissions, and delegation depth needed for that agent's role. A terminal agent can receive a token with max_delegation_depth set to 0.¶
An agent does not thereby inherit all authorization conveyed to the orchestrator, much less all authority associated with the resource owner. For example, a research agent can receive read access to an internal knowledge service without receiving deployment privileges, while a deployment agent can receive access to one environment without receiving access to unrelated data services.¶
The token lifetime can be chosen for the agent's task and operational model, but remains finite and subject to the authorization server's configured maximum. Subject to authorization server policy, a long-running agent can use a token with a longer finite lifetime or periodically obtain a new root token through a supported OAuth grant type. Longer-lived tokens increase the consequences of key compromise and delayed revocation, so deployments using them need correspondingly strong private-key protection and a revocation-status distribution mechanism that meets their response-time requirements.¶
A corporate tenant can authorize a SaaS CRM client to delegate limited CRM-data access to a third-party analytics client. The authorization server issues a root token to the CRM client. The CRM client then issues a child token bound to the analytics client's key, with an audience restricted to the CRM API, read-only permissions, authorization details limiting the accessible data, and max_delegation_depth set to 0.¶
The analytics client presents the complete chain and a DPoP proof to the CRM resource server. It does not receive the CRM client's private key or the CRM client's full authorization, and the authorization server need not participate in each analytics task.¶
This document specifies the token format, authorization server issuance, client-to-client delegation, ordered token-chain presentation and validation, and proof-of-possession access to protected resources.¶
The mechanism does not define how one client discovers another client's public key, how clients negotiate delegation out of band, how multiple Delegated Authorization Token Chains are delivered in one request, how delivered chains are bound to a request or task, the type-specific rules for comparing application-specific authorization details, or how revocation status is distributed to resource servers. These functions are outside the scope of this specification and can be defined by deployment policy or by extending this specification.¶
This specification extends the OAuth 2.0 authorization framework [RFC6749]. It uses the roles, grants, endpoints, and authorization server metadata model established by OAuth 2.0. Deployments apply the requirements of the underlying OAuth 2.0 grant type together with the requirements in this document and the security guidance in [RFC9700].¶
A Delegated Authorization Token is not a bearer token. Its use requires proof of possession of the key bound to the leaf token. This specification uses DPoP for that proof and defines the DA HTTP authentication scheme rather than the Bearer or DPoP schemes. An implementation MUST NOT treat a Delegated Authorization Token as a bearer access token.¶
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 specification uses the terms "authorization server", "client", "resource server", "resource owner", "authorization grant", and "protected resource" as defined by OAuth 2.0 [RFC6749]. It uses "DPoP proof" as defined by [RFC9449].¶
The act by which a delegating client issues a Client-Issued Delegated Authorization Token to a delegate client.¶
A client that holds a Delegated Authorization Token and uses the corresponding private key to issue a Client-Issued Delegated Authorization Token to another client.¶
A client to which a delegating client delegates authorization by issuing a Client-Issued Delegated Authorization Token. It holds the private key corresponding to the cnf.jkt value in that token. A delegate client can subsequently act as a delegating client.¶
A signed JWT that conveys authorization, binds that authorization to a client key using cnf.jkt, and can be used as one element of a Delegated Authorization Token Chain. The token can authorize protected resource access and, subject to max_delegation_depth, further delegation.¶
A Delegated Authorization Token issued and signed by an authorization server. It is the root of a Delegated Authorization Token Chain.¶
A Delegated Authorization Token issued by a delegating client, signed with the private key bound to the preceding token, and bound to the delegate client's key.¶
An ordered sequence containing one Authorization-Server-Issued Delegated Authorization Token followed by zero or more Client-Issued Delegated Authorization Tokens. The sequence is ordered from the root token to the leaf token.¶
The first token in a Delegated Authorization Token Chain. It is issued by the authorization server.¶
The last token in a Delegated Authorization Token Chain. Its cnf.jkt identifies the key whose corresponding private key is used to create a DPoP proof or to issue a further token.¶
A resource server can publish its Delegated Authorization algorithm capabilities using OAuth Protected Resource Metadata as defined by [RFC9728]. The dpop_signing_alg_values_supported parameter defined by [RFC9728] identifies the algorithms accepted by the resource server for DPoP proofs.¶
This specification defines the following protected resource metadata parameter:¶
OPTIONAL. A JSON array containing the JWS alg values accepted by the resource server for Client-Issued Delegated Authorization Token signatures. The array MUST NOT contain none or a symmetric MAC algorithm.¶
A client issuing a Client-Issued Delegated Authorization Token SHOULD select an algorithm listed by every resource server expected to validate the chain. When a chain has multiple intended resource servers, the client selects an algorithm from the intersection of their advertised values or uses an algorithm established through configuration or another authenticated mechanism. If the metadata parameter is omitted, the client MUST NOT infer support for any particular client-issued-token algorithm from the omission alone.¶
A resource server MUST apply its current local algorithm policy when validating a token or DPoP proof. Metadata does not override that policy or by itself require acceptance of a token.¶
DA Authentication Scheme
A client presents a Delegated Authorization Token Chain in the HTTP Authorization field using the DA authentication scheme. The scheme name is followed by one or more SP characters and the Delegated Authorization Token Chain. The chain is a syntactically restricted instance of the token68 form defined by [RFC9110].¶
As specified by [RFC9110], the authentication scheme name is case-insensitive. A request using the DA scheme MUST contain exactly one Authorization field value with exactly one credential. A resource server MUST reject a request containing more than one Authorization field value or a combined field value containing more than one credential.¶
To extract the token chain, the resource server removes the scheme name and the one or more SP characters that immediately follow it. All remaining characters form the Delegated Authorization Token Chain. The chain MUST be non-empty, MUST NOT contain whitespace, and MUST conform to the chain serialization defined in Section 5.6. Leading or trailing whitespace in the chain is invalid.¶
The token-chain value is case-sensitive and MUST appear in the exact root-to-leaf order defined in Section 5.6. The DA scheme MUST be used with a DPoP proof and MUST NOT be used as a bearer authentication scheme.¶
A Delegated Authorization Token MUST NOT be accepted as a bearer token. A client MUST present a Delegated Authorization Token Chain using the DA authentication scheme and MUST include the DPoP proof required by this specification.¶
A resource server receiving a Delegated Authorization Token or Delegated Authorization Token Chain using the Bearer authentication scheme MUST reject the request. It MUST also reject a bearer access token presented using the DA scheme. Validation rules for DA credentials and bearer credentials MUST be mutually exclusive so that a token accepted under one scheme cannot be accepted under the other.¶
An authorization server MUST issue a Delegated Authorization Token with the DA token type and MUST NOT issue the same token value for use as a bearer token. These requirements prevent downgrade to bearer-token semantics and ensure that possession of a serialized Delegated Authorization Token Chain without the leaf private key is insufficient for access.¶
This specification uses the DPoP proof format and validation rules defined by [RFC9449], except for the following substitutions for protected resource requests:¶
the DA authentication scheme defined in Section 9.2 replaces the DPoP authentication scheme;¶
the Delegated Authorization Token Chain replaces the single access token; and¶
the ath claim is computed over the exact Delegated Authorization Token Chain serialization as specified below, rather than over a single access token.¶
All other applicable DPoP proof requirements, including the protected typ and jwk header parameters, signature algorithm requirements, htm, htu, iat, jti, proof freshness, replay detection, and nonce processing, remain unchanged unless this specification explicitly states otherwise.¶
The client creates a DPoP proof using these substitutions. The proof MUST contain htm, htu, iat, jti, and ath, and it MUST be signed with the private key identified by the leaf token's cnf.jkt. The proof includes the corresponding public JWK in its protected header.¶
For this scheme, the ath value is:¶
base64url(SHA-256(ASCII(DA-Token-Chain)))¶
where DA-Token-Chain is the exact character sequence extracted by the parsing procedure in Section 9.2. The scheme name and separating SP characters are not included. The resource server MUST NOT decode, normalize, or reserialize the chain or any token before computing ath. This binds the proof to every token in the chain and to the order of those tokens. DPoP nonce processing follows [RFC9449].¶
A request carries both header fields. For example:¶
A client MUST create a fresh DPoP proof for the target URI and method. It MUST NOT forward a proof created for a different request or use a private key other than the one bound to the leaf token.¶
Upon receiving a DA request, the resource server MUST:¶
parse the authentication scheme and exact chain serialization;¶
validate the Delegated Authorization Token Chain as specified in Section 8;¶
validate the DPoP proof as specified by [RFC9449] and this section;¶
verify that the DPoP proof key matches the leaf token's key binding;¶
verify ath over the exact chain serialization;¶
verify that the effective audience identifies this resource server; and¶
enforce effective scope, authorization details, and local access-control policy.¶
The resource server MUST complete all checks before fulfilling the protected resource request. It MAY cache validation results, subject to token expiration, key rotation, revocation policy, and replay defenses.¶
In addition to the checks required by [RFC9449], the resource server MUST require an asymmetric proof signature, validate htm and htu against the current request, enforce an acceptable proof age, detect replay of jti as required by its policy, and validate a server-provided nonce when one was required.¶
The resource server MUST reject a missing DPoP proof. It MUST NOT accept a DPoP proof as defined by [RFC9449] that was created for a token sent under another authentication scheme unless all requirements of this specification, including the adapted ath, are met.¶
WWW-Authenticate Challenges
A resource server challenges a client to use this scheme by returning a WWW-Authenticate header field with the DA scheme. The challenge MAY include realm, error, error_description, and scope parameters when applicable. Error descriptions are intended for developers and MUST NOT expose sensitive details.¶
For example:¶
When a fresh DPoP nonce is required, the resource server returns an HTTP 401 response containing the DPoP-Nonce header field and a DA challenge whose error parameter is use_dpop_nonce. This adapts the resource server nonce challenge defined by [RFC9449] to the DA authentication scheme.¶
The client MUST create a new DPoP proof containing the nonce and retry the request with the same Delegated Authorization Token Chain. It MUST NOT reuse the rejected DPoP proof.¶
The DA authentication scheme uses the invalid_request, invalid_token, and insufficient_scope error codes defined by [RFC6750], with the adaptations specified in this section. These error codes are carried in a DA challenge; a resource server MUST NOT use the Bearer scheme for a Delegated Authorization Token.¶
invalid_request indicates that the request is missing required authentication information or contains malformed DA credentials or a malformed DPoP proof;¶
invalid_token indicates that the token chain, a signature, key continuity, a time restriction, the audience, or the DPoP binding is invalid; and¶
insufficient_scope indicates that the chain and proof are valid but the effective authorization does not permit the requested operation.¶
A resource server MUST return HTTP 401 for invalid_request and invalid_token. It MUST return HTTP 403 for insufficient_scope. It SHOULD avoid identifying which internal chain element failed, because detailed failures can aid attackers.¶
This specification extends OAuth 2.0 Token Revocation [RFC7009] to accept a complete Delegated Authorization Token Chain. The revocation endpoint advertised by the authorization server accepts the following form parameters:¶
REQUIRED. The exact serialization of a Delegated Authorization Token Chain. The last token in the chain is the token to be revoked. A single-token chain therefore revokes an Authorization-Server-Issued Delegated Authorization Token, while a chain containing two or more tokens can revoke the last Client-Issued Delegated Authorization Token.¶
OPTIONAL. When present, its value SHOULD be the case-sensitive string delegated_authorization_token.¶
The request MUST include a DPoP proof in the DPoP header field. The proof MUST contain htm, htu, iat, jti, and ath. The ath value MUST be:¶
base64url(SHA-256(ASCII(DA-Token-Chain)))¶
where DA-Token-Chain is the exact value of the token parameter after form decoding. The authorization server MUST NOT decode, normalize, or reserialize the chain or any token before computing ath.¶
The request and response otherwise follow [RFC7009]. In particular, the request uses an HTTP POST, the authorization server MUST require TLS, and the endpoint returns an HTTP 200 response for both a successful revocation and an invalid token.¶
Revocation validation establishes the cryptographic provenance and downscoping validity of the target; it does not determine whether the chain is currently usable for protected resource access.¶
Before recording a revocation, the authorization server MUST:¶
parse the exact chain serialization and enforce configured token-count, size, and verification-cost limits;¶
require the root iss to identify that authorization server and validate the root signature using a trusted key;¶
validate the required token types, claim syntax, prohibited claims, and confirmation bindings;¶
validate every client-issued token signature and every adjacent key-continuity relationship;¶
validate delegation depth, permission containment, audience downscoping, and time-claim downscoping; and¶
apply the extension-claim delegation rules required to establish that the chain is valid.¶
The authorization server MUST reject the chain internally if any required cryptographic or downscoping check fails. Consistent with [RFC7009], this failure does not change the external HTTP 200 response. If an authorization detail or extension claim requires containment rules that the authorization server does not implement, it cannot establish a valid chain and MUST NOT record the target as a valid revocation entry.¶
The current time being after an exp value or before an nbf value MUST NOT prevent revocation. Prior revocation of the target or any ancestor MUST NOT cause an error response. The authorization server MAY treat such a request as already effective and need not record redundant descendant state. Audience applicability and authorization for a particular protected resource operation are not evaluated during revocation validation.¶
The authorization server MAY accept a legacy signature algorithm for revocation validation after it has stopped accepting that algorithm for newly issued tokens or protected resource access, provided that the server can still verify it securely. It MUST NOT accept an algorithm whose signature verification is considered unsafe under current policy.¶
The server MUST identify the target using a collision-resistant digest of its exact compact serialization or another unambiguous identifier. It MUST NOT identify a Client-Issued Delegated Authorization Token only by its position, claims, or bound-key thumbprint.¶
Revoking an Authorization-Server-Issued Delegated Authorization Token invalidates every chain rooted in that token. Revoking a Client-Issued Delegated Authorization Token invalidates every chain containing that token, including every chain in which another token has been appended after it. Revocation of one client-issued token does not by itself revoke its parent, its siblings, or another token bound to the same key. An authorization server accepting revocation of a client-issued token MUST retain sufficient status information to recognize that token when it appears at any position in a subsequently evaluated chain.¶
A successful revocation request records revocation state at the authorization server; it does not by itself deliver that state to resource servers performing offline validation. This specification does not define a revocation-status distribution mechanism. Resource servers performing offline validation cannot learn of a revocation until they receive that status through a mechanism defined outside this specification. Short token lifetimes bound exposure when no online or promptly updated status mechanism is available.¶
Delegated Authorization Tokens can reduce authorization server visibility. After issuing the root token, the authorization server need not observe each client-to-client delegation or protected resource request. This prevents the authorization server from automatically learning every delegate client, downstream resource, access time, or multi-hop call pattern.¶
The ordered chain is visible to every resource server to which it is presented. Claims in the root and intermediate tokens can disclose the authorization server, subject, client relationships, audiences, permissions, and workflow structure. Clients SHOULD disclose a chain only to an intended audience, SHOULD minimize claims and chain length, and SHOULD use TLS for every transmission.¶
A stable cnf.jkt, root jti, or other persistent claim can enable correlation across requests and resource servers. Token issuers SHOULD avoid unnecessary identifiers and SHOULD use audience-specific, short-lived child tokens where unlinkability is important. DPoP proofs contain public keys and unique proof identifiers; implementations SHOULD follow the privacy guidance in [RFC9449].¶
Local delegation changes the entities that have audit visibility; it does not eliminate such visibility. Deployments requiring delegation-event records can maintain privacy-conscious logs at delegating clients and resource servers. Such logs MUST be protected because complete chains and authorization details can contain sensitive information.¶
This specification extends the OAuth threat model by allowing clients to issue constrained child tokens. Implementations MUST follow OAuth security best current practice [RFC9700], JSON Web Token best current practice [RFC8725], and the DPoP security considerations in [RFC9449].¶
A client private key authorizes both use of the current leaf token and creation of child tokens when delegation remains available. Clients MUST protect such keys in a manner appropriate to the granted authority, restrict signing operations to authorized code, and erase obsolete keys when operationally possible. Private JWK members MUST never appear in a token or DPoP protected header.¶
Using one key for token issuance and DPoP simplifies continuity but increases the impact of compromise. Implementations SHOULD use non-exportable keys and narrowly scoped signing APIs that distinguish token-signing and proof-signing inputs.¶
An attacker controlling a bound private key can use any unexpired chain ending at that key and can issue child tokens within its effective authorization and delegation depth. Short token lifetimes, finite depth, narrow audiences, minimal permissions, key rotation, and revocation reduce this exposure.¶
Revoking only a child key does not invalidate signatures already created by an uncompromised parent unless the deployment has a revocation mechanism that resource servers consult. Incident response should identify all affected chains and their descendants.¶
A DPoP proof is bound to the HTTP method, target URI, complete chain, and signing key. Resource servers MUST validate those bindings and SHOULD store recently seen jti values for the proof acceptance window. They SHOULD use DPoP nonces where clock skew, pre-generated proofs, or active replay are material threats.¶
Verifiers MUST enforce an allowlist of asymmetric algorithms, ensure algorithm and key-type compatibility, reject none and symmetric MACs, enforce the canonical ECDSA signature requirement in Section 5.2.3, and obtain root verification keys only from trusted authorization server configuration. A token-supplied client JWK is trusted only after its thumbprint is matched to the preceding cnf.jkt; it MUST NOT be treated as an independently trusted identity key.¶
A client-issued token does not contain a parent identifier. Consequently, it can be valid in any chain in which the preceding token binds the same signing key and the effective restrictions of the chain encompass the child token's restrictions. This is an intentional property of the initial format.¶
The DPoP ath over the exact complete chain prevents an attacker from substituting, removing, adding, or reordering tokens in a captured protected resource request without obtaining a new proof from the leaf key. Verifiers MUST validate every adjacent pair and MUST NOT accept an unordered set of tokens.¶
A delegating client that needs a child token to be usable only with one particular parent chain MUST use distinct parent keys or apply an application-specific restriction. Future specifications can define stronger parent binding.¶
The security of local delegation depends on rejecting any expansion of authorization. Verifiers MUST compute effective restrictions from the root in order and fail closed when containment cannot be established. Omission of scope or authorization_details discards that permission component for the child and its descendants; omission of other restrictions has the claim-specific effect defined in this specification.¶
Specifications defining authorization detail types SHOULD define deterministic semantic subset rules. Comparing raw JSON text or merely matching type values is generally insufficient.¶
Every root token has a finite max_delegation_depth, but this does not replace implementation limits. Authorization servers MUST enforce a configured maximum depth, delegating clients SHOULD minimize remaining depth, and every implementation MUST limit chain count and serialized size. Such limits mitigate denial of service from expensive signature and authorization comparisons.¶
Authorization servers MUST set an explicit root audience. A client that explicitly narrows aud in a child SHOULD select the smallest audience set suitable for the delegated task. Resource servers MUST verify that they are an effective audience.¶
Offline validation does not provide prompt revocation by itself. A successful revocation request records state at the authorization server but does not ensure that a resource server has received that state. Deployments requiring prompt revocation MUST use short-lived tokens together with an online or promptly updated status-distribution mechanism defined outside this specification.¶
Revocation endpoints and status-distribution mechanisms can reveal subjects, authorization relationships, and delegation topology. They MUST authenticate authorized participants, protect integrity and confidentiality as applicable, and limit information disclosure.¶
The DPoP proof on a revocation request prevents a party that merely observes a chain, including a resource server, from revoking its target. Authorization servers MUST apply DPoP freshness, replay-detection, and nonce requirements as they do for other DPoP-protected endpoint requests.¶
Authorization server signing-key rotation follows normal JWT and JWKS practices. Old verification keys need to remain available for as long as valid root tokens signed with them can be presented.¶
A client rotates its bound key by obtaining or receiving a new token whose cnf.jkt identifies the new key. Existing tokens cannot be rewritten. During a transition, a client might need to retain old private keys until all corresponding chains expire or are revoked. Consistent with Section 4.3, clients SHOULD generate a distinct bound key for each token; limited key reuse SHOULD be confined to tokens in the same usage scenario.¶
Authorization servers MUST issue finite root lifetimes and enforce a configured maximum lifetime. They SHOULD use the shortest lifetime suitable for the delegated task, and delegating clients SHOULD shorten lifetimes further to match delegated tasks. Long-lived root tokens magnify key compromise and revocation risks. Effective expiration is the earliest expiration in the chain, regardless of omitted child claims.¶
Every delegation appends another compact JWT, so chain size grows linearly with depth. Authorization details and public JWK headers can be substantial. Implementations need to account for HTTP header limits imposed by clients, proxies, gateways, and servers. A deployment can require a smaller maximum than the protocol syntax permits.¶
Every parser and verifier MUST enforce limits on the token count, total serialized size, individual token size, and signature-verification cost. It SHOULD reject an oversized chain before performing expensive cryptographic work. Deployments SHOULD document these limits so that clients can avoid unusable delegation paths.¶
A resource server MAY cache validated signatures and effective restrictions keyed by a cryptographic digest of the exact chain. Cache entries MUST be invalidated or expire according to the effective expiration time, authorization server key status, local policy changes, and revocation information available through any configured status mechanism. DPoP proof freshness and replay checks are per request and MUST NOT be bypassed by chain-validation caching.¶
Useful audit events include root issuance, local delegation, chain validation outcome, effective authorization, and protected resource decisions. Logs SHOULD identify chains by a one-way digest rather than store complete credentials. Implementations MUST redact Authorization and DPoP header values from routine logs and protect any recorded authorization details or subject identifiers.¶
This specification requests registration in the "OAuth Access Token Types" registry:¶
This specification requests registration in the "OAuth Token Type Hints" registry. Following the naming convention of existing values such as access_token and refresh_token, the registered value uses lowercase words separated by underscores:¶
The hint indicates that the token parameter contains a complete Delegated Authorization Token Chain in the serialization defined by this specification.¶
This specification requests registration in the "HTTP Authentication Scheme Registry":¶
This specification requests registration in the "JSON Web Token Claims" registry:¶
Claim Name: max_delegation_depth¶
Claim Description: Maximum number of further delegated authorization levels, from 0 to 65535¶
Change Controller: IESG¶
Specification Document(s): this document¶
The cnf, scope, aud, exp, nbf, iss, sub, iat, and jti names are already registered and are not re-registered by this document.¶
This specification requests registration in the "OAuth Parameters" registry:¶
Name: delegation¶
Parameter Usage Location: authorization request, token request¶
Change Controller: IETF¶
Reference: this document¶
The parameter value true requests issuance of a Delegated Authorization Token.¶
This specification also requests registration of the following parameter:¶
Name: max_delegation_depth¶
Parameter Usage Location: authorization request, token request¶
Change Controller: IETF¶
Reference: this document¶
The parameter optionally requests an exact finite delegation depth.¶
This specification also requests registration in the "OAuth Authorization Server Metadata" registry:¶
Metadata Name: delegated_authorization_token_supported¶
Metadata Description: Boolean indicating support for issuance of Delegated Authorization Tokens¶
Change Controller: IESG¶
Specification Document(s): this document¶
and:¶
Metadata Name: delegated_authorization_signing_alg_values_supported¶
Metadata Description: JWS algorithms supported for Authorization-Server-Issued Delegated Authorization Tokens¶
Change Controller: IESG¶
Specification Document(s): this document¶
and:¶
This specification requests registration in the "OAuth Protected Resource Metadata" registry:¶
Client A holds the root token, whose cnf.jkt identifies Client A's key. After authenticating Client B's public key, Client A:¶
computes the thumbprint of Client B's key;¶
creates a child with scope narrowed to records:read;¶
puts Client A's public JWK in the protected header;¶
signs the child with Client A's private key; and¶
delivers root-token~child-token to Client B.¶
The thumbprint of the child's protected jwk equals the root's cnf.jkt, while the child's cnf.jkt identifies Client B's key.¶
Client B can repeat the operation for Client C when the child token's effective depth permits it. The resulting chain is:¶
root-token~client-a-child-token~client-b-child-token¶
At each boundary:¶
thumbprint(child protected header jwk) = parent payload cnf.jkt¶
The final child in this example has max_delegation_depth equal to zero. Client C can use it to access the protected resource but cannot create another valid child.¶
Client C computes ath over the exact ASCII chain serialization, creates a DPoP proof for the request, and signs it with the key identified by the leaf cnf.jkt:¶
The resource server validates the root signature, both client signatures, both key-continuity relationships, all cumulative restrictions, the leaf key binding, and the DPoP request binding.¶
The following examples describe modifications to an otherwise valid chain and the required validation result. They are validation examples, not serialized cryptographic test vectors.¶
| Modification | Required result |
|---|---|
A child aud contains an audience absent from the effective parent audience. |
Reject the chain for audience expansion. |
A token contains an empty aud array. |
Reject the chain because an explicit aud claim must identify at least one audience. |
A child exp is later than the effective parent expiration time. |
Reject the chain for expiration-time expansion. |
A child nbf is earlier than the effective parent not-before time. |
Reject the chain for not-before-time expansion. |
The chain contains more client-issued tokens than permitted by the root max_delegation_depth. |
Reject the chain for excessive delegation depth. |
The JWK thumbprint of a child's protected jwk, computed according to [RFC7638], does not equal the preceding token's cnf.jkt. |
Reject the chain for broken key continuity. |
The DPoP proof key does not match the leaf token's cnf.jkt. |
Reject the protected resource request. |
| Two tokens in the chain are reordered. | Reject the chain because its signatures, key continuity, or cumulative restrictions do not validate in that order. |
The DPoP ath does not equal the hash of the exact received chain serialization. |
Reject the protected resource request. |
| A protected header or payload contains a duplicate JSON member name. | Reject the chain during parsing. |
A child contains authorization_details for which the verifier cannot establish semantic containment in the effective parent authorization details. |
Reject the chain because containment cannot be established. |