| Internet-Draft | Txn-Token Chaining Profile | May 2026 |
| Fletcher | Expires 13 November 2026 | [Page] |
This specification defines a profile of the OAuth Identity and Authorization Chaining Across Domains [I-D.ietf-oauth-identity-chaining] mechanism that uses a Transaction Token (Txn-Token) [I-D.ietf-oauth-transaction-tokens] as the subject token in a Token Exchange [RFC8693] request to obtain a JWT Authorization Grant for crossing a trust boundary.¶
A Txn-Token is scoped to a single trust domain and represents the full authorization context of an in-progress transaction, regardless of whether that transaction was initiated by a human user calling an external API, by an internal system event, or by an automated workload. This profile specifies how a service operating within that trust domain can present its Txn-Token to obtain a JWT Authorization Grant that carries the necessary context across a trust boundary, enabling an access token to be issued for a partner service, without exposing internal trust-domain credentials or token formats beyond the trust boundary.¶
RFC EDITOR: please remove this section before publication¶
Discussion of this document takes place on the Web Authorization Protocol Working Group mailing list (oauth@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/oauth/.¶
Source for this draft and an issue tracker can be found at https://github.com/george-fletcher/draft-fletcher-transaction-token-chaining-profile.¶
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 13 November 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.¶
Organizations routinely deploy services that, in fulfilling a transaction for a user or an automated process, must call one or more partner APIs that lie outside the organization's own trust boundary. The challenge is to carry the authorization context of the original transaction — including the identity and authorization of the Initiating Principal — across that boundary in a way that is trustworthy to the partner, without leaking internal credentials or internal token formats.¶
Transaction Tokens (Txn-Tokens) [I-D.ietf-oauth-transaction-tokens] address the first half of this problem. A Txn-Token is a short-lived, cryptographically signed JWT scoped to a single trust domain (for example, an enterprise or a cloud service provider's internal environment). It is minted by a Transaction Token Service (TTS) at the point where a transaction enters the trust domain and captures, in immutable form, the identity of the initiating principal, the purpose of the transaction, and relevant request parameters. Every workload within the trust domain that handles the transaction receives and validates this Txn-Token, ensuring a consistent and authoritative authorization context throughout the internal call chain.¶
A Txn-Token may represent any of several originating contexts:¶
A human user or external client calls an API exposed at the trust domain's perimeter (e.g., a financial services API that adds a stock to a watch list on behalf of the user, authenticated via an OAuth 2.0 access token). The TTS mints a Txn-Token anchored to the user's identity and the authorized scope of that external access token.¶
An internal system triggers processing that has no direct external human caller (e.g., an SMTP server receiving an inbound message and initiating storage of that message in the recipient's mailbox). The TTS mints a Txn-Token representing the system's identity and the purpose of the transaction.¶
One workload within the trust domain invokes another as part of an automated pipeline (e.g., a scheduled job triggering a data aggregation service). The Txn-Token represents the workload identity and the pipeline's authorization scope.¶
In all three cases, the Txn-Token provides a uniform, internal representation of the authorization context. The problem this specification addresses is what happens when a service within the trust domain, in the course of executing such a transaction, needs to call a service in a different trust domain — a partner organization, a SaaS provider, or a third-party API — in order to complete the transaction.¶
Consider a mail service within an enterprise trust domain. Upon receiving an inbound message via SMTP, the mail service is issued a Txn-Token representing the mail delivery transaction on behalf of the recipient user. Before storing the message, the mail service must call a partner spam-rating API in the spam service's trust domain. The mail service cannot present its internal Txn-Token to the spam service — the Txn-Token is scoped to the enterprise trust domain and carries internal context that must not be disclosed externally. Instead, the mail service must obtain a credential that is meaningful to the spam service's authorization server while preserving the relevant authorization context of the original transaction.¶
The OAuth Identity and Authorization Chaining Across Domains specification [I-D.ietf-oauth-identity-chaining] defines a general mechanism by which a client in Trust Domain A can obtain a JWT Authorization Grant from the Authorization Server of Trust Domain A and present it to the Authorization Server of Trust Domain B to receive an access token. The base specification deliberately leaves the choice of subject token type open, allowing profiles to constrain and specialize the mechanism for specific deployment scenarios.¶
This specification defines the additional details necessary to use a
Txn-Token as the subject_token in the Token Exchange request
described in Section 2.3 of [I-D.ietf-oauth-identity-chaining].
The Txn-Token is consumed by the Authorization Server of Trust Domain
A, which validates it, applies claims transcription and minimization
policy, and issues a JWT Authorization Grant targeted at the
Authorization Server of Trust Domain B. The JWT Authorization Grant
crosses the trust boundary carrying only the context that Trust
Domain B is authorized to see. The Txn-Token itself never leaves
Trust Domain A.¶
This profile is complementary to the Identity Assertion JWT Authorization Grant profile [I-D.ietf-oauth-identity-assertion-authz-grant], which targets deployments where the target authorization server already trusts a common IdP for SSO and subject resolution, using an OpenID Connect ID Token or SAML 2.0 assertion as the subject token. That profile is optimized for the human-user, single-sign-on scenario, where the trust relationship between AS-A and AS-B is mediated through a shared identity provider. This profile addresses scenarios where the trust relationship between AS-A and AS-B is established through a bilateral or federated Cross-Domain Trust Agreement, and where the input credential is a Txn-Token representing any authorized transaction within Trust Domain A.¶
A detailed structural comparison of the two profiles appears in Appendix B.¶
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.¶
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.¶
The following roles are used in this document. They extend the OAuth 2.0 roles defined in [RFC6749] as used in [I-D.ietf-oauth-identity-chaining].¶
The entity whose authorization context is captured in the Txn-Token. The Initiating Principal may be a human user who made an external request to Trust Domain A, an internal system acting on its own behalf, or an automated workload operating within Trust Domain A. The Initiating Principal is not necessarily the same entity as the Requesting Workload that performs the cross-domain token exchange.¶
A service operating inside Trust Domain A that, in the course of processing a transaction, needs to call a Protected Resource in Trust Domain B. The Requesting Workload holds a Txn-Token representing the current transaction context and acts as the OAuth 2.0 client in the Token Exchange flow with AS-A.¶
The service within Trust Domain A that mints and signs Txn-Tokens. The TTS is the authoritative source of transaction authorization context within Trust Domain A. In some deployments the TTS and AS-A MAY be co-located; in others they are separate services within the same Trust Domain.¶
The OAuth 2.0 Authorization Server within Trust Domain A that receives the Token Exchange request from the Requesting Workload, validates the presented Txn-Token, applies claims transcription and minimization policy, and issues the JWT Authorization Grant targeted at AS-B.¶
The OAuth 2.0 Authorization Server within Trust Domain B that receives the JWT Authorization Grant from the Requesting Workload and issues an access token for the Protected Resource.¶
The resource server in Trust Domain B that the Requesting Workload needs to call in order to complete the transaction in progress in Trust Domain A.¶
A unit of work initiated by an Initiating Principal that may span
multiple workloads within Trust Domain A and that has a single,
coherent authorization context. A transaction is identified by the
txn claim in the Txn-Token.¶
A deployment-specific security and administrative boundary within which services, identifiers, credentials, and policy decisions are mutually trusted. This term is used in [I-D.ietf-oauth-identity-chaining] without a formal definition; this profile formalizes it. Txn-Tokens are scoped to a single Trust Domain. In this specification, Trust Domain A is the Trust Domain in which the transaction originates and in which the Requesting Workload operates. Trust Domain B is the Trust Domain in which the Protected Resource and AS-B operate.¶
A bilateral or federated configuration through which AS-A and AS-B establish mutual trust, permitting AS-A to issue JWT Authorization Grants that AS-B will accept, and defining the subject identifier mappings, permitted claims, and authorization policy that apply to cross-domain requests. The mechanism for establishing this trust is out of scope for this specification, but MUST be established prior to any cross-domain token exchange under this profile.¶
A transaction enters Trust Domain A at its perimeter. The initiating event may be:¶
(a) An inbound API call from an external client, in which case the external client presents an OAuth 2.0 access token or similar credential at the trust domain's API gateway;¶
(b) An internal system event, such as an SMTP server receiving an inbound message, where the triggering input arrives from outside the enterprise boundary; or¶
(c) An automated workload trigger, with no direct external caller, such as a scheduled job or an event-driven pipeline invocation.¶
In all cases, the workload that first handles the transaction requests
a Txn-Token from the TTS, presenting whatever inbound credential or
context is available. The TTS validates the inbound context and
mints a Txn-Token that captures the Initiating Principal's identity
(which may be a user identity, a system identity, or a workload
identity), the purpose of the transaction (scope), and relevant
request parameters (rctx). The Txn-Token is propagated to all
downstream workloads within Trust Domain A that participate in
processing the transaction.¶
When a Requesting Workload within Trust Domain A determines that it needs to call a Protected Resource in Trust Domain B in order to complete the transaction, it follows the flow defined in this profile. The complete end-to-end sequence is illustrated in Figure 1.¶
+----------+ +-----------+ +----------+ +---------+ +---------+
|Initiating| |Requesting | | TTS / | | AS-B | |Protected|
| Request | | Workload | | AS-A | |(Trust B)| |Resource |
|(Perimeter| |(Trust A) | |(Trust A) | | | |(Trust B)|
| Trust A) | | | | | | | | |
+----+-----+ +-----+-----+ +----+-----+ +----+----+ +----+----+
| | | | |
| (1) Inbound | | | |
| Request | | | |
| (any origin) | | | |
|-------------->| | | |
| | | | |
| | (2) Request| | |
| | Txn-Token | | |
| |----------->| | |
| | | | |
| | (3) Txn- | | |
| | Token | | |
| |<- - - - - -| | |
| | | | |
| | (4) Discover AS-B | |
| |...(RFC9728)...............| |
| | | | |
| | (5) Token Exchange | |
| | [RFC8693]| | |
| | subject_token=Txn-Token | |
| | audience=AS-B issuer URL | |
| |----------->| | |
| | | | |
| | (6) JWT Authorization | |
| | Grant | | |
| |<- - - - - -| | |
| | | | |
| | (7) Present JWT Grant | |
| | [RFC7523] | |
| |-------------------------->| |
| | | | |
| | (8) Access Token | |
| |<- - - - - - - - - - - - - | |
| | | | |
| | (9) Call Protected Resource |
| |---------------------------------------->|
| | | | |
The steps are as follows:¶
An inbound request arrives at the Requesting Workload's perimeter. This may be an OAuth 2.0-protected API call from an external user or client, an SMTP message delivery, a scheduled job trigger, or any other initiating event.¶
The Requesting Workload (or the first workload within Trust Domain
A that receives the transaction) requests a Txn-Token from the TTS,
presenting the available inbound context (e.g., the external OAuth
2.0 access token, an internal system credential, or a workload
identity), following the Txn-Token issuance procedures defined in
[I-D.ietf-oauth-transaction-tokens]. The TTS records the
Initiating Principal's identity in the sub claim and the
transaction purpose in the scope claim of the Txn-Token.¶
The TTS issues a Txn-Token to the Requesting Workload. The Txn-Token is scoped to Trust Domain A and MUST NOT be presented to any entity outside Trust Domain A.¶
The Requesting Workload discovers AS-B using the mechanisms defined
in Section 2.2 of [I-D.ietf-oauth-identity-chaining], such as
the authorization_servers metadata property in the Protected
Resource Metadata [RFC9728] published by the Protected Resource.
The Requesting Workload obtains AS-B's issuer URL for use as the
audience parameter in the Token Exchange request.¶
The Requesting Workload presents the Txn-Token as the subject_token
in an OAuth 2.0 Token Exchange [RFC8693] request to AS-A,
identifying AS-B in the audience parameter and optionally
specifying the target Protected Resource in the resource
parameter. See Section 4.3 for the
full parameter specification.¶
AS-A validates the Txn-Token, verifies that a Cross-Domain Trust Agreement exists with the indicated AS-B, applies subject identifier mapping (Section 7.3) and claims minimization (Section 7), and issues a signed JWT Authorization Grant. The Txn-Token is consumed entirely within Trust Domain A and is not forwarded.¶
The Requesting Workload presents the JWT Authorization Grant to AS-B using the JWT Profile for OAuth 2.0 Authorization Grants [RFC7523].¶
AS-B validates the JWT Authorization Grant and issues an access token for the Protected Resource.¶
The Requesting Workload calls the Protected Resource with the access token, completing the cross-domain portion of the transaction.¶
When this profile is used, the subject_token in the Token Exchange
request (Step 5 of Figure 1) MUST be a Txn-Token as defined in
[I-D.ietf-oauth-transaction-tokens].¶
The subject_token_type parameter MUST be:¶
subject_token_type =
"urn:ietf:params:oauth:token-type:txn_token"
¶
This value is defined in [I-D.ietf-oauth-transaction-tokens].¶
The Txn-Token presented as the subject_token MUST satisfy all of
the validity requirements specified in
[I-D.ietf-oauth-transaction-tokens], including:¶
The Txn-Token MUST NOT be expired.¶
The Txn-Token MUST be signed and verifiable by AS-A using keys published by the TTS.¶
The Txn-Token's aud claim MUST identify AS-A (or a value that
AS-A accepts as a valid audience for presented subject tokens).¶
A Txn-Token failing any of the above checks MUST be rejected per Section 2.2.2 of [RFC8693].¶
The Txn-Token's sub claim identifies the Initiating Principal of
the transaction. The Initiating Principal type is not constrained
by this profile; a Txn-Token may represent any originating context
defined by the Transaction Token specification
[I-D.ietf-oauth-transaction-tokens]. The following are common
examples:¶
The sub claim identifies a human user whose identity was
established when the transaction entered Trust Domain A via an
OAuth 2.0-protected API call. In this case the sub value is
typically derived from the user's identity in the external access
token presented at the API gateway, and the Txn-Token's rctx
claim captures relevant attributes of the external request (such
as the OAuth client identifier and originating IP address).¶
The sub claim identifies an internal system component (such as
an SMTP server or a messaging gateway) acting in its own right,
with no external user as the Initiating Principal. The scope
claim is particularly significant in this case, as it conveys the
reason for the transaction in the absence of a user-facing
authorization context.¶
The sub claim identifies an automated workload (such as a
scheduled job or pipeline service). Workload identifiers MAY take
the form of SPIFFE URIs [I-D.ietf-wimse-arch] when
WIMSE-compatible infrastructure is in use within Trust Domain A.¶
The above examples are illustrative; other Initiating Principal types
are possible. The claims transcription rules in
Section 7 and the subject identifier mapping rules in
Section 7.3 apply regardless of which Initiating
Principal type the Txn-Token represents. AS-A MUST map the sub
claim to an identifier appropriate for Trust Domain B, applying the
mapping logic defined in the Cross-Domain Trust Agreement for the
Initiating Principal type in question.¶
In addition to the subject token requirements in Section 4.1, the Token Exchange request ([RFC8693] Section 2.1) MUST include the following parameters when this profile is in use.¶
grant_type:REQUIRED. The value MUST be
urn:ietf:params:oauth:grant-type:token-exchange.¶
subject_token:REQUIRED. The Txn-Token as described in Section 4.1.¶
subject_token_type:REQUIRED. The value MUST be
urn:ietf:params:oauth:token-type:txn_token.¶
requested_token_type:OPTIONAL. When present, the value MUST be
urn:ietf:params:oauth:token-type:jwt. If absent, AS-A MUST
still produce a JWT Authorization Grant conforming to this profile
when the other parameters conform to this profile.¶
scope:OPTIONAL. Space-separated list of scopes requested for the JWT
Authorization Grant. AS-A MUST NOT issue a grant with scope
exceeding the scope claim of the presented Txn-Token (see
Section 7).¶
The actor_token and actor_token_type parameters defined in
[RFC8693] are not used in this profile.¶
The following is a non-normative example conforming to this profile.
A mail service workload in an enterprise (Trust Domain A) has
received an SMTP message and holds a Txn-Token representing a
mail-delivery transaction. The mail service needs to call a
spam-rating API operated by a partner spam service whose
Authorization Server is https://as.spamsvc.example and whose
spam-rating API is https://api.spamsvc.example/spam-rating.¶
If the request is valid and the Requesting Workload is authorized to receive a JWT Authorization Grant for the indicated audience, AS-A returns a Token Exchange response as defined in Section 2.2 of [RFC8693].¶
access_token:REQUIRED. The JWT Authorization Grant. (Token Exchange uses the
access_token field for the returned token for historical
compatibility reasons; this is not an OAuth access token.)¶
issued_token_type:REQUIRED. The value MUST be
urn:ietf:params:oauth:token-type:jwt.¶
token_type:REQUIRED. The value MUST be N_A.¶
expires_in:RECOMMENDED. The lifetime of the JWT Authorization Grant in
seconds. This value SHOULD reflect the exp claim of the
returned grant JWT and SHOULD be short (see
Section 6.1.2).¶
refresh_token:This parameter SHOULD NOT be present.¶
On error, AS-A returns an error response as defined in Section 5.2 of [RFC6749] and Section 2.2.2 of [RFC8693].¶
Upon receipt of a Token Exchange request conforming to this profile, AS-A MUST perform the following steps:¶
Authenticate the client (Requesting Workload) using the mechanisms specified in Section 5.1 of [I-D.ietf-oauth-identity-chaining] and Section 2.5 of [RFC9700].¶
Validate the Txn-Token signature using the public keys of the TTS
that issued it. AS-A MUST be configured with the TTS's jwks_uri
or equivalent key material.¶
Validate that the Txn-Token is not expired.¶
Validate that the aud claim of the Txn-Token identifies AS-A
or a value AS-A is configured to accept as a valid audience for
presented subject tokens.¶
Verify that the audience value identifies a known AS-B for which
a Cross-Domain Trust Agreement has been established. AS-A MUST NOT accept a resource server URI in audience in place of an
AS-B issuer identifier. If the audience is unknown or disallowed
by policy, AS-A MUST return an error per Section 2.2.2 of
[RFC8693].¶
If the resource parameter is present, validate that it
identifies a Protected Resource within Trust Domain B consistent
with the indicated AS-B. AS-A SHOULD propagate the resource
value into the resource claim of the JWT Authorization Grant.¶
Validate that the requested scope, if present, does not exceed
the scope claim of the Txn-Token. AS-A MUST NOT issue a JWT
Authorization Grant with broader scope than the Txn-Token asserts.¶
Determine the Initiating Principal type from the Txn-Token and apply the appropriate subject identifier mapping as described in Section 7.3. If no mapping can be determined, AS-A MUST return an error.¶
Apply claims transcription and minimization policy as described in Section 7.¶
Construct and sign the JWT Authorization Grant as described in
Section 6, setting the aud claim to the AS-B
issuer identifier resolved in step 5.¶
Return the JWT Authorization Grant in the Token Exchange response as described in Section 4.3.¶
Upon receipt of a JWT Bearer grant request ([RFC7523]) conforming to this profile, AS-B MUST perform the following steps in addition to the processing rules specified in Section 2.4.2 of [I-D.ietf-oauth-identity-chaining]:¶
Validate the typ header of the JWT Authorization Grant. The
value MUST be txn-chain+jwt as defined in Section 6.¶
Validate that the aud claim matches AS-B's own issuer identifier.¶
Validate that the iss claim identifies an AS-A with which a
Cross-Domain Trust Agreement has been established, and validate
the JWT signature using the public keys advertised by that AS-A.¶
Validate that the JWT is not expired and that the jti value has
not been previously presented (single-use enforcement).¶
Resolve the subject from the sub claim according to the mapping
rules defined in the Cross-Domain Trust Agreement. AS-B SHOULD
evaluate the sub claim against its configured cross-domain
access policy; supplementary identifiers in txn_claims (e.g.,
email) MAY also be used for subject resolution where the
Cross-Domain Trust Agreement permits. If subject resolution fails
and the Cross-Domain Trust Agreement does not permit Just-In-Time
provisioning, AS-B MUST return an error.¶
If present, evaluate the txn_claims claim to apply
context-aware authorization policy (see Section 7),
for example verifying that the scope value is consistent with
the requested scope.¶
Issue an access token constrained by the scope and, if present,
the resource claim in the JWT Authorization Grant. AS-B SHOULD NOT issue refresh tokens, consistent with Section 5.4 of
[I-D.ietf-oauth-identity-chaining].¶
This profile constrains and extends the claims transcription rules of Section 2.5 of [I-D.ietf-oauth-identity-chaining] as follows.¶
AS-A MUST derive the sub claim of the JWT Authorization Grant from
the sub claim of the Txn-Token, applying the subject identifier
mapping defined in Section 7.3.¶
AS-A MUST include the txn claim from the Txn-Token as the txn
claim in the JWT Authorization Grant, preserving the transaction
correlation identifier across the domain boundary.¶
The scope in the JWT Authorization Grant MUST be the intersection of
the Txn-Token's scope claim and the scope parameter of the Token
Exchange request (if present). AS-A MUST NOT expand scope beyond the
Txn-Token's scope under any circumstances.¶
The sub claim of the Txn-Token identifies the Initiating Principal
within Trust Domain A's namespace. AS-A MUST translate this
identifier to a form that is both meaningful and authorized for use
in Trust Domain B, according to the mapping rules defined in the
Cross-Domain Trust Agreement. The Cross-Domain Trust Agreement MUST
define mapping rules for every Initiating Principal type that may
appear in Txn-Tokens exchanged under this profile. If no mapping
can be determined for the Initiating Principal presented, AS-A MUST
deny the Token Exchange request.¶
Txn-Tokens MUST NOT be forwarded across trust boundaries. The JWT Authorization Grant is the only artifact that crosses the boundary, and AS-A MUST apply strict claims minimization.¶
The optional txn_claims object in the JWT Authorization Grant MAY
carry a curated subset of Txn-Token claims that are relevant to
AS-B's authorization policy. AS-A MUST apply the following
minimization rules:¶
scope):SHOULD be included when it is meaningful to AS-B's authorization policy (e.g., to enable the Protected Resource to apply different handling based on transaction type).¶
rctx):MAY be included in a minimized form. Information relevant to the cross-domain request (e.g., the originating client IP address for a user-initiated transaction, or the SMTP envelope sender address for a mail delivery transaction) MAY be included. Internal network addresses, intermediate workload identifiers, and internal infrastructure topology details MUST be omitted.¶
Claims that record intermediate workloads or the internal call
chain within Trust Domain A MUST NOT be included in txn_claims.¶
For human user Initiating Principals, claims such as email MAY
be included in txn_claims if the Cross-Domain Trust Agreement
explicitly permits their disclosure and AS-B requires them for
subject resolution.¶
The Cross-Domain Trust Agreement SHOULD define the set of claims
permitted to appear in txn_claims and their expected semantics,
to ensure that AS-A and AS-B have a shared, normative understanding
of each transcribed claim.¶
The Requesting Workload MUST authenticate to AS-A when performing the Token Exchange request. The use of asymmetric key-based client authentication (e.g., a JWT client assertion per [RFC7523]) is RECOMMENDED. Static shared secrets SHOULD NOT be used. AS-A SHOULD follow the client authentication guidance in Section 2.5 of [RFC9700].¶
AS-B SHOULD issue sender-constrained access tokens. Both DPoP (OAuth 2.0 Demonstrating Proof of Possession) and Mutual-TLS ([RFC9700] Section 2.3) are RECOMMENDED mechanisms.¶
When AS-A acts as the client toward AS-B (the authorization-server-
as-client topology described in Appendix B.2 of
[I-D.ietf-oauth-identity-chaining]), the delegated key binding
mechanism described in Appendix B.3 of that document SHOULD be used.
AS-A MUST verify proof of possession of the Requesting Workload's
key and convey it to AS-B using the cnf claim in the JWT
Authorization Grant.¶
A Txn-Token MUST NOT be forwarded to any entity outside Trust Domain A. All communication between the Requesting Workload and AS-A MUST be encrypted and the Requesting Workload MUST be authenticated (e.g., via mutual TLS; see also Section 9.1). Txn-Token lifetimes SHOULD be short.¶
AS-A MUST enforce that the JWT Authorization Grant scope does not exceed the Txn-Token's scope. AS-B MUST independently enforce that the access token it issues does not convey scope exceeding the JWT Authorization Grant. These controls together prevent the chaining mechanism from being used to escalate privileges beyond the originating transaction's authorized scope.¶
Operators MUST ensure that:¶
AS-A issues JWT Authorization Grants only for AS-B instances with which a bilateral Cross-Domain Trust Agreement has been explicitly established and is actively maintained.¶
AS-B accepts JWT Authorization Grants only from AS-A instances listed in its trusted issuers configuration.¶
The Cross-Domain Trust Agreement, including subject identifier
mappings and permitted txn_claims, is reviewed whenever the
participating services or their authorization policies change.¶
AS-B SHOULD NOT issue refresh tokens. Because Txn-Tokens are short-lived and transaction-specific, re-obtaining a new Txn-Token and repeating the chaining flow is the correct renewal mechanism. Issuing a refresh token would decouple the access lifetime from the originating transaction's authorization context and create a persistent credential outside the control of Trust Domain A.¶
Txn-Tokens may contain claims that relate to the Initiating Principal, including personal identity information for human-user-initiated transactions (e.g., user identifier, email address, IP address) that may be subject to applicable privacy regulations.¶
AS-A MUST apply claims minimization (Section 7) before issuing a JWT Authorization Grant. Specifically:¶
Only identity claims necessary for AS-B to resolve the subject and
apply authorization policy SHOULD be included in txn_claims.¶
Claims that could be used to reconstruct internal activity patterns within Trust Domain A MUST NOT be included.¶
The Cross-Domain Trust Agreement MUST specify which identity claims AS-A is permitted to disclose to AS-B, consistent with the data handling and privacy policies of both organizations.¶
The txn claim enables end-to-end transaction correlation across the
domain boundary. Operators SHOULD evaluate whether the auditability
benefits outweigh the privacy implications for their specific
deployment, particularly for human-user-initiated transactions.¶
This specification requests registration of the following value in the "JSON Web Signature and Encryption Header Parameters" registry (maintained by IANA):¶
This specification requests registration of the following claim name in the "JSON Web Token Claims" registry (maintained by IANA):¶
The following use cases illustrate the three Initiating Principal types described in Section 4.2, each demonstrating a scenario where a workload within a Trust Domain must call a partner service in a separate Trust Domain to complete the transaction.¶
A financial services enterprise exposes a portfolio management API to
its customers. A customer uses a mobile application to add a stock
to their watch list, calling POST /watchlist at the enterprise's
API gateway with an OAuth 2.0 access token.¶
The API gateway workload requests a Txn-Token from the TTS,
presenting the user's access token as the inbound credential. The
TTS mints a Txn-Token with sub set to the user's enterprise
identifier, scope set to watchlist-update, and rctx capturing
the mobile client's OAuth client identifier and IP address. This
Txn-Token propagates through the internal portfolio service call
chain.¶
To enrich the watch list entry with current market data, the
portfolio service must call a market-data API operated by a partner
financial data provider in Trust Domain B. The portfolio service
exchanges the Txn-Token for a JWT Authorization Grant using this
profile. AS-A maps the user's enterprise identifier to a
cross-domain user identifier agreed with the partner (e.g., the
user's email address or a pairwise identifier), and includes a
minimized txn_claims carrying scope: watchlist-update.¶
The partner's authorization server issues an access token that identifies the user (enabling per-user rate limiting and audit logging at the partner) without receiving the enterprise's internal Txn-Token, internal access token, or internal user database identifiers.¶
An enterprise mail service receives an inbound email message via
SMTP. The SMTP server is an internal system component operating
under its own system credential; no external OAuth client is
involved. The SMTP server requests a Txn-Token from the TTS with
sub set to its system identity (system:mail-gateway@enterprise.example),
scope set to mail-delivery, and rctx carrying the SMTP envelope
sender address and the recipient user's internal identifier. This
Txn-Token propagates to the mail storage service workload.¶
Before storing the message in the recipient's mailbox, the mail
storage service must call a spam-rating API operated by a partner
spam service in Trust Domain B (whose Authorization Server is
https://as.spamsvc.example and whose spam-rating API is
https://api.spamsvc.example/spam-rating).¶
The mail storage service exchanges the Txn-Token for a JWT
Authorization Grant using this profile. AS-A maps the system
identity to the cross-domain service identifier agreed with the spam
service, and includes a minimized txn_claims carrying
scope: mail-delivery and rctx.smtp_from (the envelope sender
address, stripped of internal routing metadata).¶
The spam service's authorization server issues an access token for
the spam-rating API. The spam service can apply per-sender and
per-recipient policy based on txn_claims, enabling personalized
spam filtering without requiring the enterprise to expose internal
user tokens or the Txn-Token outside its trust boundary.¶
An enterprise data platform runs a nightly telemetry aggregation job.
The job is an automated workload with no direct external caller,
triggered by an internal scheduler. The scheduler requests a
Txn-Token from the TTS with sub set to the job's SPIFFE workload
URI (spiffe://enterprise.example/telemetry/nightly-agg), scope
set to telemetry-aggregation, and no user context in rctx.¶
To complete the aggregation, the job must query a third-party
analytics API in Trust Domain B. The job exchanges the Txn-Token
for a JWT Authorization Grant using this profile. AS-A maps the
SPIFFE workload URI to a cross-domain workload identifier agreed with
the analytics provider, and includes scope: telemetry-aggregation
in txn_claims.¶
The analytics provider's authorization server issues a scoped access
token. The txn claim in the JWT Authorization Grant allows the
analytics provider to correlate API calls to the originating job run
for billing and audit purposes, without receiving the internal SPIFFE
URI or other Trust Domain A infrastructure details.¶
The author would like to thank Atul Tulshibagwale, Pieter Kasselman, Aaron Parecki, Brian Campbell, Arndt Schwenkschuster, Kelley Burgin, Karl McGuinness, and the members of the IETF OAuth Working Group for their foundational work on the specifications that this profile depends on.¶
The Transaction Tokens concept was originally developed by Atul Tulshibagwale, George Fletcher, and Pieter Kasselman. The OAuth Identity and Authorization Chaining Across Domains specification was authored by Arndt Schwenkschuster, Pieter Kasselman, Kelley Burgin, Michael Jenkins, Brian Campbell, and Aaron Parecki.¶