Web Authorization Protocol A. Parecki Internet-Draft Okta Intended status: Standards Track K. McGuinness Expires: 4 May 2027 Independent B. Campbell Ping Identity 31 October 2026 Identity Assertion JWT Authorization Grant draft-ietf-oauth-identity-assertion-authz-grant-06 Abstract This specification provides a mechanism for an application to use an identity assertion to obtain an access token for a third-party API by coordinating through an identity provider that the downstream Resource Authorization Server already trusts for single sign-on (SSO), using OAuth 2.0 Token Exchange (RFC 8693) and the JWT Profile for OAuth 2.0 Authorization Grants (RFC 7523). This pattern is informally referred to as Cross-App Access (XAA). About This Document This note is to be removed before publishing as an RFC. The latest revision of this draft can be found at https://drafts.oauth.net/oauth-identity-assertion-authz-grant/draft- ietf-oauth-identity-assertion-authz-grant.html. Status information for this document may be found at https://datatracker.ietf.org/doc/ draft-ietf-oauth-identity-assertion-authz-grant/. Discussion of this document takes place on the Web Authorization Protocol Working Group mailing list (mailto:oauth@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/oauth/. Subscribe at https://www.ietf.org/mailman/listinfo/oauth/. Source for this draft and an issue tracker can be found at https://github.com/oauth-wg/oauth-identity-assertion-authz-grant. Status of This Memo This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79. Parecki, et al. Expires 4 May 2027 [Page 1] Internet-Draft ID JWT Authz Grant October 2026 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 4 May 2027. Copyright Notice 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. Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 5 2.1. Roles . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2. Terms . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3. Identity Assertion JWT Authorization Grant . . . . . . . . . 7 3.1. ID-JAG Claims . . . . . . . . . . . . . . . . . . . . . . 8 3.2. SAML NameID Subject Identifier . . . . . . . . . . . . . 12 3.2.1. Subject Identifier Format . . . . . . . . . . . . . . 12 3.2.2. Subject Identifier Processing . . . . . . . . . . . . 13 4. Cross-Domain Access . . . . . . . . . . . . . . . . . . . . . 15 4.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2. User Authentication . . . . . . . . . . . . . . . . . . . 18 4.3. Token Exchange . . . . . . . . . . . . . . . . . . . . . 19 4.3.1. Example: Token Exchange using ID Token . . . . . . . 22 4.3.2. Example: Token Exchange using Refresh Token . . . . . 22 4.3.3. Processing Rules . . . . . . . . . . . . . . . . . . 23 4.3.4. Response . . . . . . . . . . . . . . . . . . . . . . 26 4.4. Access Token Request . . . . . . . . . . . . . . . . . . 31 4.4.1. Processing Rules . . . . . . . . . . . . . . . . . . 32 4.4.2. Response . . . . . . . . . . . . . . . . . . . . . . 34 Parecki, et al. Expires 4 May 2027 [Page 2] Internet-Draft ID JWT Authz Grant October 2026 4.4.3. Error Response . . . . . . . . . . . . . . . . . . . 35 4.4.4. Refresh Token . . . . . . . . . . . . . . . . . . . . 35 4.5. SAML 2.0 Subject Token Interoperability . . . . . . . . . 36 5. Cross-Domain Client and Subject Identifier Handling . . . . . 38 5.1. Client ID Mapping . . . . . . . . . . . . . . . . . . . . 39 5.2. Subject Identifier Mapping . . . . . . . . . . . . . . . 39 6. Tenant Relationships with Issuer and Client ID . . . . . . . 40 6.1. Issuer and Tenant Relationship . . . . . . . . . . . . . 40 6.2. Client ID and Tenant Relationship . . . . . . . . . . . . 41 6.3. Subject Identifier Uniqueness with Tenants . . . . . . . 41 6.4. Tenant Context in Token Exchange . . . . . . . . . . . . 41 7. Authorization Server Metadata . . . . . . . . . . . . . . . . 42 7.1. IdP Authorization Server Metadata . . . . . . . . . . . . 42 7.2. Resource Authorization Server Metadata . . . . . . . . . 43 8. Client Metadata . . . . . . . . . . . . . . . . . . . . . . . 43 9. Security Considerations . . . . . . . . . . . . . . . . . . . 44 9.1. Client Authentication . . . . . . . . . . . . . . . . . . 44 9.2. Storage of Subject Tokens . . . . . . . . . . . . . . . . 45 9.3. Step-Up Authentication . . . . . . . . . . . . . . . . . 46 9.4. Cross-Domain Use . . . . . . . . . . . . . . . . . . . . 47 9.5. Authorization Server Metadata Validation . . . . . . . . 47 9.6. Protected Resource Metadata Validation . . . . . . . . . 48 9.7. Metadata Disclosure . . . . . . . . . . . . . . . . . . . 48 9.8. Subject Identifier Trust . . . . . . . . . . . . . . . . 49 9.9. Subject Identifier Disclosure . . . . . . . . . . . . . . 49 9.10. Actor Delegation Extensions . . . . . . . . . . . . . . . 50 9.11. Sender Constraining Tokens . . . . . . . . . . . . . . . 50 9.11.1. DPoP Key Binding . . . . . . . . . . . . . . . . . . 51 9.11.2. mTLS Certificate Binding . . . . . . . . . . . . . . 55 10. Privacy Considerations . . . . . . . . . . . . . . . . . . . 57 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 58 11.1. Media Types . . . . . . . . . . . . . . . . . . . . . . 58 11.2. OAuth URI Registration . . . . . . . . . . . . . . . . . 58 11.3. OAuth Authorization Server Metadata Registration . . . . 58 11.4. OAuth Dynamic Client Registration Metadata Registration . . . . . . . . . . . . . . . . . . . . . . 59 11.5. JSON Web Token Claims Registration . . . . . . . . . . . 59 11.6. Security Event Identifier Format Registration . . . . . 60 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 60 12.1. Normative References . . . . . . . . . . . . . . . . . . 60 12.2. Informative References . . . . . . . . . . . . . . . . . 63 Appendix A. Use Cases . . . . . . . . . . . . . . . . . . . . . 64 A.1. Enterprise Deployment . . . . . . . . . . . . . . . . . . 64 A.1.1. Preconditions . . . . . . . . . . . . . . . . . . . . 65 A.2. Customer Identity for Developer SaaS Components . . . . . 65 A.2.1. Preconditions . . . . . . . . . . . . . . . . . . . . 65 A.3. Email and Calendaring Applications . . . . . . . . . . . 66 A.3.1. Preconditions . . . . . . . . . . . . . . . . . . . . 67 Parecki, et al. Expires 4 May 2027 [Page 3] Internet-Draft ID JWT Authz Grant October 2026 A.4. AI Agent using External Tools . . . . . . . . . . . . . . 67 A.4.1. Preconditions . . . . . . . . . . . . . . . . . . . . 67 A.4.2. Example Sequence . . . . . . . . . . . . . . . . . . 68 Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 76 Document History . . . . . . . . . . . . . . . . . . . . . . . . 76 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 80 1. Introduction In many deployments, applications are configured for single sign-on to a common identity provider (IdP) using OpenID Connect or SAML. This enables users to access multiple applications using a single account at the IdP, and enables the operator of that IdP to manage which users can access which applications and enforce policy for access to those applications. Enterprise workforce identity providers are one common example, but the same trust pattern can also arise in customer identity, platform identity, and other federated application ecosystems. When one application wants to access a user's data at another application, it will start an interactive OAuth flow [RFC6749] to obtain an access token for the application on behalf of the user. This OAuth flow enables a direct app-to-app connection between the two apps, and is not visible to the IdP used to log in to each app. This specification defines Cross-App Access (XAA): a pattern in which an application's access to another application's API is mediated by the IdP that both applications already trust for SSO and subject resolution. XAA extends the IdP's role from single sign-on to brokering cross-domain API access, using the same trust relationships that already exist for SSO. XAA is built on top of OAuth 2.0 by profiling "Identity Chaining Across Trust Domains" [I-D.ietf-oauth-identity-chaining], which combines OAuth 2.0 Token Exchange [RFC8693] and the JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants [RFC7523] to chain a JWT authorization grant across trust domains. Identity Chaining intentionally leaves many details unspecified in order to support multiple use cases. This specification profiles it for XAA by defining: * the Token Exchange request used to obtain an Identity Assertion JWT Authorization Grant (Section 3); * the ID-JAG itself, including its claims and format; * the processing rules applied by the Resource Authorization Server when exchanging an ID-JAG for an Access Token; and Parecki, et al. Expires 4 May 2027 [Page 4] Internet-Draft ID JWT Authz Grant October 2026 * the authorization server and client metadata used to discover support for the profile. In particular, this profile requires an Identity Assertion (such as an OpenID Connect ID Token or SAML 2.0 assertion) as the Token Exchange subject_token input. Unlike profiles in which the IdP issues access tokens directly to be consumed by the Resource Server (such as the OAuth 2.0 JWT Profile for Access Tokens [RFC9068]), this specification preserves the Resource Authorization Server as the issuer of access tokens for its protected resources. This lets the IdP centralize federated identity, SSO trust, and the decision to broker cross-app access, while the Resource Authorization Server keeps independent control over its own access tokens. The Resource Authorization Server determines whether to honor a given ID-JAG, what scopes or authorization details to grant, and what access token to issue, applying its own local policy. 2. Conventions and Definitions 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. 2.1. Roles Client The application that wants to obtain an OAuth 2.0 access token on behalf of a signed-in user to an external/3rd party application's API (Resource Server below). In [I-D.ietf-oauth-identity-chaining], this is the Client in trust domain A. The application has a direct relationship with the IdP Authorization Server for single sign-on as a Relying Party and another independent OAuth 2.0 client relationship with the Resource Authorization Server in trust domain B. IdP Authorization Server (IdP) An OpenID Connect Provider (OP) [OpenID.Core] or SAML 2.0 Identity Provider that issues Identity Assertions for single sign-on and cross-domain authorization grants Section 3 for a set of trusted applications in an application ecosystem. In this specification, the IdP is the issuer that the Resource Authorization Server already trusts for SSO and subject resolution for the target user accounts. In [I-D.ietf-oauth-identity-chaining], this is the Authorization Server in trust domain A, which is also trusted by the Resource Authorization Server in trust domain B. Parecki, et al. Expires 4 May 2027 [Page 5] Internet-Draft ID JWT Authz Grant October 2026 Resource Authorization Server (AS) Issues OAuth 2.0 access tokens for protected resources provided by the Resource Server. In [I-D.ietf-oauth-identity-chaining], this is the Authorization Server in trust domain B, and trusts cross-domain authorization grants Section 3 from the IdP Authorization Server. Resource Server (RS) Hosts protected resources and validates access tokens issued by the Resource Authorization Server. In [I-D.ietf-oauth-identity-chaining], this is the Protected Resource in trust domain B. The Resource Server has no direct trust relationship with the IdP Authorization Server. Instead, it validates access tokens issued by its trusted Resource Authorization Server to determine who should have access to resources. 2.2. Terms The following terms are used in this document: Common OAuth and token processing terms such as client, authorization server, resource server, resource owner, access token, refresh token, token, grant, assertion, subject_token, subject_token_type, actor_token, and actor_token_type are used as defined in OAuth 2.0 [RFC6749], JSON Web Token (JWT) [RFC7519], JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants [RFC7523], OAuth 2.0 Token Exchange [RFC8693], and OAuth 2.0 Authorization Server Metadata [RFC8414], unless otherwise specified by this document. OpenID Connect terms such as end-user, Relying Party, OpenID Provider, ID Token, subject identifier, and pairwise subject identifier are used as defined in OpenID Connect Core 1.0 [OpenID.Core], unless otherwise specified by this document. Identity Assertion A security token issued by the IdP Authorization Server that conveys claims about the End-User and can be used as the subject_token input to Token Exchange. In this specification, the Identity Assertion is typically an OpenID Connect ID Token or a SAML 2.0 assertion. Trust Domain A deployment-specific security and administrative boundary within which a set of entities, identifiers, credentials, and policy decisions are mutually trusted according to established trust relationships. In this specification, the IdP Authorization Server operates in trust domain A, while the Resource Authorization Server and Resource Server operate in trust domain B. Parecki, et al. Expires 4 May 2027 [Page 6] Internet-Draft ID JWT Authz Grant October 2026 Cross-Domain Involving two or more trust domains where an assertion, grant, or authorization decision produced in one trust domain is relied upon in another. In this specification, the IdP Authorization Server operates in trust domain A, while the Resource Authorization Server and Resource Server operate in trust domain B. Cross-App Access (XAA) The application-ecosystem name for the pattern this specification profiles, in which an application obtains an access token at another application's API by coordinating through the IdP both applications trust for SSO. XAA is realized over OAuth 2.0 by using an Identity Assertion JWT Authorization Grant (Section 3) as a specific instance of cross- domain identity chaining ([I-D.ietf-oauth-identity-chaining]). Subject Resolution The process by which the Resource Authorization Server determines which local subject represents the End-User identified by the ID-JAG. Subject resolution can use stable identifiers and other trusted claims in the ID-JAG, such as iss, sub, tenant, aud_sub, email, or deployment-specific claims, and can include JIT provisioning when permitted by policy. JIT provisioning The process by which the Resource Authorization Server or a relying service creates a new local account or subject record, or updates an existing one, using trusted identity claims presented during the transaction rather than requiring separate pre-provisioning. In this specification, JIT provisioning may occur as part of subject resolution when permitted by policy. Tenant A deployment-specific administrative, organizational, or customer boundary within an issuer or relying service that scopes subjects, clients, policy, and other identifiers. In single- tenant deployments, the issuer may uniquely identify the tenant context; in multi-tenant deployments, the tenant context may need to be conveyed explicitly, for example by the tenant or aud_tenant claim. 3. Identity Assertion JWT Authorization Grant The Identity Assertion JWT Authorization Grant (ID-JAG) is a profile of the JWT Authorization Grant [RFC7523] that grants a client delegated access to a resource, typically in another trust domain, on behalf of a user without a direct user-approval step at the authorization server. In addition to traditional OAuth scope-based authorization, this specification can be extended with Rich Authorization Requests (RAR) [RFC9396], allowing clients to request limited authorization using structured authorization details. Parecki, et al. Expires 4 May 2027 [Page 7] Internet-Draft ID JWT Authz Grant October 2026 An ID-JAG is issued and signed by an IdP Authorization Server similar to an ID Token [OpenID.Core], and contains claims about an End-User. Instead of being issued for a Client (Relying Party in [OpenID.Core]) as the intended audience for the assertion, it is instead issued with an audience of an Authorization Server, typically in another trust domain (Resource Authorization Server). It replaces the need for the client to obtain an authorization code from the Resource Authorization Server to delegate access to the client, and instead uses the IdP Authorization Server that is trusted by the Resource Authorization Server for SSO and subject resolution to delegate access to the client. The Resource Authorization Server still applies local policy when deciding whether to honor the ID-JAG and what access token to issue. As described in [OpenID.Core], ID Tokens are only intended to be processed by the Relying Party (indicated by the ID Token audience) or the Issuer (e.g. for revocation), and not by other actors in a different trust domain such as an Authorization Server. Because an ID-JAG is a JWT authorization grant, RS256 is mandatory to implement for both the IdP Authorization Server and the Resource Authorization Server (Section 5 of [RFC7523]). Resource Authorization Servers SHOULD also support ES256 [RFC7518]. 3.1. ID-JAG Claims The following claims are used within the Identity Assertion JWT Authorization Grant: iss: REQUIRED - The issuer identifier of the IdP Authorization Server as defined in [RFC8414]. sub: REQUIRED - Subject Identifier for the End-User, selected by the IdP Authorization Server for the Resource Authorization Server identified by the aud claim as described in Section 5.2. The sub claim identifies the End-User in the subject namespace of the ID- JAG issuer. A public subject identifier MUST be unique when scoped with issuer (iss+sub) for a single-tenant issuer and MUST be unique when scoped with issuer and tenant (iss+tenant+sub) for multi-tenant issuer. When the Resource Authorization Server uses a different subject namespace for SSO, such as a SAML Assertion Subject namespace, the ID-JAG MAY include sub_id to carry the SSO subject identifier. When both sub and sub_id are present, they MUST identify the same End-User. sub_id: OPTIONAL - Subject Identifier as defined in [RFC9493]. The Parecki, et al. Expires 4 May 2027 [Page 8] Internet-Draft ID JWT Authz Grant October 2026 sub_id claim MAY be used to identify the same End-User as the sub claim using a different identifier namespace from the ID-JAG iss and sub. This is useful when the Resource Authorization Server resolves users by a non-JWT subject identifier, such as a SAML Assertion Subject , in its SSO trust relationship with the IdP Authorization Server. See Section 3.2.1 for the SAML NameID Subject Identifier Format defined by this specification, and Section 3.2.2 for processing rules. aud: REQUIRED - The issuer identifier of the Resource Authorization Server as defined in [RFC8414]. client_id: REQUIRED - The client identifier of the OAuth 2.0 [RFC6749] client at the Resource Authorization Server that will act on behalf of the resource owner (sub). This identifier MAY be different from the client identifier of the OAuth 2.0 client requesting an ID-JAG from the IdP Section 4.3 of [RFC8693], as it represents an independent client relationship with another Authorization Server in a different trust domain. See Section 5.1 for additional considerations. jti: REQUIRED - Unique ID of this JWT as defined in Section 4.1.7 of [RFC7519]. exp: REQUIRED - as defined in Section 4.1.4 of [RFC7519]. iat: REQUIRED - as defined in Section 4.1.6 of [RFC7519]. resource: OPTIONAL - Identifies the protected resource(s) for which access is granted, using resource identifiers as defined in Section 2 of [RFC8707]. The value is a string for a single resource, or a non-empty JSON array of unique strings for multiple resources. Resource identifiers are compared as described in Section 4.3. scope: OPTIONAL - a JSON string containing a space-separated list of scopes associated with the token, in the format described in Section 3.3 of [RFC6749]. authorization_details: OPTIONAL - A JSON array of authorization detail objects as defined in Section 2 of [RFC9396]. This claim enables Rich Authorization Requests (RAR) support, allowing structured authorization requests beyond simple scope strings. act: OPTIONAL - Actor claim as defined in Section 4.1 of [RFC8693]. When present, this claim identifies the actor that is acting on behalf of the subject (sub). Parecki, et al. Expires 4 May 2027 [Page 9] Internet-Draft ID JWT Authz Grant October 2026 tenant: OPTIONAL - JSON string that represents the tenant identifier for a multi-tenant issuer as defined in [OpenID.Enterprise] auth_time: OPTIONAL - Time when End-User authenticated as defined in [OpenID.Core]. acr: OPTIONAL - Authentication Context Class Reference that was satisfied when authenticating the End-User as defined in [OpenID.Core]. amr: OPTIONAL - Identifiers for authentication methods used when authenticating the End-User as defined in [OpenID.Core]. aud_tenant: OPTIONAL - A JSON string that represents a Resource Authorization Server tenant identifier. This claim is only included when the Resource Authorization Server is multi-tenant and the IdP knows the tenant identifier. When aud_tenant is present, the aud_sub claim represents the identifier the Resource Authorization Server has for the account within the context of that specific Resource Authorization Server tenant. The combination of aud + aud_tenant and aud_sub MUST be unique within the Resource Authorization Server. aud_sub: OPTIONAL - The Resource Authorization Server's identifier for the End-User as defined in [OpenID.Enterprise]. email: OPTIONAL - End-User's e-mail address as defined in Section 5.1 of [OpenID.Core]. The typ of the JWT indicated in the JWT header MUST be oauth-id- jag+jwt. Using typed JWTs is a recommendation of the JSON Web Token Best Current Practices as described in Section 3.11 of [RFC8725]. A non-normative example JWT with expanded header and payload claims is below: Parecki, et al. Expires 4 May 2027 [Page 10] Internet-Draft ID JWT Authz Grant October 2026 { "typ": "oauth-id-jag+jwt" } . { "jti": "9e43f81b64a33f20116179", "iss": "https://acme.idp.example/", "sub": "U019488227", "aud": "https://acme.chat.example/", "client_id": "f53f191f9311af35", "exp": 1311281270, "iat": 1311280970, "resource": "https://acme.chat.example/api", "scope": "chat.read chat.history", "auth_time": 1311280970, "amr": [ "mfa", "phrh", "hwk", "user" ] } . signature The ID-JAG conveys claims about three subjects: the End-User identified by sub (including identity, authentication context, and audience-scoped authorization context such as roles or entitlements at the target application), the OAuth 2.0 client identified by client_id that will act on behalf of the End-User at the Resource Authorization Server, and, when present, the actor identified by act (Section 4.1 of [RFC8693]). The IdP Authorization Server populates these claims for the specific Resource Authorization Server identified by aud, in the same way it would populate audience-scoped claims into an ID Token or SAML Assertion issued to that Resource Authorization Server. Any claim that would be valid in an ID Token [OpenID.Core] may appear in the ID-JAG, since the grant conveys identity claims about the End-User as well as an authorization delegation for the Resource Authorization Server. It is RECOMMENDED that the ID-JAG contain an email [OpenID.Core] and/ or aud_sub [OpenID.Enterprise] claim. The Resource Authorization Server MAY use these claims for subject resolution, including JIT provisioning, for example when the user has not yet SSO'd into the Resource Authorization Server. Additional Resource Authorization Server specific identity claims MAY be needed for subject resolution. Parecki, et al. Expires 4 May 2027 [Page 11] Internet-Draft ID JWT Authz Grant October 2026 3.2. SAML NameID Subject Identifier 3.2.1. Subject Identifier Format This specification defines the SAML NameID Subject Identifier Format for use in the sub_id claim [RFC9493]. The SAML NameID Subject Identifier Format is identified by the name saml-nameid and identifies a subject using a SAML 2.0 Assertion Subject value within the context of a SAML issuer [OASIS.saml-core-2.0-os]. This format is intended for deployments where the Resource Authorization Server resolves users using a SAML from its SSO trust relationship with the IdP Authorization Server, rather than the ID-JAG issuer's iss and sub values. A Subject Identifier in this format MUST contain: format: A JSON string containing the value saml-nameid identifying this Subject Identifier Format, as defined in [RFC9493]. issuer: A JSON string containing the SAML issuer entity identifier for the assertion or configured mapping containing the SAML Assertion Subject , as defined by Section 8.3.6 of [OASIS.saml-core-2.0-os]. SAML attributes are not represented by this format. nameid: A JSON string containing the SAML Assertion Subject value as defined in [OASIS.saml-core-2.0-os]. A Subject Identifier in this format MAY contain: nameid_format: A JSON string containing the value of the Format attribute on the SAML Assertion Subject as defined in [OASIS.saml-core-2.0-os]. name_qualifier: A JSON string containing the value of the NameQualifier attribute on the SAML Assertion Subject as defined in [OASIS.saml-core-2.0-os]. sp_name_qualifier: A JSON string containing the value of the SPNameQualifier attribute on the SAML Assertion Subject as defined in [OASIS.saml-core-2.0-os]. sp_provided_id: A JSON string containing the value of the SPProvidedID attribute on the SAML Assertion Subject as defined in [OASIS.saml-core-2.0-os]. Parecki, et al. Expires 4 May 2027 [Page 12] Internet-Draft ID JWT Authz Grant October 2026 The following is a non-normative example of a sub_id claim using the SAML NameID Subject Identifier Format: "sub_id": { "format": "saml-nameid", "issuer": "https://idp.example.com/exk33qwjcwDda7luK346", "nameid": "foo@example.com", "nameid_format": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", "sp_name_qualifier": "https://resource.example.com/saml/sp" } 3.2.2. Subject Identifier Processing When the Resource Authorization Server resolves users by SAML Assertion Subject , the IdP Authorization Server MAY include a sub_id claim using the SAML NameID Subject Identifier Format (Section 3.2.1). The sub_id claim identifies the same subject as the ID-JAG sub claim, but in the SAML subject namespace used by the Resource Authorization Server for SSO. When constructing a SAML NameID Subject Identifier, the IdP Authorization Server MUST derive its members from the SAML Assertion Subject value it would use for SSO to the target Resource Authorization Server, or from an equivalent configured mapping that records the SAML value and attributes the IdP Authorization Server would issue for that subject and Resource Authorization Server. Each optional field MUST be included exactly when the corresponding attribute is present on that or in the configured mapping. The SAML NameID sub_id MUST identify the same subject as the ID-JAG sub claim. The SAML NameID Subject Identifier is intended to function as a stable, cross-trust-domain identifier for the End-User. The following requirements apply to the SAML value conveyed in this format: Parecki, et al. Expires 4 May 2027 [Page 13] Internet-Draft ID JWT Authz Grant October 2026 * *Stability.* The nameid value MUST be a SAML that the Resource Authorization Server treats as stable for SSO subject resolution. Transient NameID Formats (such as urn:oasis:names:tc:SAML:2.0:nameid-format:transient, defined in Section 8.3.8 of [OASIS.saml-core-2.0-os]) MUST NOT be used, because their values change across sessions and cannot serve as a cross-trust-domain identifier. Other Formats (including emailAddress and persistent) MAY be used. The SAML NameID Subject Identifier inherits the lifecycle and subject-resolution properties of the underlying Format. For example, when emailAddress is used, the same considerations that apply to SAML SSO with mutable email identifiers (changes propagating to the relying party, reassignment risks) apply to the SAML NameID Subject Identifier. * *Identifier scope.* A SAML is unique within the context of the SAML issuer (issuer) and the Service Provider (as scoped by sp_name_qualifier when present), not globally unique within the issuer. NameIDs may be public (a single value for an End-User across all Service Providers) or pairwise (different values per Service Provider). When the IdP Authorization Server issues pairwise NameIDs, the nameid value placed in the SAML NameID Subject Identifier MUST be the value the IdP would issue to the SAML Service Provider corresponding to the target Resource Authorization Server. The IdP Authorization Server MUST maintain the mapping between the OAuth client_id of the Resource Authorization Server and the SAML Service Provider entity ID used for SSO with the corresponding application, so pairwise NameIDs resolve under the correct Service Provider scope. The IdP Authorization Server MUST NOT assume the nameid value identifies the same End-User across different Service Providers without the qualifying scope members. * *Non-NameID subject resolution.* Some SAML deployments resolve users by a SAML attribute outside the element (for example, an attribute in the such as the http://schemas.microsoft.com/identity/claims/objectidentifier attribute used by Microsoft Entra ID). In those deployments, the SAML NameID Subject Identifier is not the correct vehicle. The IdP Authorization Server SHOULD convey the relevant attribute value as an additional claim in the ID-JAG so the Resource Authorization Server can perform subject resolution. The choice of attribute and identifier type is deployment-specific: a SAML Service Provider and Resource Authorization Server may use either pairwise (different values per Service Provider) or public (a single value across Service Providers) identifiers, depending on local needs. Immutable identifiers are preferred. Mutable identifiers (such as emailAddress) MAY be used for subject Parecki, et al. Expires 4 May 2027 [Page 14] Internet-Draft ID JWT Authz Grant October 2026 resolution, subject to the considerations described in the Stability requirement above. When the attribute is pairwise per Service Provider, the IdP Authorization Server MUST use the value scoped to the SAML Service Provider corresponding to the target Resource Authorization Server. The Resource Authorization Server MAY use sub_id for subject resolution when it supports the indicated Subject Identifier Format. The Resource Authorization Server MUST compare every member of the SAML NameID Subject Identifier that is part of the set of identifier fields it uses for subject resolution for that SAML issuer. The Resource Authorization Server MUST NOT resolve the subject using only the nameid value unless local policy explicitly defines nameid alone as the subject identifier for that SAML issuer. In particular, when the SAML Assertion Subject is scoped to a Service Provider, the sp_name_qualifier value is part of the subject namespace. If the Resource Authorization Server requires a SAML NameID Subject Identifier for subject resolution, it MUST reject the token request with an invalid_grant error as defined in Section 5.2 of [RFC6749] if any of the following is true: * the ID-JAG does not contain a sub_id claim using the SAML NameID Subject Identifier Format; * the sub_id claim is malformed or uses a Subject Identifier Format that the Resource Authorization Server does not support; * the sub_id claim is not authorized by local policy for the validated ID-JAG issuer. See Section 9.8 and Section 9.9 for security considerations on the sub_id claim. 4. Cross-Domain Access 4.1. Overview The example flow is for an enterprise acme, which uses a multi-tenant wiki app and chat app from different vendors, both of which are integrated into the enterprise's multi-tenant Identity Provider using OpenID Connect. Enterprise is a common deployment shape for this profile, but it is not the only one. The same pattern applies anywhere the Resource Authorization Server already trusts the issuing IdP for SSO and subject resolution. Parecki, et al. Expires 4 May 2027 [Page 15] Internet-Draft ID JWT Authz Grant October 2026 +=============+========================+=========================+==============+ |Role |App URL |Tenant URL |Description | +=============+========================+=========================+==============+ |Client |https://wiki.example |https://acme.wiki.example|Wiki app that | | | | |embeds content| | | | |from one or | | | | |more resource | | | | |servers | +-------------+------------------------+-------------------------+--------------+ |Resource |https://chat.example |https://acme.chat.example|Authorization | |Authorization| | |Server for a | |Server | | |chat and | | | | |communication | | | | |app | +-------------+------------------------+-------------------------+--------------+ |Identity |https://idp.example |https://acme.idp.example |Enterprise | |Provider | | |Identity | |Authorization| | |Provider | |Server | | | | +-------------+------------------------+-------------------------+--------------+ |Resource |https://api.chat.example|https://api.chat.example |Public API for| |Server | | |the chat and | | | | |communications| | | | |app | +-------------+------------------------+-------------------------+--------------+ Table 1 Sequence Diagram Parecki, et al. Expires 4 May 2027 [Page 16] Internet-Draft ID JWT Authz Grant October 2026 +---------+ +---------------+ +---------------+ +----------+ | | | IdP | | Resource | | Resource | | Client | | Authorization | | Authorization | | Server | | | | Server | | Server | | | +----+----+ +-------+-------+ +-------+-------+ +-----+----+ | | | | | | | | | -----------------> | | | | 1 User SSO | | | | | | | | ID Token & | | | | Refresh Token (Opt)| | | | <- - - - - - - - - | | | | | | | | | | | | | | | | 2 Token Exchange | | | | (Identity Assertion| | | | or Refresh Token) | | | | ----------------> | | | | | | | | ID-JAG | | | | <- - - - - - - - | | | | | | | | | | | | | | | | 3 Present ID-JAG | | | | -------------------+----------------> | | | | | | | Access Token | | | | <- - - - - - - - - - - - - - - - - - -| | | | | | | | | | | | | | | 4 Resource Request with Access Token | | | ------------------------------------------------------> | | | | | | | | | | | | | 1. User authenticates with the IdP Authorization Server, the Client obtains an Identity Assertion (e.g. OpenID Connect ID Token or SAML 2.0 Assertion) for the user and optionally a Refresh Token (when using OpenID Connect) and signs the user in Parecki, et al. Expires 4 May 2027 [Page 17] Internet-Draft ID JWT Authz Grant October 2026 2. Client uses the Identity Assertion or a previously issued Refresh Token from the IdP to request an Identity Assertion JWT Authorization Grant for the Resource Authorization Server from the IdP Authorization Server 3. Client exchanges the Identity Assertion JWT Authorization Grant for an Access Token at the Resource Authorization Server's token endpoint 4. Client makes an API request to the Resource Server with the Access Token This specification is constrained to deployments where the Client has a Relying Party relationship with the IdP Authorization Server for SSO, and the Resource Authorization Server independently trusts that same IdP Authorization Server for SSO and subject resolution for the user represented in the ID-JAG. The IdP Authorization Server provides the trusted identity context that allows the Resource Authorization Server to evaluate the ID-JAG. The Resource Authorization Server not only delegates user authentication to that IdP, but also relies on the IdP-issued grant as input to delegated authorization for the scopes, resources, and authorization details conveyed in the ID-JAG. The Resource Authorization Server does not need to obtain user consent directly from the resource owner again at the token exchange step. The Resource Authorization Server still applies local policy to decide whether to honor the grant, whether to narrow or reject the requested access, and what access token to issue. A deployment MAY trust more than one IdP Authorization Server for this purpose, but for each trusted issuer the Resource Authorization Server MUST be configured to recognize that issuer, resolve identities asserted by that issuer to the appropriate local account or principal, and associate the ID-JAG with the correct client relationship. 4.2. User Authentication The Client initiates an authentication request with the IdP Authorization Server using OpenID Connect or SAML. The following is an example using OpenID Connect 302 Redirect Location: https://acme.idp.example/authorize?response_type=code&scope=openid%20offline_access&client_id=... The user authenticates with the IdP, and is redirected back to the Client with an authorization code, which it can then exchange for an ID Token and optionally a Refresh Token when offline_access scope is requested per [OpenID.Core]. Parecki, et al. Expires 4 May 2027 [Page 18] Internet-Draft ID JWT Authz Grant October 2026 Note: The IdP Authorization Server may enforce security controls such as multi-factor authentication before granting the user access to the Client. POST /token HTTP/1.1 Host: acme.idp.example Content-Type: application/x-www-form-urlencoded grant_type=authorization_code &code=..... HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store { "id_token": "eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ...", "token_type": "Bearer", "access_token": "7SliwCQP1brGdjBtsaMnXo", "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA", "scope": "openid offline_access" } 4.3. Token Exchange The Client makes a Token Exchange [RFC8693] request to the IdP Authorization Server's Token Endpoint with the following parameters: requested_token_type: REQUIRED - The value urn:ietf:params:oauth:token-type:id-jag indicates that an Identity Assertion JWT Authorization Grant is being requested. audience: REQUIRED - The identifier of the Resource Authorization Server, typically in another trust domain, as the intended audience for the ID-JAG. Exactly one audience value is allowed. IdP Authorization Servers MUST support the issuer identifier of the Resource Authorization Server as defined in Section 2 of [RFC8414]. IdP Authorization Servers MAY also support implementation-specific audience values, such as URNs, that identify pre-established trust relationships with Resource Authorization Servers. When such a value is used, the IdP Authorization Server resolves it to the corresponding Resource Authorization Server identifier and issues the ID-JAG with that identifier in the aud claim. resource: RECOMMENDED - The Resource Identifier(s) of the protected Parecki, et al. Expires 4 May 2027 [Page 19] Internet-Draft ID JWT Authz Grant October 2026 resource(s), governed by the Resource Authorization Server identified by audience, for which access is requested, as defined in Section 2 of [RFC8707]. Resource identifiers are compared using Simple String Comparison (Section 6.2.1 of [RFC3986]). A Client that discovered the Resource Authorization Server using Protected Resource Metadata [RFC9728] MUST include the resource value from that metadata unchanged (Section 9.6). scope: OPTIONAL - The space-separated list of scopes at the Resource Server that is being requested. As in Section 2.1 of [RFC8693], these values have the meaning defined by the Resource Authorization Server where the ID-JAG will be used, not their OpenID Connect meaning, so a value such as profile or email does not request identity claims (Section 5.4 of [OpenID.Core]). authorization_details: OPTIONAL - A JSON string containing a JSON array of authorization detail objects as defined in Section 2 of [RFC9396]. This parameter enables Rich Authorization Requests (RAR) support, allowing structured authorization requests beyond simple scope strings. subject_token: REQUIRED - Either the Identity Assertion (e.g. the OpenID Connect ID Token or SAML 2.0 Assertion) for the target resource owner, or a Refresh Token previously issued by the IdP Authorization Server for that resource owner. Implementations of this specification MUST accept Identity Assertions. They MAY additionally accept Refresh Tokens to allow the client to obtain a new ID-JAG without performing a new single sign-on round trip when the Identity Assertion has expired. subject_token_type: REQUIRED - An identifier, as described in Section 3 of [RFC8693], that indicates the type of the security token in the subject_token parameter. For an OpenID Connect ID Token: urn:ietf:params:oauth:token-type:id_token, for a SAML 2.0 Assertion: urn:ietf:params:oauth:token-type:saml2, and for a Refresh Token (when supported): urn:ietf:params:oauth:token- type:refresh_token. When a Refresh Token is used as the subject token, the client still requests requested_token_type=urn:ietf:params:oauth:token-type:id- jag; this allows the client to refresh an Identity Assertion JWT Authorization Grant without fetching a new Identity Assertion from the user-facing SSO flow. actor_token: OPTIONAL - A security token that identifies the actor, as described in Section 2.1 of [RFC8693]. actor_token_type: REQUIRED when actor_token is present, as described Parecki, et al. Expires 4 May 2027 [Page 20] Internet-Draft ID JWT Authz Grant October 2026 in Section 2.1 of [RFC8693] - An identifier, as described in Section 3 of [RFC8693], that indicates the type of the security token in the actor_token parameter. This specification does not define normative processing requirements for actor_token or whether an act claim is included in the issued ID- JAG. Future profiles or extensions MAY define how actor_token is validated, how it influences policy evaluation, and whether it results in an act claim in the issued ID-JAG. This specification profiles the audience and resource parameters of OAuth 2.0 Token Exchange [RFC8693] for interoperable use with ID-JAG. In this profile, audience identifies the Resource Authorization Server to which the ID-JAG is issued, and resource identifies the protected resource for which access is requested. This profile uses audience for the Resource Authorization Server rather than defining a new parameter. The ID-JAG is issued by the IdP Authorization Server for processing by the Resource Authorization Server, and the Resource Authorization Server validates the aud claim to determine whether the ID-JAG was issued for it. The resource parameter continues to identify the protected resource, as defined in [RFC8707]. This convention provides a single interoperable interpretation of audience and resource, including deployments in which one Resource Authorization Server governs multiple protected resources or tenant- specific resources. For example, if a SaaS provider operates a Resource Authorization Server at https://authorization-server.saas-tool.example/ and protected resources at https://api.saas-tool.example/files and https://api.saas-tool.example/messages, a client requesting access to the Files API uses: audience=https://authorization-server.saas-tool.example/ resource=https://api.saas-tool.example/files If a Resource Authorization Server at https://login.saas- tool.example/ governs tenant-specific resources such as https://api.saas-tool.example/acme/ and https://api.saas- tool.example/fabrikam/, the audience value remains the Resource Authorization Server identifier and the resource value distinguishes the protected resource. For example: audience=https://login.saas-tool.example/ resource=https://api.saas-tool.example/acme/ and: Parecki, et al. Expires 4 May 2027 [Page 21] Internet-Draft ID JWT Authz Grant October 2026 audience=https://login.saas-tool.example/ resource=https://api.saas-tool.example/fabrikam/ If the IdP Authorization Server supports an implementation-specific audience value such as urn:example:idp:saas-tool for that same Resource Authorization Server, the client MAY send: audience=urn:example:idp:saas-tool resource=https://api.saas-tool.example/files In that case, the IdP Authorization Server resolves the requested audience value to https://authorization-server.saas-tool.example/ and issues the ID-JAG with aud set to https://authorization-server.saas- tool.example/. Client authentication to the Resource Authorization Server is done using the standard mechanisms provided by OAuth 2.0. Section 2.3.1 of [RFC6749] defines password-based authentication of the client (client_id and client_secret), however, client authentication is extensible and other mechanisms are possible. For example, [RFC7523] defines client authentication using bearer JSON Web Tokens using client_assertion and client_assertion_type. 4.3.1. Example: Token Exchange using ID Token This example uses an ID Token as the subject_token and a JWT Bearer Assertion [RFC7523] for client authentication (tokens truncated for brevity): POST /oauth2/token HTTP/1.1 Host: acme.idp.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:token-exchange &requested_token_type=urn:ietf:params:oauth:token-type:id-jag &audience=https://acme.chat.example/ &resource=https://api.chat.example/ &scope=chat.read+chat.history &subject_token=eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ... &subject_token_type=urn:ietf:params:oauth:token-type:id_token &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion=eyJhbGciOiJSUzI1NiIsImtpZCI6IjIyIn0... 4.3.2. Example: Token Exchange using Refresh Token This non-normative example shows using a Refresh Token as the subject_token (when supported by the IdP Authorization Server) to obtain an ID-JAG without acquiring a new Identity Assertion: Parecki, et al. Expires 4 May 2027 [Page 22] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token HTTP/1.1 Host: acme.idp.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:token-exchange &requested_token_type=urn:ietf:params:oauth:token-type:id-jag &audience=https://acme.chat.example/ &resource=https://api.chat.example/ &scope=chat.read+chat.history &subject_token=tGzv3JOkF0XG5Qx2TlKWIA &subject_token_type=urn:ietf:params:oauth:token-type:refresh_token &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion=eyJhbGciOiJSUzI1NiIsImtpZCI6IjIyIn0... 4.3.3. Processing Rules The IdP MUST authenticate the Client, and MUST reject a request without client authentication with invalid_client (Section 5.2 of [RFC6749]). The IdP MUST validate the subject token: * The IdP MUST determine that the subject_token is in fact a token of the type indicated by subject_token_type, and that the IdP issued it for that purpose. A token that the IdP issued for a different purpose, such as an access token, an ID-JAG, or a client assertion, MUST NOT be accepted as an Identity Assertion. * If the subject token is an Identity Assertion, the IdP MUST validate the assertion and MUST validate that the audience of the assertion (e.g. the aud claim of the ID Token or SAML Audience) matches the client_id of the client authentication of the request. * If the subject token is a Refresh Token, the IdP MUST validate it the same way it would for a standard refresh_token grant at the token endpoint: the token is issued by the IdP, bound to the authenticated client, unexpired, not revoked, and not restricted by the IdP from the requested audience, resources, or scopes. The scope comparison in Section 6 of [RFC6749] applies only when audience identifies the IdP Authorization Server itself (Section 9.4). For any other Authorization Server, the requested scope and authorization_details have that server's meaning (Section 4.3), not the IdP's, so the IdP evaluates them by policy as for any other Token Exchange request. Parecki, et al. Expires 4 May 2027 [Page 23] Internet-Draft ID JWT Authz Grant October 2026 * If the subject token is a Refresh Token, the IdP Authorization Server SHOULD retrieve or assemble the subject's claims needed for the ID-JAG in the same way it would when issuing a new Identity Assertion during a token request, so that the resulting ID-JAG reflects current subject attributes and policy. Determining that a JWT is an ID Token requires care, because OpenID Connect Core [OpenID.Core] does not define an explicit typ header value for ID Tokens, so an ID Token cannot be positively identified from its header alone. The IdP MUST reject the request if the subject_token carries a typ header that identifies a different type of token, such as the access token type defined in [RFC9068] or the ID-JAG type defined in Section 3. Because the IdP issued the subject_token itself, this determination is made entirely within the IdP's own trust domain and does not depend on interoperable agreement with any other party, so the IdP MAY use deployment-specific means to positively identify the token as an ID Token, such as a claim that the IdP includes in the ID Tokens it issues, a signing key or key set reserved for ID Tokens, or an internal record of the type of each token it issued. Explicit typing of JWTs, as recommended in Section 3.11 of [RFC8725], avoids this ambiguity where an explicit type is defined. For a SAML 2.0 Assertion, the IdP MUST likewise confirm that the assertion is one it issued as an authentication assertion for the subject, and not a SAML assertion or protocol message it issued for a different purpose. If an actor_token is present, any processing of it is outside the scope of this specification. Future profiles or extensions MAY define validation requirements, policy evaluation rules, and issued token content related to actor_token. The IdP Authorization Server evaluates administrator-defined policy for the token exchange request and determines if the client should be granted access to act on behalf of the subject for the target audience, resources, scopes, and authorization details. If the request contains more than one audience value, the IdP MUST respond with invalid_request. If audience does not identify a Resource Authorization Server with which the IdP has a trust relationship, the IdP MUST respond with invalid_target (Section 2.2.2 of [RFC8693]). When processing the request: * If resource is present, the IdP MUST process it as defined in Section 2 of [RFC8707] and MAY grant a subset of the requested resources based on policy. The IdP SHOULD respond with invalid_target (Section 2.2.2 of [RFC8693]) if any requested Parecki, et al. Expires 4 May 2027 [Page 24] Internet-Draft ID JWT Authz Grant October 2026 resource is not governed by the Resource Authorization Server identified by audience, and MUST respond with invalid_target if it grants none of them. * If resource is absent, the IdP MAY select one or more default resources governed by the Resource Authorization Server identified by audience, based on policy, client configuration, or other request context. The IdP MAY require the client to include resource; if the parameter is required and absent, the IdP MUST respond with invalid_target as defined in Section 2 of [RFC8707]. If no default is selected, the issued ID-JAG is not restricted to a specific protected resource, though it remains restricted to the Resource Authorization Server identified by audience. * If scope is present, the IdP MUST process it according to Section 3.3 of [RFC6749] and evaluate policy to determine the granted scopes. The granted scopes MAY be a subset of the requested scopes based on policy. * If authorization_details is present, the IdP MUST parse it as a JSON array and process each authorization detail object according to [RFC9396]. The IdP evaluates policy for each authorization detail and determines which authorization details to include in the issued ID-JAG. The IdP MAY modify, filter, or omit authorization details based on policy. * If both resource and authorization_details are present, the IdP MUST process both. The IdP SHOULD ensure consistency between the resource identifiers and authorization details, as they may represent overlapping authorization requests. The IdP MAY derive resource identifiers from authorization details or vice versa, or process them independently based on policy. * If both scope and authorization_details are present, the IdP MUST process both. The IdP SHOULD ensure consistency between the scopes and authorization details, as they may represent overlapping authorization requests. The IdP MAY derive scopes from authorization details or vice versa, or process them independently based on policy. * The IdP MUST include the granted values, if any, in the resource, scope, and authorization_details claims of the issued ID-JAG, even when they differ from the requested values. Each requested resource identifier that the IdP grants MUST appear in the resource claim exactly as the Client sent it. How the IdP learns which protected resources each Resource Authorization Server governs is out of scope for this specification. Parecki, et al. Expires 4 May 2027 [Page 25] Internet-Draft ID JWT Authz Grant October 2026 The IdP may also introspect the authentication context described in the SSO assertion to determine if step-up authentication is required. 4.3.4. Response If access is granted, the IdP creates a signed Identity Assertion JWT Authorization Grant (Section 3) and returns it in the token exchange response defined in Section 2.2 of [RFC8693]: HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "issued_token_type": "urn:ietf:params:oauth:token-type:id-jag", "access_token": "eyJhbGciOiJSUzI1NiIsI...", "token_type": "N_A", "scope": "chat.read chat.history", "expires_in": 300 } issued_token_type: REQUIRED - urn:ietf:params:oauth:token-type:id- jag access_token: REQUIRED - The Identity Assertion JWT Authorization Grant. (Note: Token Exchange requires the access_token response parameter for historical reasons, even though this is not an OAuth access token.) token_type: REQUIRED - N_A (because this is not an OAuth access token.) scope: OPTIONAL if the scope of the issued token is identical to the scope requested by the client; otherwise, it is REQUIRED. Various policies in the IdP may result in different scopes being issued from the scopes the application requested. authorization_details: OPTIONAL - A JSON array of authorization detail objects as defined in Section 7 of [RFC9396]. This parameter MUST be included if the client requested authorization details and the IdP granted authorization details that differ from what was requested, or if the IdP modified the authorization details. expires_in: RECOMMENDED - The lifetime in seconds of the authorization grant. Parecki, et al. Expires 4 May 2027 [Page 26] Internet-Draft ID JWT Authz Grant October 2026 refresh_token: OPTIONAL according to Section 2.2.1 of [RFC8693]. In the context of this specification, this parameter SHOULD NOT be used. 4.3.4.1. Issued Identity Assertion JWT Authorization Grant The following is a non-normative example of the issued token { "typ": "oauth-id-jag+jwt" } . { "jti": "9e43f81b64a33f20116179", "iss": "https://acme.idp.example/", "sub": "U019488227", "aud": "https://acme.chat.example/", "client_id": "f53f191f9311af35", "exp": 1311281270, "iat": 1311280970, "resource": "https://api.chat.example/", "scope": "chat.read chat.history", "auth_time": 1311280970, "amr": [ "mfa", "phrh", "hwk", "user" ] } . signature 4.3.4.2. Example with Rich Authorization Requests (RAR) The following is a non-normative example demonstrating the use of Rich Authorization Requests (RAR) [RFC9396] with ID-JAG: Token Exchange Request with authorization_details: Parecki, et al. Expires 4 May 2027 [Page 27] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token HTTP/1.1 Host: acme.idp.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:token-exchange &requested_token_type=urn:ietf:params:oauth:token-type:id-jag &audience=https://acme.chat.example/ &authorization_details=[{"type":"chat_read","actions":["read"],"locations":["https://api.chat.example/channels"]},{"type":"chat_history","actions":["read"],"datatypes":["message"]}] &subject_token=eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ... &subject_token_type=urn:ietf:params:oauth:token-type:id_token &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion=eyJhbGciOiJSUzI1NiIsImtpZCI6IjIyIn0... Token Exchange Response: HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "issued_token_type": "urn:ietf:params:oauth:token-type:id-jag", "access_token": "eyJhbGciOiJSUzI1NiIsI...", "token_type": "N_A", "authorization_details": [ { "type": "chat_read", "actions": ["read"], "locations": ["https://api.chat.example/channels"] }, { "type": "chat_history", "actions": ["read"], "datatypes": ["message"] } ], "expires_in": 300 } Issued Identity Assertion JWT Authorization Grant with authorization_details: Parecki, et al. Expires 4 May 2027 [Page 28] Internet-Draft ID JWT Authz Grant October 2026 { "typ": "oauth-id-jag+jwt" } . { "jti": "9e43f81b64a33f20116179", "iss": "https://acme.idp.example/", "sub": "U019488227", "aud": "https://acme.chat.example/", "client_id": "f53f191f9311af35", "exp": 1311281270, "iat": 1311280970, "authorization_details": [ { "type": "chat_read", "actions": ["read"], "locations": ["https://api.chat.example/channels"] }, { "type": "chat_history", "actions": ["read"], "datatypes": ["message"] } ], "auth_time": 1311280970 } . signature Access Token Request: POST /oauth2/token HTTP/1.1 Host: acme.chat.example Authorization: Basic yZS1yYW5kb20tc2VjcmV0v3JOkF0XG5Qx2 Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer &assertion=eyJhbGciOiJSUzI1NiIsI... Access Token Response: Parecki, et al. Expires 4 May 2027 [Page 29] Internet-Draft ID JWT Authz Grant October 2026 HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "token_type": "Bearer", "access_token": "2YotnFZFEjr1zCsicMWpAA", "expires_in": 86400, "authorization_details": [ { "type": "chat_read", "actions": ["read"], "locations": ["https://api.chat.example/channels"] }, { "type": "chat_history", "actions": ["read"], "datatypes": ["message"] } ] } 4.3.4.3. Error Response On error, the IdP Authorization Server returns an OAuth 2.0 Token Error response as defined in Section 5.2 of [RFC6749]. Any OAuth error code MAY be returned; this specification profiles the following codes for interoperability: * invalid_request: the subject token failed validation (for example expired, malformed, audience mismatch, or a Refresh Token is expired or revoked), as required by Section 2.2.2 of [RFC8693]. A Client that receives invalid_request for a request that previously succeeded can obtain a new subject token and retry. { "error": "invalid_request", "error_description": "Audience validation failed" } * access_denied: the subject token is valid but the Client or End- User is not authorized to obtain an ID-JAG for the target Resource Authorization Server. A re-issued subject token will not resolve the error. Remediation is defined by the IdP Authorization Server operator's app assignment, access-request, or entitlement process, such as an Identity Governance and Administration (IGA) workflow. This profile uses access_denied here rather than invalid_target Parecki, et al. Expires 4 May 2027 [Page 30] Internet-Draft ID JWT Authz Grant October 2026 (Section 2.2.2 of [RFC8693]), so that the Client can tell a target it is not allowed to use from one the IdP Authorization Server does not recognize. { "error": "access_denied", "error_description": "Client is not authorized to access the target Resource Authorization Server" } * invalid_target: the audience does not identify a Resource Authorization Server with which the IdP Authorization Server has a trust relationship, or a requested resource is not governed by that Resource Authorization Server (Section 4.3). A re-issued subject token will not resolve the error; the Client needs to change the request. { "error": "invalid_target", "error_description": "Resource not governed by audience" } 4.4. Access Token Request The Client makes an access token request to the Resource Authorization Server's token endpoint using the previously obtained Identity Assertion JWT Authorization Grant as a JWT Bearer Assertion as defined by [RFC7523]. grant_type: REQUIRED - urn:ietf:params:oauth:grant-type:jwt-bearer, or urn:ietf:params:oauth:grant-type:jwt-dpop ([I-D.parecki-oauth-jwt-dpop-grant]) when the ID-JAG is bound to a DPoP key (Section 9.11.1). assertion: REQUIRED - The Identity Assertion JWT Authorization Grant obtained in the previous token exchange step The Client authenticates with its credentials as registered with the Resource Authorization Server. The Resource Authorization Server SHOULD require client authentication. It MUST reject a request that has neither client authentication nor a sender-constrained ID-JAG (Section 9.11) with invalid_client (Section 5.2 of [RFC6749]). See Section 9.1 for the trade-off. For example: Parecki, et al. Expires 4 May 2027 [Page 31] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token HTTP/1.1 Host: acme.chat.example Authorization: Basic yZS1yYW5kb20tc2VjcmV0v3JOkF0XG5Qx2 Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer &assertion=eyJhbGciOiJSUzI1NiIsI... 4.4.1. Processing Rules All of Section 5.2 of [RFC7521] applies, in addition to the following processing rules: * Validate the JWT typ is oauth-id-jag+jwt (per Section 3.11 of [RFC8725]) * The Resource Authorization Server MUST reject the ID-JAG with an invalid_grant error if the iss claim does not identify an IdP Authorization Server it trusts. It SHOULD obtain that issuer's keys from the jwks_uri in the issuer's metadata (Section 7.1). It validates the signature as required by Section 5.2 of [RFC7521], accepting only the algorithms it allows for that issuer (Section 3.1 of [RFC8725]). * If the issuer is multi-tenant, the Resource Authorization Server MUST reject the ID-JAG with an invalid_grant error unless the tenant claim is present and the Resource Authorization Server trusts iss and tenant together for the recipient tenant. The recipient tenant is identified by aud, by aud_tenant when present, or by the Resource Authorization Server's trust relationship with the issuer. If the Resource Authorization Server cannot determine the recipient tenant unambiguously, it MUST reject the ID-JAG with an invalid_grant error. It MUST resolve the subject only within the recipient tenant. * The Resource Authorization Server MUST validate the aud (audience) claim of the ID-JAG. The aud claim MUST contain the issuer identifier of the Resource Authorization Server as defined in [RFC8414]. The aud claim MAY be a string containing a single issuer identifier, or an array containing a single issuer identifier. If the aud claim is an array, it MUST contain exactly one element, and that element MUST be the issuer identifier of the Resource Authorization Server. If the aud claim does not match the Resource Authorization Server's issuer identifier, the Resource Authorization Server MUST reject the JWT with an invalid_grant error as defined in Section 5.2 of [RFC6749]. This validation prevents audience injection attacks and ensures the ID- JAG was intended for this specific Resource Authorization Server. Parecki, et al. Expires 4 May 2027 [Page 32] Internet-Draft ID JWT Authz Grant October 2026 * If the Client authenticates, the Resource Authorization Server MUST reject the request with an invalid_grant error unless the client_id claim identifies the authenticated client. If the Client does not authenticate, proof of possession of the key in the cnf claim (Section 9.11) takes the place of this check, and the client_id claim identifies the Client. This client continuity check preserves the OAuth client binding across the exchange, but does not by itself identify or authenticate any actor represented in an act claim. * If the ID-JAG contains a cnf claim, the Resource Authorization Server verifies proof of possession as described in Section 9.11. * If the Resource Authorization Server uses the sub_id claim for subject resolution, it MUST process the claim according to the indicated Subject Identifier Format. For SAML NameID subject identifiers, the Resource Authorization Server MUST apply the processing rules in Section 3.2.2. When processing authorization information from the ID-JAG: * If the resource claim is present, each identifier MUST be a protected resource governed by this Resource Authorization Server for the tenant identified by aud_tenant when present, otherwise for the tenant it associates with the issuing IdP (Section 6), compared as described in Section 4.3. If any identifier is not, the Resource Authorization Server MUST reject the request with invalid_grant as defined in Section 5.2 of [RFC6749], because the ID-JAG was not issued for resources it governs. The access token MUST be restricted to resources in the resource claim, and SHOULD be audience-restricted to them (Section 2 of [RFC8707]). The Resource Authorization Server MAY restrict it to a subset based on local policy, and MUST reject the request with access_denied (Section 4.4.3) if none of the resources are acceptable. * If the resource claim is absent, the Resource Authorization Server MAY select one or more default resources based on policy, client configuration, or other request context. It MAY require the ID- JAG to contain a resource claim; if the claim is required and absent, it MUST reject the request with invalid_grant as defined in Section 5.2 of [RFC6749]. * If the scope claim is present, the Resource Authorization Server MUST process it according to Section 3.3 of [RFC6749]. The Resource Authorization Server evaluates the scopes and determines which scopes to grant in the access token based on policy. The granted scopes MAY be a subset of the scopes in the ID-JAG issued by the IdP Authorization Server. Parecki, et al. Expires 4 May 2027 [Page 33] Internet-Draft ID JWT Authz Grant October 2026 * If the authorization_details claim is present, the Resource Authorization Server MUST parse it as a JSON array and process each authorization detail object according to [RFC9396]. The Resource Authorization Server evaluates policy for each authorization detail and determines which authorization details to grant. The Resource Authorization Server MAY modify, filter, or omit authorization details based on policy. * If both resource and authorization_details claims are present, the Resource Authorization Server MUST process both. The Resource Authorization Server SHOULD ensure consistency between the resource identifiers and authorization details when issuing the access token. The Resource Authorization Server MAY derive resource identifiers from authorization details or vice versa, or process them independently based on policy. Any resource identifiers it derives MUST be among those in the resource claim. * If both scope and authorization_details claims are present, the Resource Authorization Server MUST process both. The Resource Authorization Server SHOULD ensure consistency between the scopes and authorization details when issuing the access token. The Resource Authorization Server MAY derive scopes from authorization details or vice versa, or process them independently based on policy. * The Resource Authorization Server MUST include the granted scope (if any) and authorization_details (if any) in the access token response. The response format follows Section 5.1 of [RFC6749] for scope and Section 7 of [RFC9396] for authorization_details. 4.4.2. Response The Resource Authorization Server's token endpoint responds with an OAuth 2.0 Token Response, e.g.: HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "token_type": "Bearer", "access_token": "2YotnFZFEjr1zCsicMWpAA", "expires_in": 86400, "scope": "chat.read chat.history" } Parecki, et al. Expires 4 May 2027 [Page 34] Internet-Draft ID JWT Authz Grant October 2026 4.4.3. Error Response On error, the Resource Authorization Server returns an OAuth 2.0 Token Error response as defined in Section 5.2 of [RFC6749]. Any OAuth error code MAY be returned; this specification profiles the following two codes for interoperability: * invalid_grant: the ID-JAG failed a validation rule in Section 4.4 (for example signature, aud, client_id, exp, typ, decryption, or cnf binding). A re-issued ID-JAG may resolve the error. { "error": "invalid_grant", "error_description": "Audience validation failed" } * access_denied: the ID-JAG is valid but the End-User or Client is not authorized at the Resource Authorization Server (for example the End-User lacks a license, entitlement, or provisioning record, or is denied by the Resource Authorization Server's policy or role/permission assignments). A re-issued ID-JAG will not resolve the error. Remediation is defined by the Resource Authorization Server operator's access-request, entitlement, or provisioning process, such as an Identity Governance and Administration (IGA) workflow. { "error": "access_denied", "error_description": "The end-user is not licensed for this application" } 4.4.4. Refresh Token The Resource Authorization Server SHOULD NOT return a Refresh Token when an Identity Assertion JWT Authorization Grant is exchanged for an Access Token per Section 5.4 of [I-D.ietf-oauth-identity-chaining]. When the access token has expired, clients MAY re-submit the original Identity Assertion JWT Authorization Grant to obtain a new Access Token. The ID-JAG replaces the use of Refresh Token for the Resource Authorization Server. However, the Resource Authorization Server can reject an ID-JAG with an exp longer than its policy allows, or accept each ID-JAG only once by tracking its jti (Section 3 of [RFC7523]). If the ID-JAG has expired, or the Resource Authorization Server rejects a re-submitted ID-JAG with an invalid_grant error, the Client SHOULD request a new ID-JAG from the IdP Authorization Server using Parecki, et al. Expires 4 May 2027 [Page 35] Internet-Draft ID JWT Authz Grant October 2026 the original Identity Assertion from the IdP (e.g ID Token) before presenting it to the Resource Authorization Server. If the Resource Authorization Server also rejects the new ID-JAG, requesting another will not resolve the error. If the ID Token is expired, the Client MAY use the Refresh Token obtained from the IdP during SSO to obtain a new ID Token which it can exchange for a new ID-JAG. If the Client is unable to obtain a new Identity Assertion with a Refresh Token then it SHOULD re- authenticate the user by redirecting to the IdP. If the IdP Authorization Server supports Refresh Tokens as a subject_token in Token Exchange, the client can skip renewing the Identity Assertion and directly request a new ID-JAG by presenting the Refresh Token (see Section 4.3.2). 4.5. SAML 2.0 Subject Token Interoperability Clients using SAML 2.0 for SSO with the IdP Authorization Server can obtain an ID-JAG without changing their SSO protocol to OpenID Connect by first exchanging the SAML 2.0 assertion for a Refresh Token using Token Exchange. This enables protocol transition to OAuth and allows the client to later use the Refresh Token as a subject_token to obtain an ID-JAG without prompting the user for a new Identity Assertion. The OpenID Connect scopes openid offline_access SHOULD be requested (additional scopes are allowed) when requesting a Refresh Token from the IdP Authorization Server. The IdP Authorization Server MUST map the SAML Audience to a Client ID and ensure the client's authentication matches that mapping before issuing the Refresh Token. The following non-normative example shows a SAML 2.0 assertion where the Audience value (from AudienceRestriction) corresponds to the Service Provider Entity ID (SPAuthority / SPEntityID) and MUST be mapped to the OAuth Client ID that the IdP Authorization Server associates with that SAML SP registration. Parecki, et al. Expires 4 May 2027 [Page 36] Internet-Draft ID JWT Authz Grant October 2026 https://idp.example.com/ alice@example.com https://client.example.com/sp-entity-id Alice urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport When this assertion is used as the subject_token in Token Exchange, the IdP Authorization Server MUST verify that the Audience / SPEntityID maps to the OAuth Client ID that is authenticated for the token request. This prevents a client from presenting an assertion issued for a different SAML SP. Parecki, et al. Expires 4 May 2027 [Page 37] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token HTTP/1.1 Host: acme.idp.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:token-exchange &requested_token_type=urn:ietf:params:oauth:token-type:refresh_token &scope=openid+offline_access+email &subject_token=PHNhbWxwOkFzc2VydGlvbiB4bWxuczp...c2FtbDppc3N1ZXI+PC9zYW1sOkFzc2VydGlvbj4= &subject_token_type=urn:ietf:params:oauth:token-type:saml2 &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion=eyJhbGciOiJSUzI1NiIsImtpZCI6IjIyIn0... HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "issued_token_type": "urn:ietf:params:oauth:token-type:refresh_token", "access_token": "vF9dft4qmTcXkZ26zL8b6u", "token_type": "N_A", "scope": "openid offline_access email", "expires_in": 1209600 } 5. Cross-Domain Client and Subject Identifier Handling There are three separate OAuth/OpenID Connect/SAML relationships involved in this flow: * Client to IdP Authorization Server (OpenID Connect or SAML) * Client to Resource Authorization Server (OAuth) * Resource Authorization Server to IdP Authorization Server (OpenID Connect or SAML) Each relationship is typically represented by independent client registrations between each party. For example, the IdP Authorization Server typically issues a Client ID for both the Client and Resource Authorization Server to use for single sign-on with OpenID Connect as a Relying Party. Similarly, the Resource Authorization Server typically issues a Client ID for the Client to use for API access to the Resource Server. The Client may choose to use different client credentials with each registration. Parecki, et al. Expires 4 May 2027 [Page 38] Internet-Draft ID JWT Authz Grant October 2026 5.1. Client ID Mapping In this flow, the IdP Authorization Server accepts a Token Exchange request from the Client, and issues an ID-JAG that will be consumed by the Resource Authorization Server. This means the IdP Authorization Server needs to know about the relationship between the Client and the Resource Authorization Server, in order to include a client_id claim in the ID-JAG that will be recognized by the Resource Authorization Server. This can be handled by the IdP Authorization Server maintaining a record of each client_id used between Clients and Resource Authorization Servers, which will need to be obtained by out-of-band mechanisms. The Client still needs to authenticate using its registered credential with the Resource Authorization Server when presenting the ID-JAG for the mapped client_id. Requiring a confidential client helps to prevent the IdP Authorization Server from delegating access to any of the valid clients for the Resource Authorization Server. Alternatively, if clients use "Client ID Metadata Document" [I-D.ietf-oauth-client-id-metadata-document] as their client identifiers, this acts as a shared global namespace of Client IDs and removes the need for the IdP Authorization Server to maintain a mapping of each client registration. 5.2. Subject Identifier Mapping The IdP Authorization Server selects the subject identifiers in the ID-JAG for the Resource Authorization Server identified by the aud claim, not for the Client. The same user can have a pairwise subject identifier issued in an ID Token for SSO to the Client and another with SSO to the Resource Authorization Server as a Relying Party, and the Resource Authorization Server needs consistent subject identifiers for subject resolution across both SSO and API access. Parecki, et al. Expires 4 May 2027 [Page 39] Internet-Draft ID JWT Authz Grant October 2026 The IdP Authorization Server MUST include the same sub value for a given End-User in every ID-JAG it issues for the same Resource Authorization Server and, when present, the same aud_tenant, regardless of which Client requested it. When the Resource Authorization Server uses OpenID Connect for SSO with the IdP Authorization Server, that value MUST be the sub the IdP Authorization Server would include in an ID Token issued to the Resource Authorization Server as a Relying Party. This requires the IdP Authorization Server to know which Relying Party registration corresponds to the Resource Authorization Server's issuer identifier, a mapping established out of band like the client_id mapping in Section 5.1. When pairwise subject identifiers are used, the sub claim of the ID-JAG can differ from the sub claim of the Client's ID Token (see Section 9.9). When the Resource Authorization Server uses a different subject namespace for SSO, such as a SAML Assertion Subject namespace, see the sub_id claim and Section 3.2. 6. Tenant Relationships with Issuer and Client ID In multi-tenant deployments, the relationship between tenants, issuers, and client identifiers is critical for proper identity and authorization management. This section explains how these components relate to each other in the context of Identity Assertion JWT Authorization Grants. 6.1. Issuer and Tenant Relationship An Authorization Server may operate as either a single-tenant or multi-tenant issuer: * *Single-tenant issuer*: The issuer identifier (iss) uniquely identifies both the Authorization Server and the tenant. All clients and users belong to a single tenant context. The issuer identifier alone is sufficient to identify the tenant. * *Multi-tenant issuer*: The issuer identifier (iss) identifies the Authorization Server, but multiple tenants may be hosted by the same issuer. In this case, the tenant identifier (tenant) claim is used in conjunction with the issuer identifier to uniquely identify the tenant context. The combination of iss + tenant uniquely identifies the tenant. When an IdP Authorization Server issues an ID-JAG, it MUST include the tenant claim if the issuer is multi-tenant. The tenant value identifies the End-User's tenant at the issuer. Parecki, et al. Expires 4 May 2027 [Page 40] Internet-Draft ID JWT Authz Grant October 2026 6.2. Client ID and Tenant Relationship The relationship between client_id and tenant depends on the deployment model: * *Tenant-scoped client identifiers*: In some deployments, the client_id is unique only within a tenant context. The same client_id value may exist in different tenants, and the combination of the Resource Authorization Server tenant and client_id uniquely identifies the client registration. * *Global client identifiers*: In other deployments, the client_id is globally unique across all tenants. The client_id alone uniquely identifies the client, regardless of tenant context. The IdP Authorization Server MUST understand the client identifier model used by the Resource Authorization Server when including the client_id claim in an ID-JAG. For tenant-scoped client identifiers, the IdP MUST ensure that the client_id included in the ID-JAG is valid within the Resource Authorization Server tenant for which the ID-JAG is issued (identified by aud_tenant, when present). 6.3. Subject Identifier Uniqueness with Tenants As specified in Section 3, subject identifiers (sub) have different uniqueness requirements based on tenant configuration: * For single-tenant issuers: The subject identifier MUST be unique when scoped with issuer (iss + sub). * For multi-tenant issuers: The subject identifier MUST be unique when scoped with issuer and tenant (iss + tenant + sub). The IdP Authorization Server MUST ensure that the sub claim in the ID-JAG follows the appropriate uniqueness rules for the target Resource Authorization Server. 6.4. Tenant Context in Token Exchange When a Client requests an ID-JAG via Token Exchange, the IdP Authorization Server determines the value of each tenant claim it includes: * tenant: the issuer tenant, which is the End-User's tenant, from the subject token. The subject token was issued to the authenticated Client in that tenant. Parecki, et al. Expires 4 May 2027 [Page 41] Internet-Draft ID JWT Authz Grant October 2026 * aud_tenant: the Resource Authorization Server tenant, from the requested audience and resource and the issuer tenant's configuration for that Resource Authorization Server. The IdP Authorization Server selects client_id (Section 6.2), sub (Section 5.2), and aud_sub for that tenant. 7. Authorization Server Metadata There are two complementary metadata parameters that can be used by the two different authorization servers. identity_chaining_requested_token_types_supported indicates which token types an IdP Authorization Server can issue for identity chaining, while authorization_grant_profiles_supported indicates which authorization grant profiles a Resource Authorization Server can process. 7.1. IdP Authorization Server Metadata An IdP Authorization Server can advertise the identity chaining token types it can issue in its OAuth Authorization Server Metadata [RFC8414]. Identity and Authorization Chaining Across Domains [I-D.ietf-oauth-identity-chaining] defines the identity_chaining_requested_token_types_supported metadata parameter for this purpose. To advertise support for issuing an Identity Assertion JWT Authorization Grant via Token Exchange, the IdP Authorization Server SHOULD include the following value in identity_chaining_requested_token_types_supported: urn:ietf:params:oauth:token-type:id-jag The IdP Authorization Server SHOULD sign ID-JAGs with a key published at the jwks_uri in its metadata, located from its issuer identifier as described in Section 3 of [RFC8414]. A Resource Authorization Server that cannot retrieve metadata from that location MAY fall back to Section 4 of [OpenID.Discovery], as described in Section 5 of [RFC8414]. The IdP Authorization Server can also advertise the algorithms it uses to sign ID-JAGs: id_jag_signing_alg_values_supported: OPTIONAL. JSON array Parecki, et al. Expires 4 May 2027 [Page 42] Internet-Draft ID JWT Authz Grant October 2026 containing a list of the JWS signing algorithms (alg values) supported by the IdP Authorization Server for signing ID-JAGs. If present, the list MUST include RS256. id_token_signing_alg_values_supported [OpenID.Discovery] does not describe ID-JAGs, which the IdP Authorization Server can sign differently from ID Tokens. 7.2. Resource Authorization Server Metadata A Resource Authorization Server can advertise support for authorization grant profiles in its OAuth Authorization Server Metadata [RFC8414] using the authorization_grant_profiles_supported metadata parameter. The value of authorization_grant_profiles_supported MUST be a JSON array of strings. Each string MUST identify a supported authorization grant profile. Inclusion of a profile identifier in authorization_grant_profiles_supported indicates only that the Resource Authorization Server implements the processing rules for that profile. It does not indicate that any particular issuer, tenant, client, subject, audience, or authorization request will be accepted. To advertise support for the Identity Assertion JWT Authorization Grant profile, the Resource Authorization Server SHOULD include the following value in the authorization_grant_profiles_supported property: urn:ietf:params:oauth:grant-profile:id-jag A Resource Authorization Server that includes urn:ietf:params:oauth:grant-profile:id-jag in authorization_grant_profiles_supported for this specification MUST also include urn:ietf:params:oauth:grant-type:jwt-bearer in grant_types_supported. 8. Client Metadata A client can advertise support for authorization grant profiles in its client metadata using the authorization_grant_profiles_supported parameter. This parameter MAY be registered via OAuth 2.0 Dynamic Client Registration [RFC7591] or published in a Client ID Metadata Document [I-D.ietf-oauth-client-id-metadata-document]. Parecki, et al. Expires 4 May 2027 [Page 43] Internet-Draft ID JWT Authz Grant October 2026 The value of authorization_grant_profiles_supported MUST be a JSON array of strings. Each string MUST identify an authorization grant profile that the client implements. Inclusion of a profile identifier in authorization_grant_profiles_supported indicates only that the client implements the processing rules for that profile. It does not indicate that any particular IdP Authorization Server, Resource Authorization Server, audience, resource, or scope will be requested. To advertise support for the Identity Assertion JWT Authorization Grant profile, the client SHOULD include the following value in the authorization_grant_profiles_supported property: urn:ietf:params:oauth:grant-profile:id-jag A client that includes urn:ietf:params:oauth:grant-profile:id-jag in authorization_grant_profiles_supported for this specification MUST also include both urn:ietf:params:oauth:grant-type:token-exchange and urn:ietf:params:oauth:grant-type:jwt-bearer in its grant_types, since the client uses Token Exchange to obtain the ID-JAG from the IdP Authorization Server and the JWT Bearer Token grant to redeem it at the Resource Authorization Server. 9. Security Considerations 9.1. Client Authentication The IdP Authorization Server always authenticates the Client (Section 4.3). The Resource Authorization Server usually does too, but it can instead accept a sender-constrained ID-JAG from a Client that does not authenticate (Section 4.4). It then relies on the IdP Authorization Server: the client_id claim identifies the Client that the IdP Authorization Server authenticated, and proof of possession shows that the presenter holds the key the IdP Authorization Server bound to the ID-JAG for that Client. Without the key binding, anyone holding a copy of the ID-JAG could present it. Clients that cannot authenticate to the IdP Authorization Server SHOULD use the existing authorization code grant and redirect the user to the Resource Authorization Server with an OAuth 2.0 Authorization Request where the user can interactively consent to the access delegation. Parecki, et al. Expires 4 May 2027 [Page 44] Internet-Draft ID JWT Authz Grant October 2026 9.2. Storage of Subject Tokens The subject tokens used with this specification, whether an OpenID Connect ID Token, a SAML 2.0 Assertion, or a Refresh Token issued by the IdP Authorization Server, are high-value artifacts. A client that holds one of these can obtain an ID-JAG for any Resource Authorization Server the IdP policy permits, and can then redeem each ID-JAG for an access token at the corresponding Resource Authorization Server. A compromised subject token therefore exposes not only the IdP, but potentially every downstream resource reachable through it, and does so without further interaction with the user. Exploiting a stolen subject token also requires the attacker to authenticate to the IdP Authorization Server's token endpoint as the client, since the Token Exchange request requires client authentication. This means the client's credentials are the only remaining barrier, and both the subject token and the client credentials are typically held by the same deployment. An attacker who obtains access to the client's storage, backup, logs, or process memory is likely to obtain both. Deployments SHOULD NOT rely on client authentication alone to mitigate the theft of subject tokens. Clients that retain subject tokens beyond the immediate Token Exchange request: * SHOULD protect them at rest with at least the same protections applied to the client's own credentials, and SHOULD store them in a separate protection domain from the client credentials, for example by keeping client authentication keys in a hardware security module or key management service so that both cannot be exfiltrated together. * SHOULD NOT write them to application logs, error reports, telemetry, traces, or crash dumps, and SHOULD NOT include them in HTTP request URIs where they may be recorded by intermediaries. * SHOULD scope stored subject tokens to the individual user session or task they were obtained for, rather than pooling them in a shared cache that any part of the client can read. * SHOULD discard them as soon as they are no longer needed, and SHOULD NOT cache an Identity Assertion beyond its expiration. * SHOULD prefer requesting a new ID-JAG when needed over caching issued ID-JAGs and access tokens, since the ID-JAG and any resulting access tokens are themselves credentials subject to the same handling requirements. Parecki, et al. Expires 4 May 2027 [Page 45] Internet-Draft ID JWT Authz Grant October 2026 IdP Authorization Servers SHOULD limit exposure from a compromised subject token by issuing Identity Assertions with short lifetimes, and, when Refresh Tokens are accepted as subject tokens, by sender- constraining those Refresh Tokens as described in Section 9.11, rotating them on use, and binding them to the client that they were issued to. IdP Authorization Servers SHOULD also provide a mechanism to revoke Refresh Tokens and to invalidate outstanding sessions for a subject, so that a detected compromise can be contained before the affected subject tokens expire. Because a single subject token can be exchanged for ID-JAGs targeting many different Resource Authorization Servers, IdP Authorization Servers SHOULD record the audience, resource, scope, and authenticated client of each Token Exchange request, which allows unusual patterns, such as a client requesting ID-JAGs for audiences it does not normally access, to be detected. 9.3. Step-Up Authentication In the initial token exchange request, the IdP may require step-up authentication for the subject if the authentication context in the subject's assertion does not meet policy requirements. An insufficient_user_authentication OAuth error response may be returned to convey the authentication requirements back to the client similar to OAuth 2.0 Step-up Authentication Challenge Protocol [RFC9470]. HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-store { "error": "insufficient_user_authentication", "error_description": "Subject doesn't meet authentication requirements", "max_age": 5 } The Client would need to redirect the user back to the IdP to obtain a new assertion that meets the requirements and retry the token exchange. TBD: It may make more sense to request the Identity Assertion JWT Authorization Grant in the authorization request if using OpenID Connect for SSO when performing a step-up to skip the need for additional token exchange round-trip. Parecki, et al. Expires 4 May 2027 [Page 46] Internet-Draft ID JWT Authz Grant October 2026 9.4. Cross-Domain Use This specification is intended for cross-domain uses where the Client, Resource Authorization Server, and IdP are in different trust domains. In particular, the IdP MUST NOT issue access tokens in response to an ID-JAG it issued itself unless explicitly configured to do so, since this could lead to unintentional broadening of the scope of authorization. When so configured, the IdP MUST NOT grant the client more access than it would when issuing an access token for the same subject and resource directly, and evaluates any consent and authentication requirements when issuing the ID-JAG, since the access token request does not involve the user. This does not preclude a single piece of software from being both an IdP issuing ID-JAGs as well as a Resource Authorization Server consuming ID-JAGs, as long as the ID-JAG crosses a trust domain such as a tenant or customer boundary. An ID-JAG is specific to the trust relationship between the issuing IdP Authorization Server and the Resource Authorization Server identified by the aud claim. When a deployment involves additional downstream hops, the same ID-JAG MUST NOT be reused as the authorization grant for a different downstream Resource Authorization Server. For each subsequent hop, a new ID-JAG MAY be issued by the IdP Authorization Server trusted by that downstream Resource Authorization Server for SSO and subject resolution, or other mechanisms MAY be used. 9.5. Authorization Server Metadata Validation Clients that discover an Authorization Server's metadata using OAuth 2.0 Authorization Server Metadata [RFC8414] MUST validate that the issuer value in the metadata document is identical to the Authorization Server issuer identifier used to construct the metadata retrieval URL, as required by Section 3.3 of [RFC8414]. If the values are not identical, the client MUST NOT use the metadata. This validation is particularly important for this specification because more steps happen without user interaction than in an interactive OAuth flow, and a mismatch can enable an attacker who controls an Authorization Server metadata document to redirect ID-JAG issuance toward an Authorization Server the client did not intend to use. For example, an attacker's protected resource references an attacker- controlled Authorization Server whose metadata declares an issuer value matching a legitimate Resource Authorization Server the user's IdP already trusts. A client that skips the issuer check treats the malicious metadata as authoritative for the legitimate Authorization Server and requests an ID-JAG with audience set to that server. The client then presents the ID-JAG and its client authentication to the Parecki, et al. Expires 4 May 2027 [Page 47] Internet-Draft ID JWT Authz Grant October 2026 attacker's token endpoint. The attacker relays both to the legitimate Resource Authorization Server, authenticating as the client with the client_secret it received or with a client assertion whose aud is the legitimate issuer, and obtains an access token for the End-User. The client-side issuer check required by Section 3.3 of [RFC8414] is the primary defense. When the client has validated the attacker's Protected Resource Metadata (Section 9.6) and includes its resource value (Section 4.3), the ID-JAG names the attacker's resource, so the legitimate Resource Authorization Server rejects the relayed ID-JAG because it does not govern that resource (Section 4.4). An IdP that checks which resources that Resource Authorization Server governs (Section 4.3) rejects the Token Exchange request instead, so the ID- JAG never reaches the attacker. A sender-constrained ID-JAG (Section 9.11) also defeats the relay, because the attacker cannot prove possession of the client's key. 9.6. Protected Resource Metadata Validation Clients that discover the Resource Authorization Server for a protected resource via Protected Resource Metadata [RFC9728] MUST validate that metadata as required by Section 3.3 of [RFC9728], including verifying that the resource value is identical to the resource identifier used to construct the metadata URL or, when the metadata URL came from a WWW-Authenticate response, to the URL of the request that received that response. Without this check, an attacker who publishes metadata at their own resource can misrepresent the resource identifier and redirect the client toward an Authorization Server unrelated to the intended resource. Together with the Authorization Server metadata issuer check in Section 9.5, this validation binds discovery to the resource the client intended to access, and including the validated resource value in the Token Exchange request (Section 4.3) binds the grant to it. 9.7. Metadata Disclosure Advertising issuer-specific trust relationships in publicly accessible metadata can disclose federation topology, business relationships, tenant configuration, or other deployment-sensitive information. Resource Authorization Servers MUST NOT use authorization_grant_profiles_supported to disclose issuer allow lists or other profile-specific trust relationships. Parecki, et al. Expires 4 May 2027 [Page 48] Internet-Draft ID JWT Authz Grant October 2026 Resource Authorization Servers MAY provide a protected discovery mechanism by which an authenticated client can determine whether an Identity Assertion JWT Authorization Grant from a particular issuer would be accepted for that client. If such a mechanism is provided, the Resource Authorization Server MUST require client authentication before disclosing issuer-specific acceptance information. The response MUST be specific to the authenticated client and MAY also be scoped by tenant, resource, or other local policy context. 9.8. Subject Identifier Trust When the ID-JAG includes a sub_id claim, the Resource Authorization Server MUST NOT use the sub_id.issuer value to establish trust in the ID-JAG issuer. The ID-JAG MUST first be validated using the iss claim, signature, audience, expiration, and client binding according to this specification. The Resource Authorization Server MUST use a SAML NameID sub_id only when the validated ID-JAG issuer is explicitly associated with the SAML issuer identified by sub_id.issuer through local configuration or trusted federation metadata. A Resource Authorization Server that resolves the subject using email or aud_sub relies on the administrators of the issuer tenant for those values. It SHOULD do so only when it trusts that issuer tenant as authoritative for them, for example for email addresses in domains the tenant has verified, because administrators of another tenant at the same issuer can set any value. 9.9. Subject Identifier Disclosure The IdP Authorization Server SHOULD include sub_id only when needed by the target Resource Authorization Server for subject resolution. Because the ID-JAG is visible to the Client that presents it, sub_id can disclose additional user identifiers, such as email-address NameIDs or stable enterprise account identifiers, that the Client might not otherwise receive. For the same reason, a pairwise sub selected for the Resource Authorization Server (Section 5.2) is disclosed to the Client, which can link it to the sub in its own ID Token. The IdP Authorization Server SHOULD minimize the subject identifiers included in the ID-JAG to those required by the Resource Authorization Server. Parecki, et al. Expires 4 May 2027 [Page 49] Internet-Draft ID JWT Authz Grant October 2026 9.10. Actor Delegation Extensions This specification allows Token Exchange requests for ID-JAG to carry actor_token, but it does not define normative processing requirements for it. Future profiles or extensions can define how actor_token is validated, authorized, and reflected in the issued ID-JAG, including whether an act claim is included. Profiles or extensions that define use of actor_token need to consider delegation risks. In particular, a client could attempt to combine a valid subject_token with an unrelated or less-trusted actor_token to obtain an ID-JAG that overstates the actor's authority. Such profiles or extensions should define how actor_token is validated, how the relationship between the authenticated client, subject, and actor is authorized, how any resulting act claim is derived, and how unnecessary disclosure of actor identity or attributes is minimized across trust domains. When such profiles or extensions use an act claim, they should preserve the distinction between the actor identified by act and the resource owner identified by sub. The authenticated client identity is also not a substitute for actor identity. 9.11. Sender Constraining Tokens Identity Assertion JWT Authorization Grant may support key binding to enable sender-constrained tokens as described in Section 5.2 of [I-D.ietf-oauth-identity-chaining] and [I-D.parecki-oauth-jwt-dpop-grant]. This provides additional security by binding tokens to a specific cryptographic key or certificate, preventing reuse by parties that do not have access to the corresponding private key. This specification defines two sender-constraining mechanisms for the ID-JAG: * *DPoP Key Binding* (Section 9.11.1): binding via a DPoP proof JWT as defined by [RFC9449]. The cnf claim carries a jkt property with the JWK SHA-256 Thumbprint of the bound key. * *mTLS Certificate Binding* (Section 9.11.2): binding via a mutually authenticated TLS session using an X.509 client certificate as defined by Section 3 of [RFC8705]. The cnf claim carries an x5t#S256 property with the SHA-256 thumbprint of the DER encoding of the bound X.509 certificate. Parecki, et al. Expires 4 May 2027 [Page 50] Internet-Draft ID JWT Authz Grant October 2026 An IdP SHOULD NOT bind the same ID-JAG to both a DPoP key and an X.509 certificate. If both a DPoP proof and a certificate suitable for binding are presented on the same Token Exchange request, the IdP selects a single binding mechanism according to local policy for the target Resource Authorization Server. The cnf (confirmation) claim, as defined in [RFC7800], is used to bind a key or certificate to a JWT. When an ID-JAG contains a cnf claim, proof of possession of the corresponding private key or X.509 certificate MUST be demonstrated when using the ID-JAG at the Resource Authorization Server. A Resource Authorization Server that does not support the confirmation method in the cnf claim MUST reject the request with an invalid_grant error. The following sections describe the processing rules for each mechanism at two stages: during the Token Exchange (when requesting an ID-JAG from the IdP) and during the ID-JAG exchange (when exchanging the ID-JAG for an access token at the Resource Authorization Server). 9.11.1. DPoP Key Binding DPoP key binding is demonstrated by the client presenting a DPoP proof JWT (as defined in [RFC9449]) in a DPoP HTTP header. The DPoP proof demonstrates that the client possesses the private key corresponding to a public key. This public key can be bound to tokens, ensuring that only the holder of the private key can use those tokens. When an ID-JAG contains a cnf claim with a jkt property as defined in [RFC9449], it indicates that the ID-JAG is bound to that specific key (identified by its JWK SHA-256 Thumbprint), and proof of possession of the corresponding private key MUST be demonstrated when using the ID-JAG. 9.11.1.1. DPoP Key Binding During Token Exchange When a client requests an ID-JAG from the IdP Authorization Server via Token Exchange, the client MAY include a DPoP proof in the request. This demonstrates possession of a key that can be bound to the ID-JAG. The client generates a key pair and includes a DPoP proof JWT in the DPoP header of the Token Exchange request: Parecki, et al. Expires 4 May 2027 [Page 51] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token HTTP/1.1 Host: acme.idp.example Content-Type: application/x-www-form-urlencoded DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7Imt0eSI6IkVDI... grant_type=urn:ietf:params:oauth:grant-type:token-exchange &requested_token_type=urn:ietf:params:oauth:token-type:id-jag &audience=https://acme.chat.example/ &resource=https://api.chat.example/ &scope=chat.read+chat.history &subject_token=eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ... &subject_token_type=urn:ietf:params:oauth:token-type:id_token The IdP Authorization Server processes the request as follows: 1. If a DPoP proof is present, the IdP MUST validate it according to Section 4.3 of [RFC9449]. The htm claim MUST be POST, and the htu claim MUST match the token endpoint URL. 2. If the DPoP proof is valid, the IdP MUST include a cnf claim in the issued ID-JAG containing a jkt property with the JWK SHA-256 Thumbprint computed from the DPoP proof's jwk header parameter as defined in Section 6.1 of [RFC9449], unless it binds the ID-JAG to the client's X.509 certificate instead (Section 9.11.2). This enables the Resource Authorization Server to validate the key binding for the ID-JAG using simple string comparison of the JWK SHA-256 Thumbprint. The cnf claim format follows Section 6.1 of [RFC9449]: { "jti": "9e43f81b64a33f20116179", "iss": "https://acme.idp.example/", "sub": "U019488227", "aud": "https://acme.chat.example/", "client_id": "f53f191f9311af35", "exp": 1311281270, "iat": 1311280970, "resource": "https://api.chat.example/", "scope": "chat.read chat.history", "cnf": { "jkt":"0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I" } } 1. The token exchange response does not explicitly indicate whether key binding was successfully performed by the IdP. The token_type response parameter for an ID-JAG is always N_A per Parecki, et al. Expires 4 May 2027 [Page 52] Internet-Draft ID JWT Authz Grant October 2026 Section 2.2.1 of [RFC8693]. The client SHOULD inspect the ID-JAG to determine if a cnf claim is present and whether it represents the same key as the DPoP proof. This enables the client to detect if the IdP successfully processed the DPoP proof in the token exchange request and bound the issued ID-JAG, preventing the IdP from silently ignoring the DPoP proof and mitigating downgrade attacks. 2. If no DPoP proof is presented, the IdP issues an ID-JAG without a cnf claim. 9.11.1.2. DPoP Key Binding During ID-JAG Exchange When a client exchanges an ID-JAG for an access token at the Resource Authorization Server, the processing rules depend on whether the ID- JAG contains a cnf claim and whether the client presents a DPoP proof. 9.11.1.2.1. ID-JAG Contains cnf Claim and DPoP Proof is Presented If the ID-JAG contains a cnf claim and the client presents a DPoP proof, the Resource Authorization Server MUST: 1. Validate the DPoP proof according to Section 4 of [RFC9449]. 2. Extract the JWK SHA-256 Thumbprint from the DPoP proof by computing the thumbprint of the jwk header parameter in the DPoP proof according to [RFC7638]. 3. Extract the JWK SHA-256 Thumbprint from the jkt property of the cnf claim in the ID-JAG. 4. Compare the two thumbprints. They MUST match exactly. If they do not match, the request MUST fail with an invalid_grant error. 5. If the thumbprints match, the Resource Authorization Server MAY issue a sender-constrained access token (e.g., a DPoP-bound token) per the Resource Server configuration. The issued access token SHOULD be bound to the same key. Example request: Parecki, et al. Expires 4 May 2027 [Page 53] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token HTTP/1.1 Host: acme.chat.example Content-Type: application/x-www-form-urlencoded DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7Imt0eSI6IkVDI... grant_type=urn:ietf:params:oauth:grant-type:jwt-dpop &assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6Im9hdXRoLWlkLWphZytqd3QifQ... Example successful response with DPoP-bound token: HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "token_type": "DPoP", "access_token": "2YotnFZFEjr1zCsicMWpAA", "expires_in": 86400, "scope": "chat.read chat.history" } 9.11.1.2.2. ID-JAG Contains cnf Claim but DPoP Proof is Not Presented If the ID-JAG contains a cnf claim but the client does not present a DPoP proof, the Resource Authorization Server MUST reject the request with an invalid_grant error, as the ID-JAG requires proof of possession. Example error response: HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-store { "error": "invalid_grant", "error_description": "Proof of possession required for this authorization grant" } 9.11.1.2.3. ID-JAG Does Not Contain cnf Claim and DPoP Proof is Presented If the ID-JAG does not contain a cnf claim but the client presents a DPoP proof, the Resource Authorization Server: 1. MUST validate the DPoP proof according to Section 4 of [RFC9449]. Parecki, et al. Expires 4 May 2027 [Page 54] Internet-Draft ID JWT Authz Grant October 2026 2. MAY issue a sender-constrained access token (e.g., a DPoP-bound token) per the Resource Server configuration at the Authorization Server, binding the access token to the key demonstrated in the DPoP proof. 3. The access token response will indicate the token type (e.g., DPoP for DPoP-bound tokens, or Bearer for unconstrained tokens). 9.11.1.2.4. ID-JAG Does Not Contain cnf Claim and DPoP Proof is Not Presented If the ID-JAG does not contain a cnf claim and the client does not present a DPoP proof: 1. The Resource Authorization Server MAY issue an unconstrained Bearer token. 2. However, if the Resource Server configuration at the Authorization Server requires constrained tokens for that Resource Server, the request MUST fail with an invalid_grant error. Example error response when constrained tokens are required: HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-store { "error": "invalid_grant", "error_description": "Sender-constrained tokens required for this resource server" } 9.11.2. mTLS Certificate Binding An IdP MAY bind an ID-JAG to a client's X.509 certificate per [RFC8705]. When bound, the cnf claim carries an x5t#S256 property containing the SHA-256 thumbprint of the DER encoding of the certificate, as defined by Section 3.1 of [RFC8705]. The certificate used for binding is the certificate the client presents during the mutually authenticated TLS handshake, validated per Section 2 of [RFC8705]. Because TLS exposes a single client certificate per connection, the binding certificate and the client- authentication certificate are the same certificate. Parecki, et al. Expires 4 May 2027 [Page 55] Internet-Draft ID JWT Authz Grant October 2026 9.11.2.1. mTLS Certificate Binding During Token Exchange When the client presents an X.509 client certificate on the mTLS session to the IdP token endpoint and local policy permits certificate-bound issuance, the IdP validates the certificate per Section 2 of [RFC8705] and includes an x5t#S256 cnf claim in the issued ID-JAG per Section 3.1 of [RFC8705]: "cnf": { "x5t#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2" } The token_type response parameter for an ID-JAG is always N_A per Section 2.2.1 of [RFC8693]. The client SHOULD verify that the returned ID-JAG contains an x5t#S256 cnf claim matching the certificate it presented, to detect a silent downgrade. If no client certificate is presented (or is not accepted for binding), the IdP issues an ID-JAG without an x5t#S256 cnf claim. 9.11.2.2. mTLS Certificate Binding During ID-JAG Exchange When the client exchanges the ID-JAG at the Resource Authorization Server, processing depends on whether the ID-JAG contains an x5t#S256 cnf claim and whether the client establishes an mTLS session: * *cnf.x5t#S256 present and mTLS certificate presented:* The Resource Authorization Server MUST validate the certificate per Section 2 of [RFC8705], compute its SHA-256 thumbprint per Section 3.1 of [RFC8705], and compare against cnf.x5t#S256. Mismatch MUST fail with invalid_grant. On match, the Resource Authorization Server MAY issue a certificate-bound access token per Section 3 of [RFC8705]. * *cnf.x5t#S256 present, no mTLS certificate:* MUST fail with invalid_grant. * *No cnf.x5t#S256, mTLS certificate presented:* The Resource Authorization Server MAY validate the certificate per Section 2 of [RFC8705] and issue a certificate-bound access token per Section 3 of [RFC8705]. * *No cnf.x5t#S256, no mTLS certificate:* The Resource Authorization Server MAY issue an unconstrained Bearer token; if Resource Server configuration requires sender-constrained tokens, MUST fail with invalid_grant. Parecki, et al. Expires 4 May 2027 [Page 56] Internet-Draft ID JWT Authz Grant October 2026 Example request (mTLS session established at the TLS layer) and successful response with a certificate-bound access token: POST /oauth2/token HTTP/1.1 Host: acme.chat.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer &assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6Im9hdXRoLWlkLWphZytqd3QifQ... &client_id=f53f191f9311af35 HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store { "token_type": "Bearer", "access_token": "2YotnFZFEjr1zCsicMWpAA", "expires_in": 86400, "scope": "chat.read chat.history" } 10. Privacy Considerations The privacy considerations of [RFC8693], [RFC7523], and Section 6 of [I-D.ietf-oauth-identity-chaining] also apply to this specification. Disclosure of subject identifiers to the Client is covered in Section 9.9, and disclosure of trust relationships in metadata in Section 9.7. The IdP Authorization Server learns which Clients access which Resource Authorization Servers for which End-Users, and when, including access that happens without the End-User present. It should keep the records described in Section 9.2 only as long as security and audit require, and should let End-Users or administrators see and revoke cross-app access. The Client can read the ID-JAG, including claims it would not receive in its own ID Token, such as a pairwise sub or aud_sub, and can link them across Resource Authorization Servers. The IdP Authorization Server SHOULD include only the claims the Resource Authorization Server needs. A Resource Authorization Server that provisions accounts from ID-JAGs (Section 3) can create accounts for End-Users who never used it directly, and should retain only the attributes it needs. Parecki, et al. Expires 4 May 2027 [Page 57] Internet-Draft ID JWT Authz Grant October 2026 Error descriptions SHOULD NOT disclose more about the End-User than the error code conveys, such as whether the End-User holds a license for the application. 11. IANA Considerations 11.1. Media Types This section registers oauth-id-jag+jwt, a new media type [RFC2046] in the "Media Types" registry [IANA.media-types] in the manner described in [RFC6838]. It can be used to indicate that the content is an Identity Assertion JWT Authorization Grant. 11.2. OAuth URI Registration This section registers urn:ietf:params:oauth:token-type:id-jag in the "OAuth URI" subregistry of the "OAuth Parameters" registry [IANA.oauth-parameters]. * URN: urn:ietf:params:oauth:token-type:id-jag * Common Name: Token type URI for an Identity Assertion JWT Authorization Grant * Change Controller: IETF * Specification Document: This document This section registers urn:ietf:params:oauth:grant-profile:id-jag in the "OAuth URI" subregistry of the "OAuth Parameters" registry [IANA.oauth-parameters]. * URN: urn:ietf:params:oauth:grant-profile:id-jag * Common Name: Authorization grant profile identifier for an Identity Assertion JWT Authorization Grant * Change Controller: IETF * Specification Document: This document 11.3. OAuth Authorization Server Metadata Registration This section registers the following in the "OAuth Authorization Server Metadata" registry of the "OAuth Parameters" registry [IANA.oauth-parameters]. * Metadata Name: authorization_grant_profiles_supported Parecki, et al. Expires 4 May 2027 [Page 58] Internet-Draft ID JWT Authz Grant October 2026 * Metadata Description: JSON array of supported authorization grant profile identifiers * Change Controller: IETF * Specification Document: This document * Metadata Name: id_jag_signing_alg_values_supported * Metadata Description: JSON array of the JWS signing algorithms supported for signing Identity Assertion JWT Authorization Grants * Change Controller: IETF * Specification Document: This document 11.4. OAuth Dynamic Client Registration Metadata Registration This section registers authorization_grant_profiles_supported in the "OAuth Dynamic Client Registration Metadata" registry of the "OAuth Parameters" registry [IANA.oauth-parameters], established by [RFC7591]. * Metadata Name: authorization_grant_profiles_supported * Metadata Description: JSON array of authorization grant profile identifiers supported by the client * Change Controller: IETF * Specification Document: Section 8 11.5. JSON Web Token Claims Registration This section registers the following claims in the "JSON Web Token Claims" subregistry of the "JSON Web Token (JWT)" registry [IANA.jwt]. The "JSON Web Token Claims" subregistry was established by [RFC7519]. * Claim Name: resource * Claim Description: Resource * Change Controller: IETF * Specification Document(s): Section 3 * Claim Name: aud_tenant Parecki, et al. Expires 4 May 2027 [Page 59] Internet-Draft ID JWT Authz Grant October 2026 * Claim Description: Resource Authorization Server tenant identifier * Change Controller: IETF * Specification Document(s): Section 3 11.6. Security Event Identifier Format Registration This section registers the saml-nameid Subject Identifier Format in the "Security Event Identifier Formats" registry established by [RFC9493]. * Format Name: saml-nameid * Format Description: SAML NameID Subject Identifier Format * Change Controller: IETF * Reference: Section 3.2.1 12. References 12.1. Normative References [I-D.ietf-oauth-identity-chaining] Schwenkschuster, A., Kasselman, P., Burgin, K., Jenkins, M. J., Campbell, B., and A. Parecki, "OAuth Identity and Authorization Chaining Across Domains", Work in Progress, Internet-Draft, draft-ietf-oauth-identity-chaining-17, 19 July 2026, . [I-D.parecki-oauth-jwt-dpop-grant] Parecki, A., "OAuth 2.0 JWT Authorization Grant with DPoP Binding", Work in Progress, Internet-Draft, draft-parecki- oauth-jwt-dpop-grant-02, 30 October 2026, . [IANA.jwt] IANA, "JSON Web Token (JWT)", . [IANA.media-types] IANA, "Media Types", . Parecki, et al. Expires 4 May 2027 [Page 60] Internet-Draft ID JWT Authz Grant October 2026 [IANA.oauth-parameters] IANA, "OAuth Parameters", . [OASIS.saml-core-2.0-os] Cantor, S., Kemp, J., Philpott, R., and E. Maler, "Assertions and Protocol for the OASIS Security Assertion Markup Language (SAML) V2.0", OASIS Standard saml-core- 2.0-os, March 2005, . [OpenID.Core] Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore, "OpenID Connect Core 1.0 incorporating errata set 2", December 2023, . [OpenID.Discovery] Sakimura, N., Bradley, J., Jones, M., and E. Jay, "OpenID Connect Discovery 1.0 incorporating errata set 2", December 2023, . [OpenID.Enterprise] Hardt, D. and K. McGuinness, "OpenID Connect Enterprise Extensions 1.0 - draft 01", September 2025, . [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types", RFC 2046, DOI 10.17487/RFC2046, November 1996, . [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, . [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005, . [RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", RFC 6749, DOI 10.17487/RFC6749, October 2012, . Parecki, et al. Expires 4 May 2027 [Page 61] Internet-Draft ID JWT Authz Grant October 2026 [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type Specifications and Registration Procedures", BCP 13, RFC 6838, DOI 10.17487/RFC6838, January 2013, . [RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, DOI 10.17487/RFC7518, May 2015, . [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, . [RFC7521] Campbell, B., Mortimore, C., Jones, M., and Y. Goland, "Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants", RFC 7521, DOI 10.17487/RFC7521, May 2015, . [RFC7523] Jones, M., Campbell, B., and C. Mortimore, "JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants", RFC 7523, DOI 10.17487/RFC7523, May 2015, . [RFC7591] Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and P. Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", RFC 7591, DOI 10.17487/RFC7591, July 2015, . [RFC7638] Jones, M. and N. Sakimura, "JSON Web Key (JWK) Thumbprint", RFC 7638, DOI 10.17487/RFC7638, September 2015, . [RFC7800] Jones, M., Bradley, J., and H. Tschofenig, "Proof-of- Possession Key Semantics for JSON Web Tokens (JWTs)", RFC 7800, DOI 10.17487/RFC7800, April 2016, . [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, . [RFC8414] Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 Authorization Server Metadata", RFC 8414, DOI 10.17487/RFC8414, June 2018, . Parecki, et al. Expires 4 May 2027 [Page 62] Internet-Draft ID JWT Authz Grant October 2026 [RFC8693] Jones, M., Nadalin, A., Campbell, B., Ed., Bradley, J., and C. Mortimore, "OAuth 2.0 Token Exchange", RFC 8693, DOI 10.17487/RFC8693, January 2020, . [RFC8705] Campbell, B., Bradley, J., Sakimura, N., and T. Lodderstedt, "OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens", RFC 8705, DOI 10.17487/RFC8705, February 2020, . [RFC8707] Campbell, B., Bradley, J., and H. Tschofenig, "Resource Indicators for OAuth 2.0", RFC 8707, DOI 10.17487/RFC8707, February 2020, . [RFC8725] Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best Current Practices", BCP 225, RFC 8725, DOI 10.17487/RFC8725, February 2020, . [RFC9396] Lodderstedt, T., Richer, J., and B. Campbell, "OAuth 2.0 Rich Authorization Requests", RFC 9396, DOI 10.17487/RFC9396, May 2023, . [RFC9449] Fett, D., Campbell, B., Bradley, J., Lodderstedt, T., Jones, M., and D. Waite, "OAuth 2.0 Demonstrating Proof of Possession (DPoP)", RFC 9449, DOI 10.17487/RFC9449, September 2023, . [RFC9493] Backman, A., Ed., Scurtescu, M., and P. Jain, "Subject Identifiers for Security Event Tokens", RFC 9493, DOI 10.17487/RFC9493, December 2023, . [RFC9728] Jones, M.B., Hunt, P., and A. Parecki, "OAuth 2.0 Protected Resource Metadata", RFC 9728, DOI 10.17487/RFC9728, April 2025, . 12.2. Informative References [I-D.ietf-oauth-client-id-metadata-document] Parecki, A. and E. Smith, "OAuth Client ID Metadata Document", Work in Progress, Internet-Draft, draft-ietf- oauth-client-id-metadata-document-02, 6 July 2026, . Parecki, et al. Expires 4 May 2027 [Page 63] Internet-Draft ID JWT Authz Grant October 2026 [RFC9068] Bertocci, V., "JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens", RFC 9068, DOI 10.17487/RFC9068, October 2021, . [RFC9470] Bertocci, V. and B. Campbell, "OAuth 2.0 Step Up Authentication Challenge Protocol", RFC 9470, DOI 10.17487/RFC9470, September 2023, . Appendix A. Use Cases The following use cases are illustrative and not exhaustive. Enterprise workforce identity is a common deployment context, but this profile can also apply where the IdP Authorization Server trusted by the Resource Authorization Server for SSO and subject resolution is a CIAM layer, platform identity system, or other application-domain identity provider. A.1. Enterprise Deployment Enterprises often have hundreds of SaaS applications. SaaS applications often have integrations to other SaaS applications that are critical to the application experience and jobs to be done. When a SaaS app needs to request an access token on behalf of a user to a 3rd party SaaS integration's API, the end-user typically needs to complete an interactive delegated OAuth 2.0 flow, as the SaaS application is not in the same security or policy domain as the 3rd party SaaS integration. It is industry best practice for an enterprise to connect their ecosystem of SaaS applications to their Identity Provider (IdP) to centralize identity and access management capabilities for the organization. End-users get a better experience (SSO) and administrators get better security outcomes such as multi-factor authentication and zero-trust. SaaS applications today enable the administrator to establish trust with an IdP for user authentication. This specification can be used to extend the SSO relationship of multiple SaaS applications to include API access between these applications as well. This specification enables federation for Authorization Servers across policy or administrative boundaries. The same enterprise IdP that is trusted by applications for SSO can be extended to broker access to APIs. This enables the enterprise to centralize more access decisions across their SaaS ecosystem and provides better end-user experience for users that need to connect multiple applications via OAuth 2.0. Parecki, et al. Expires 4 May 2027 [Page 64] Internet-Draft ID JWT Authz Grant October 2026 A.1.1. Preconditions * The Client has a registered OAuth 2.0 Client with the IdP Authorization Server * The Client has a registered OAuth 2.0 Client with the Resource Authorization Server * Enterprise has established a trust relationship between their IdP and the Client for SSO and Identity Assertion JWT Authorization Grant * Enterprise has established a trust relationship between their IdP and the Resource Authorization Server for SSO and Identity Assertion JWT Authorization Grant * Enterprise has granted the Client permission to act on behalf of users for the Resource Authorization Server with a set of scopes A.2. Customer Identity for Developer SaaS Components In deployments where the shared identity layer serves customer-facing applications, the IdP is a Customer Identity and Access Management (CIAM) platform that signs end-users into a customer-facing application or suite of first-party applications rather than a workforce IdP used to sign employees into internal or SaaS productivity tools. These customer applications often embed or depend on third-party developer SaaS components such as communications, analytics, fraud detection, document processing, support tooling, or logging and observability services. A first-party application may need to request an access token on behalf of the signed-in customer so that these components can be invoked seamlessly as part of the product experience, without interrupting the customer with separate delegated OAuth authorization prompts for each downstream service. This specification can be used in these deployments when the CIAM platform serves as the common identity layer trusted by the first- party applications and by the authorization servers for the third- party developer SaaS components. In that model, the CIAM platform can broker an Identity Assertion JWT Authorization Grant that allows the component provider to issue an access token scoped to the customer and to the specific component APIs needed by the first-party application. A.2.1. Preconditions Parecki, et al. Expires 4 May 2027 [Page 65] Internet-Draft ID JWT Authz Grant October 2026 A.2.1.1. Deployment and Client Preconditions * The first-party application has a registered OAuth 2.0 Client with the CIAM IdP Authorization Server * The first-party application has a registered OAuth 2.0 Client with the Resource Authorization Server for the developer SaaS component * The Resource Authorization Server is able to map the customer identity conveyed by the CIAM platform to the corresponding account, tenant, or subject established through JIT provisioning at the developer SaaS component A.2.1.2. Trust Relationship Preconditions * The organization operating the customer application has established a trust relationship between its CIAM platform and the first-party application for customer sign-in and issuance of identity assertions * The organization operating the customer application and the developer SaaS provider have established a trust relationship between the CIAM platform and the Resource Authorization Server for Identity Assertion JWT Authorization Grant * The organization operating the customer application has granted the first-party application permission to act on behalf of signed- in customers for the developer SaaS component with a defined set of scopes A.3. Email and Calendaring Applications Email clients can be used with arbitrary email servers, and cannot require pre-established relationships between each email client and each email server. When an email client uses OAuth to obtain an access token to an email server, this provides the security benefit of being able to use strong multi-factor authentication methods provided by the email server's authorization server, but does require that the user go through a web-based flow to log in to the email client. However, this web-based flow is often seen as disruptive to the user experience when initiated from a desktop or mobile native application, and so is often attempted to be minimized as much as possible. When the email client needs access to a separate API, such as a third-party calendaring application, traditionally this would require that the email client go through another web-based OAuth redirect flow to obtain authorization and ultimately an access token. Parecki, et al. Expires 4 May 2027 [Page 66] Internet-Draft ID JWT Authz Grant October 2026 To streamline the user experience, this specification can be used to enable the email client to use the Identity Assertion to obtain an access token for the third-party calendaring application without any user interaction. A.3.1. Preconditions * The Client does not have a pre-registered OAuth 2.0 client at the IdP Authorization Server or the Resource Authorization Server * The Client identifies itself at both with a Client ID Metadata Document [I-D.ietf-oauth-client-id-metadata-document] that publishes its public keys, and authenticates in the Token Exchange request with the corresponding private key (Section 4.3), for example using private_key_jwt * The Client has obtained an Identity Assertion (e.g. ID Token) from the IdP Authorization Server * The Resource Authorization Server accepts clients identified by a Client ID Metadata Document, and either authenticates the Client the same way or accepts a sender-constrained ID-JAG (Section 4.4) A.4. AI Agent using External Tools AI agents are designed to perform complex tasks on behalf of users, often requiring integration with external tools provided by SaaS applications, internal services, or enterprise data sources. When accessing these systems, the agent often operates on behalf of the end user, and its actions are constrained by the user's identity, role, and permissions. In agentic systems, the relevant IdP for a given ID-JAG hop is the IdP Authorization Server the downstream Resource Authorization Server already trusts for SSO and subject resolution at that boundary. That may be an enterprise workforce IdP, a CIAM or product identity layer, or an internal platform IdP depending on the deployment. A.4.1. Preconditions A.4.1.1. Deployment and Client Preconditions * The Enterprise IdP at idp.cyberdyne-corp.example authenticates the enterprise's users, issues identity assertions, and is the IdP Authorization Server trusted by the External Tool Resource Authorization Server for SSO and subject resolution for this hop Parecki, et al. Expires 4 May 2027 [Page 67] Internet-Draft ID JWT Authz Grant October 2026 * The External Tool API (resource server) at api.saas-tool.example and its authorization server at authorization-server.saas- tool.example are operated by a SaaS tool vendor, in a different trust domain from the enterprise IdP * The AI Agent is an OAuth 2.0 client with client ID https://ai- agent-app.example/ * The Enterprise IdP (idp.cyberdyne-corp.example) recognizes the AI Agent (https://ai-agent-app.example/) as a trusted client, either through static registration or dynamic discovery via [I-D.ietf-oauth-client-id-metadata-document] * The External Tool Resource Authorization Server (authorization- server.saas-tool.example) recognizes the AI Agent (https://ai- agent-app.example/) as a trusted client, either through static registration or dynamic discovery via [I-D.ietf-oauth-client-id-metadata-document] Note: This example uses a URL as the client ID, following the Client Identity Metadata Document pattern [I-D.ietf-oauth-client-id-metadata-document] to allow servers to dynamically discover client metadata. Alternatively, clients may be statically registered at the IdP and authorization server and given static opaque client IDs, with metadata configured directly in the IdP and Authorization Server. A.4.1.2. Trust Relationship Preconditions * The enterprise has established a trust relationship between their IdP (idp.cyberdyne-corp.example) and the AI Agent for SSO * The enterprise has established a trust relationship between their IdP (idp.cyberdyne-corp.example) and the External Tool Resource Authorization Server (authorization-server.saas-tool.example) for SSO and Identity Assertion JWT Authorization Grant * The enterprise has granted the AI Agent permission to act on behalf of users for the External Tool Resource Authorization Server with a specific set of scopes A.4.2. Example Sequence The steps below describe the sequence of the AI Agent obtaining an access token using an Identity Assertion JWT Authorization Grant (Section 3). Parecki, et al. Expires 4 May 2027 [Page 68] Internet-Draft ID JWT Authz Grant October 2026 A.4.2.1. AI Agent establishes a User Identity with Enterprise IdP AI Agent (https://ai-agent-app.example/) discovers the Enterprise IdP's (idp.cyberdyne-corp.example) OpenID Connect Provider configuration based on a configured issuer that was previously established. Note: IdP discovery where an agent discovers which IdP the agent should use to authenticate a given user is out of scope of this specification. GET /.well-known/openid-configuration Host: idp.cyberdyne-corp.example Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "issuer": "https://idp.cyberdyne-corp.example/", "authorization_endpoint": "https://idp.cyberdyne-corp.example/oauth2/authorize", "token_endpoint": "https://idp.cyberdyne-corp.example/oauth2/token", "userinfo_endpoint": "https://idp.cyberdyne-corp.example/oauth2/userinfo", "jwks_uri": "https://idp.cyberdyne-corp.example/oauth2/keys", "registration_endpoint": "https://idp.cyberdyne-corp.example/oauth2/register", "scopes_supported": [ "openid", "email", "profile" ], "response_types_supported": [ "code" ], "grant_types_supported": [ "authorization_code", "refresh_token", "urn:ietf:params:oauth:grant-type:token-exchange" ], "identity_chaining_requested_token_types_supported": ["urn:ietf:params:oauth:token-type:id-jag"], ... } AI Agent discovers all necessary endpoints for authentication as well as support for the identity chaining requested token type urn:ietf:params:oauth:token-type:id-jag Parecki, et al. Expires 4 May 2027 [Page 69] Internet-Draft ID JWT Authz Grant October 2026 A.4.2.2. IdP Authorization Request (with PKCE) AI Agent (https://ai-agent-app.example/) generates a PKCE code_verifier and a code_challenge (usually a SHA256 hash of the verifier, base64url-encoded) and redirects the end-user to the Enterprise IdP (idp.cyberdyne-corp.example) with an authorization request GET /authorize? response_type=code &client_id=https://ai-agent-app.example/ &redirect_uri=https://ai-agent-app.example/callback &scope=openid+profile+email &state=xyzABC123 &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM &code_challenge_method=S256 Host: idp.cyberdyne-corp.example A.4.2.3. User authenticates and authorizes AI Agent Enterprise IdP (idp.cyberdyne-corp.example) authenticates the end- user and redirects back to the AI Agent's registered redirect URI with an authorization code: https://ai-agent-app.example/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=xyzABC123 AI Agent (https://ai-agent-app.example/) exchanges the code and PKCE code_verifier to obtain an ID Token and Access Token for the IdP's UserInfo endpoint Parecki, et al. Expires 4 May 2027 [Page 70] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token Host: idp.cyberdyne-corp.example Authorization: Basic yZS1yYW5kb20tc2VjcmV0v3JOkF0XG5Qx2 Content-Type: application/x-www-form-urlencoded grant_type=authorization_code &code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https://ai-agent-app.example/callback &code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store { "id_token": "eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ...", "token_type": "Bearer", "access_token": "7SliwCQP1brGdjBtsaMnXo", "scope": "openid profile email" } AI Agent validates the ID Token using the published JWKS for the Enterprise IdP (idp.cyberdyne-corp.example) { "iss": "https://idp.cyberdyne-corp.example/", "sub": "1997e829-2029-41d4-a716-446655440000", "aud": "https://ai-agent-app.example/", "exp": 1984448400, "iat": 1984444800, "auth_time": 1984444800, "name": "John Connor", "email": "john.connor@cyberdyne-corp.example", "email_verified": true } AI Agent now has an identity binding for context A.4.2.4. AI Agent calls External Tool AI Agent (https://ai-agent-app.example/) calls the External Tool API (Resource Server) at api.saas-tool.example without a valid access token and is issued an authentication challenge per Protected Resource Metadata [RFC9728]. Note: How agents discover available external tools is out of scope of this specification Parecki, et al. Expires 4 May 2027 [Page 71] Internet-Draft ID JWT Authz Grant October 2026 GET / Host: api.saas-tool.example Accept: application/json HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer resource_metadata= "https://api.saas-tool.example/.well-known/oauth-protected-resource" AI Agent fetches the External Tool API's OAuth 2.0 Protected Resource Metadata per [RFC9728] to dynamically discover an authorization server that can issue an access token for the resource. GET /.well-known/oauth-protected-resource Host: api.saas-tool.example Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "resource": "https://api.saas-tool.example/", "authorization_servers": [ "https://authorization-server.saas-tool.example/" ], "bearer_methods_supported": ["header", "body"], "scopes_supported": ["agent.read", "agent.write"], "resource_documentation": "https://api.saas-tool.example/resource_documentation.html" } AI Agent discovers the External Tool Resource Authorization Server (authorization-server.saas-tool.example) configuration per [RFC8414] Parecki, et al. Expires 4 May 2027 [Page 72] Internet-Draft ID JWT Authz Grant October 2026 GET /.well-known/oauth-authorization-server Host: authorization-server.saas-tool.example Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "issuer": "https://authorization-server.saas-tool.example/", "authorization_endpoint": "https://authorization-server.saas-tool.example/oauth2/authorize", "token_endpoint": "https://authorization-server.saas-tool.example/oauth2/token", "jwks_uri": "https://authorization-server.saas-tool.example/oauth2/keys", "registration_endpoint": "https://authorization-server.saas-tool.example/oauth2/register", "scopes_supported": [ "agent.read", "agent.write" ], "response_types_supported": [ "code" ], "grant_types_supported": [ "authorization_code", "refresh_token", "urn:ietf:params:oauth:grant-type:jwt-bearer" ], "authorization_grant_profiles_supported": ["urn:ietf:params:oauth:grant-profile:id-jag"], ... } AI Agent has learned all necessary endpoints and supported capabilities to obtain an access token for the external tool. If the urn:ietf:params:oauth:grant-profile:id-jag authorization grant profile is supported, the AI Agent can first attempt to silently obtain an access token using an Identity Assertion JWT Authorization Grant from the IdP Authorization Server trusted by the External Tool Resource Authorization Server for SSO, otherwise it can fallback to interactively obtaining a standard authorization_code from the External Tool Resource Authorization Server. A.4.2.5. AI Agent obtains an Identity Assertion JWT Authorization Grant for External Tool from the Enterprise IdP AI Agent (https://ai-agent-app.example/) makes an Identity Assertion JWT Authorization Grant Token Exchange [RFC8693] request to the Enterprise IdP (idp.cyberdyne-corp.example) using the ID Token obtained when establishing an identity binding context, along with scopes and the resource identifier for the External Tool API (api.saas-tool.example) that was returned in the external tool's OAuth 2.0 Protected Resource Metadata Parecki, et al. Expires 4 May 2027 [Page 73] Internet-Draft ID JWT Authz Grant October 2026 POST /oauth2/token HTTP/1.1 Host: idp.cyberdyne-corp.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:token-exchange &requested_token_type=urn:ietf:params:oauth:token-type:id-jag &audience=https://authorization-server.saas-tool.example/ &resource=https://api.saas-tool.example/ &scope=agent.read+agent.write &subject_token=eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ... &subject_token_type=urn:ietf:params:oauth:token-type:id_token &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion=eyJhbGciOiJSUzI1NiIsImtpZCI6IjIyIn0... If access is granted, the Enterprise IdP (idp.cyberdyne-corp.example) creates a signed Identity Assertion JWT Authorization Grant and returns it in the token exchange response defined in Section 2.2 of [RFC8693]: HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "issued_token_type": "urn:ietf:params:oauth:token-type:id-jag", "access_token": "eyJhbGciOiJSUzI1NiIsI...", "token_type": "N_A", "scope": "agent.read agent.write", "expires_in": 300 } Identity Assertion JWT Authorization Grant claims: Parecki, et al. Expires 4 May 2027 [Page 74] Internet-Draft ID JWT Authz Grant October 2026 { "alg": "ES256", "typ": "oauth-id-jag+jwt" } . { "jti": "9e43f81b64a33f20116179", "iss": "https://idp.cyberdyne-corp.example/", "sub": "1997e829-2029-41d4-a716-446655440000", "aud": "https://authorization-server.saas-tool.example/", "resource": "https://api.saas-tool.example/", "client_id": "https://ai-agent-app.example/", "exp": 1984445400, "iat": 1984445100, "scope": "agent.read agent.write" } . signature A.4.2.6. AI Agent obtains an Access Token for External Tool AI Agent (https://ai-agent-app.example/) makes a token request to the External Tool Resource Authorization Server (authorization- server.saas-tool.example) token endpoint using the Identity Assertion JWT Authorization Grant obtained from the Enterprise IdP (idp.cyberdyne-corp.example) as a JWT Assertion as defined by [RFC7523]. Note: How the AI Agent registers with the External Tool Resource Authorization Server (e.g static or dynamic client registration), and whether or not it has credentials, is out-of-scope of this specification POST /oauth2/token HTTP/1.1 Host: authorization-server.saas-tool.example Authorization: Basic yZS1yYW5kb20tc2VjcmV0v3JOkF0XG5Qx2 Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer &assertion=eyJhbGciOiJSUzI1NiIsI... External Tool Resource Authorization Server (authorization- server.saas-tool.example) validates the Identity Assertion JWT Authorization Grant using the published JWKS for the trusted Enterprise IdP (idp.cyberdyne-corp.example) Parecki, et al. Expires 4 May 2027 [Page 75] Internet-Draft ID JWT Authz Grant October 2026 HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "token_type": "Bearer", "access_token": "2YotnFZFEjr1zCsicMWpAA", "expires_in": 86400, "scope": "agent.read agent.write" } A.4.2.7. AI Agent makes an authorized External Tool request AI Agent (https://ai-agent-app.example/) calls the External Tool API (Resource Server) at api.saas-tool.example with a valid access token GET /tools Host: api.saas-tool.example Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { ... } Acknowledgments The authors would like to thank the following people for their contributions and reviews of this specification: Kamron Batmanghelich, Paul Carleton, Sofia Desenberg, Meghna Dubey, George Fletcher, Bingrong He, Pieter Kasselman, Aaron Jeongwoo Kim, Kai Lehmann, David Lozano, Kaixuan Luo, Ken McCracken, Anuj Mistry, Dean H. Saxe, Kenneth Sinder, Filip Skokan, Phil Whipps. Document History [[ To be removed from the final specification ]] -06 * Changed the IdP Authorization Server error for a subject token that fails validation from invalid_grant to invalid_request, as required by Section 2.2.2 of RFC 8693 Parecki, et al. Expires 4 May 2027 [Page 76] Internet-Draft ID JWT Authz Grant October 2026 * Explained why access_denied is used rather than invalid_target when the Client or End-User is not authorized for the target -05 * Added invalid_target handling and resource governance checks for the resource parameter and claim * Added security considerations on Authorization Server and Protected Resource Metadata validation * Added mTLS certificate binding as an alternative sender- constraining mechanism for the ID-JAG, alongside DPoP * Added security considerations on storage and caching of subject tokens (ID Token, SAML Assertion, Refresh Token) * Added requirement that the IdP confirm the subject token is actually a token of the indicated type * Allowed an IdP to accept ID-JAGs it issued itself when explicitly configured * Profiled access_denied alongside invalid_grant for authorization failures at the IdP and Resource Authorization Server * Clarified SAML NameID stability and scope assumptions, and resolution of users by attributes other than NameID * Clarified the subjects whose claims the ID-JAG conveys (End-User, client, and actor) * Clarified that sub is selected for the Resource Authorization Server, and added a Subject Identifier Mapping section * Clarified that Token Exchange scope values are not OpenID Connect scopes * Specified how the Resource Authorization Server finds and validates ID-JAG signing keys * Added id_jag_signing_alg_values_supported IdP metadata parameter * Specified that IdP metadata is located per RFC 8414 * Clarified ID-JAG reuse limits and when the Client should request a new ID-JAG Parecki, et al. Expires 4 May 2027 [Page 77] Internet-Draft ID JWT Authz Grant October 2026 * Required the IdP to authenticate the Client in the Token Exchange request * Limited the Token Exchange request to a single audience value, and profiled invalid_target for an unrecognized audience or a resource not governed by it * Defined resource identifier comparison, made the IdP resource governance check a SHOULD, and required the access token to be restricted to the resources in the ID-JAG resource claim * Moved RFC 9728 to normative references * Clarified how the IdP validates a Refresh Token used as the subject token, and when the RFC 6749 scope comparison applies * Required the jwt-dpop grant type for DPoP-bound ID-JAGs, and required the Resource Authorization Server to reject an ID-JAG with an unsupported cnf confirmation method * Allowed a key-bound ID-JAG to be used in place of client authentication at the Resource Authorization Server * Fixed the tenant claims used in the client ID and subject identifier uniqueness rules * Added a tenant context check at the Resource Authorization Server * Added Privacy Considerations * Updated the email and calendaring use case to use a Client ID Metadata Document * Fixed examples (RS256 signatures, Cache-Control headers, mTLS client_id, consistent iss and exp values) * Corrected cited section numbers, removed citations from the abstract, and removed an unused reference * Editorial clarifications and typo fixes -04 * Clarified XAA vs ID-JAG terminology in abstract and intro * Added compatibility via new sub_id claim for Resource Apps configured with SAML SSO, and tightened definition of sub Parecki, et al. Expires 4 May 2027 [Page 78] Internet-Draft ID JWT Authz Grant October 2026 * Added client metadata property for DCR and CIMD * Clarified cross-domain use restriction -03 * Added a section defining terms used in the document * Updated language to be less specific to "enterprise" and more about the relationships between the IdP and Resource Authorization Server * Clarified the use of the resource and audience parameters in the token exchange request * Removed language discouraging the use of the actor_token in the token exchange request * Added a new AS metadata parameter authorization_grant_profiles_supported to enable a Resource Authorization Server to publish support for this profile -02 * Added reference and examples of a RAR authorization_details object in the Token Exchange and ID-JAG * Added refresh token as an optional subject token input to the Token Exchange for SAML interop * Described how to use DPoP with the ID-JAG exchange * Added aud_tenant and aud_sub claims to ID-JAG to support multi- tenant systems -01 * Moved ID-JAG definition to document root instead of nested under Token Exchange * Added proposed OpenID Connect tenant claim * Added authentication claims from ID Token * Adopted standard OAuth 2.0 role names instead of Resource App or Resource App's Authorization Server * Updated sequence diagram Parecki, et al. Expires 4 May 2027 [Page 79] Internet-Draft ID JWT Authz Grant October 2026 * Updated all inconsistent references of ID-JAG to "Identity Assertion JWT Authorization Grant" * Updated section references with more specific links * Added reference to scope parameter in ID-JAG processing rules * Added a section discussing client ID mapping and reference to Client ID Metadata Document * Added recommendations for refresh tokens -00 * Initial revision as adopted working group draft Authors' Addresses Aaron Parecki Okta Email: aaron@parecki.com Karl McGuinness Independent Email: public@karlmcguinness.com Brian Campbell Ping Identity Email: bcampbell@pingidentity.com Parecki, et al. Expires 4 May 2027 [Page 80]