<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-oauth-identity-assertion-authz-grant-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.1 -->
  <front>
    <title abbrev="ID Token Authz Grant">Identity Assertion Authorization Grant</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-identity-assertion-authz-grant-00"/>
    <author fullname="Aaron Parecki">
      <organization>Okta</organization>
      <address>
        <email>aaron@parecki.com</email>
      </address>
    </author>
    <author fullname="Karl McGuinness">
      <organization>Independent</organization>
      <address>
        <email>public@karlmcguinness.com</email>
      </address>
    </author>
    <author fullname="Brian Campbell">
      <organization>Ping Identity</organization>
      <address>
        <email>bcampbell@pingidentity.com</email>
      </address>
    </author>
    <date year="2025" month="September" day="08"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>cross-domain</keyword>
    <keyword>authorization</keyword>
    <keyword>authz</keyword>
    <keyword>assertion</keyword>
    <keyword>enterprise</keyword>
    <abstract>
      <?line 62?>

<t>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 a common enterprise identity provider using Token Exchange <xref target="RFC8693"/> and JWT Profile for OAuth 2.0 Authorization Grants <xref target="RFC7523"/>.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="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 <eref target="https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Authorization Protocol Working Group mailing list (<eref target="mailto:oauth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/oauth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/oaouth-wg/oauth-identity-assertion-authz-grant"/>.</t>
    </note>
  </front>
  <middle>
    <?line 66?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In typical enterprise scenarios, applications are configured for single sign-on to the enterprise identity provider (IdP) using OpenID Connect or SAML. This enables users to access all the necessary enterprise applications using a single account at the IdP, and enables the enterprise to manage which users can access which applications.</t>
      <t>When one application wants to access a user's data at another application, it will start an interactive OAuth flow (<xref target="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.</t>
      <t>This specification enables this kind of "Cross App Access" to be managed by the enterprise IdP, similar to how the IdP manages single sign-on to individual applications.</t>
      <t>The draft specification Identity Chaining Across Trust Domains <xref target="I-D.ietf-oauth-identity-chaining"/> defines how to request a JWT authorization grant from an Authorization Server and exchange it for an Access Token at another Authorization Server in a different trust domain. The specification combines OAuth 2.0 Token Exchange <xref target="RFC8693"/> and JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants <xref target="RFC7523"/>. The draft supports multiple different use cases by leaving many details of the token exchange request and JWT authorization grant unspecified.</t>
      <t>This specification defines the additional details necessary to support interoperable implementations in enterprise scenarios when two applications are configured for single sign-on to the same enterprise identity provider. In particular, this specification uses identity assertions as the input to the token exchange request. This way, the same enterprise identity provider that is trusted by applications for single sign-on can be extended to broker access to APIs.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="roles">
        <name>Roles</name>
        <dl>
          <dt>Client</dt>
          <dd>
            <t>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 <xref target="I-D.ietf-oauth-identity-chaining"/>, this is the Client in trust domain A. This is also sometimes referred to as the "Requesting Application".</t>
          </dd>
          <dt>Resource Application</dt>
          <dd>
            <t>The application that provides an OAuth 2.0 Protected Resource. In <xref target="I-D.ietf-oauth-identity-chaining"/>, this is the Protected Resource in trust domain B. The Resource Application is made up of both an Authorization Server and a Resource Server as defined in <xref section="1.1" sectionFormat="of" target="RFC6749"/>.</t>
          </dd>
          <dt>Authorization Server (IdP)</dt>
          <dd>
            <t>The Identity Provider that is trusted by a set of applications in an organization's app ecosystem. In <xref target="I-D.ietf-oauth-identity-chaining"/>, this is the Authorization Server in trust domain A, which is also trusted by the Authorization Server of the Protected Resource in trust domain B.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>The example flow is for an enterprise <tt>acme</tt>, which uses a wiki app and chat app from different vendors, both of which are integrated into the enterprise's Identity Provider using OpenID Connect.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Role</th>
            <th align="left">App URL</th>
            <th align="left">Tenant URL</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Client</td>
            <td align="left">
              <tt>https://wiki.example</tt></td>
            <td align="left">
              <tt>https://acme.wiki.example</tt></td>
            <td align="left">Wiki app that embeds content from one or more resource applications</td>
          </tr>
          <tr>
            <td align="left">Resource Application</td>
            <td align="left">
              <tt>https://chat.example</tt></td>
            <td align="left">
              <tt>https://acme.chat.example</tt></td>
            <td align="left">Chat and communication app</td>
          </tr>
          <tr>
            <td align="left">Identity Provider</td>
            <td align="left">
              <tt>https://idp.example</tt></td>
            <td align="left">
              <tt>https://acme.idp.example</tt></td>
            <td align="left">Identity Provider</td>
          </tr>
        </tbody>
      </table>
      <t>Sequence Diagram</t>
      <artwork><![CDATA[
+---------+      +--------------+   +---------------+  +--------------+
|         |      |              |   |   Resource    |  |   Resource   |
|         |      |    IdP       |   |  Application  |  |  Application |
| Client  |      | Authorization|   | Authorization |  |   Resource   |
|         |      |   Server     |   |    Server     |  |    Server    |
+----+----+      +-------+------+   +-------+-------+  +------+-------+
     |                   |                  |                 |
     |                   |                  |                 |
     |  -------------->  |                  |                 |
     |   1 User SSO      |                  |                 |
     |                   |                  |                 |
     |     ID Token      |                  |                 |
     |  <- - - - - - - - |                  |                 |
     |                   |                  |                 |
     |                   |                  |                 |
     |                   |                  |                 |
     | 2 Token Exchange  |                  |                 |
     | ----------------> |                  |                 |
     |                   |                  |                 |
     |   ID-JAG          |                  |                 |
     | <- - - - - - - -  |                  |                 |
     |                   |                  |                 |
     |                   |                  |                 |
     |                   |                  |                 |
     |  3 Present ID-JAG |                  |                 |
     | ------------------+----------------> |                 |
     |                   |                  |                 |
     |    Access Token   |                  |                 |
     | <- - - - - - - - - - - - - - - - - - |                 |
     |                   |                  |                 |
     |                   |                  |                 |
     |                   |                  |                 |
     |  4 Resource Request with Access Token|                 |
     | -----------------------------------------------------> |
     |                   |                  |                 |
     |                   |                  |                 |
     |                   |                  |                 |
]]></artwork>
      <ol spacing="normal" type="1"><li>
          <t>User logs in to the Client, the Client obtains the Identity Assertion (e.g. OpenID Connect ID Token or SAML assertion)</t>
        </li>
        <li>
          <t>Client uses the Identity Assertion to request an Identity Assertion Authorization Grant for the Resource Application from the IdP</t>
        </li>
        <li>
          <t>Client exchanges the Identity Assertion Authorization Grant JWT for an Access Token at the Resource Application's token endpoint</t>
        </li>
        <li>
          <t>Client makes an API request with the Access Token</t>
        </li>
      </ol>
      <t>This specification is constrained to deployments where all Resource Application Resource Servers are leveraging the same IdP Authorization Server for Single-Sign-On (SSO) and session management services. The IdP provides a consistent trust boundary enabling the set of Resource Application Authorization Servers to honor the JWT Authorization Grant (ID-JAG) issued by the IdP. This specification also assumes that the Resource Server Authorization Servers delegate user authorization authority to the IdP (e.g. the IdP is trusted to ensure the scopes identified in the ID-JAG have been correctly authorized before issuing the ID-JAG token).</t>
    </section>
    <section anchor="user-authentication">
      <name>User Authentication</name>
      <t>The Client initiates an authentication request with the IdP using OpenID Connect or SAML.</t>
      <t>The following is an example using OpenID Connect</t>
      <artwork><![CDATA[
302 Redirect
Location: https://acme.idp.example/authorize?response_type=code&scope=openid&client_id=...
]]></artwork>
      <t>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.</t>
      <t>Note: The Enterprise IdP may enforce security controls such as multi-factor authentication before granting the user access to the Client.</t>
      <artwork><![CDATA[
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

{
  "id_token": "eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ...",
  "token_type": "Bearer",
  "access_token": "7SliwCQP1brGdjBtsaMnXo",
  "scope": "openid"
}
]]></artwork>
    </section>
    <section anchor="token-exchange">
      <name>Token Exchange</name>
      <t>The Client makes a Token Exchange <xref target="RFC8693"/> request to the IdP's Token Endpoint with the following parameters:</t>
      <dl>
        <dt><tt>requested_token_type</tt>:</dt>
        <dd>
          <t><bcp14>REQUIRED</bcp14> - The value <tt>urn:ietf:params:oauth:token-type:id-jag</tt> indicates that an ID Assertion JWT is being requested.</t>
        </dd>
        <dt><tt>audience</tt>:</dt>
        <dd>
          <t><bcp14>REQUIRED</bcp14> - The Issuer URL of the Resource Application's authorization server as defined in <xref section="2" sectionFormat="of" target="RFC8414"/>.</t>
        </dd>
        <dt><tt>resource</tt>:</dt>
        <dd>
          <t><bcp14>OPTIONAL</bcp14> - The Resource Identifier of the Resource Application's resource server as defined in <xref section="2" sectionFormat="of" target="RFC8707"/>.</t>
        </dd>
        <dt><tt>scope</tt>:</dt>
        <dd>
          <t><bcp14>OPTIONAL</bcp14> - The space-separated list of scopes at the Resource Application that is being requested.</t>
        </dd>
        <dt><tt>subject_token</tt>:</dt>
        <dd>
          <t><bcp14>REQUIRED</bcp14> - The identity assertion (e.g. the OpenID Connect ID Token or SAML assertion) for the target end-user.</t>
        </dd>
        <dt><tt>subject_token_type</tt>:</dt>
        <dd>
          <t><bcp14>REQUIRED</bcp14> - An identifier, as described in <xref section="3" sectionFormat="of" target="RFC8693"/>, that indicates the type of the security token in the <tt>subject_token</tt> parameter. For an OpenID Connect ID Token: <tt>urn:ietf:params:oauth:token-type:id_token</tt>, or for a SAML assertion: <tt>urn:ietf:params:oauth:token-type:saml2</tt>.</t>
        </dd>
      </dl>
      <t>The additional parameters defined in <xref section="2.1" sectionFormat="of" target="RFC8693"/> <tt>actor_token</tt> and <tt>actor_token_type</tt> are not used in this specification.</t>
      <t>Client authentication to the authorization server is done using the standard mechanisms provided by OAuth 2.0. <xref section="2.3.1" sectionFormat="of" target="RFC6749"/> defines password-based authentication of the client (<tt>client_id</tt> and <tt>client_secret</tt>), however, client authentication is extensible and other mechanisms are possible. For example, <xref target="RFC7523"/> defines client authentication using bearer JSON Web Tokens using <tt>client_assertion</tt> and <tt>client_assertion_type</tt>.</t>
      <t>The example below uses an ID Token as the Identity Assertion, and uses a JWT Bearer Assertion (<xref target="RFC7523"/>) as the client authentication method, (tokens truncated for brevity):</t>
      <artwork><![CDATA[
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/
&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...
]]></artwork>
      <section anchor="processing-rules">
        <name>Processing Rules</name>
        <t>The IdP <bcp14>MUST</bcp14> validate the subject token, and <bcp14>MUST</bcp14> validate that the audience of the Subject Token (e.g. the <tt>aud</tt> claim of the ID Token) matches the <tt>client_id</tt> of the client authentication of the request.</t>
        <t>The IdP 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 and scopes.</t>
        <t>The IdP may also introspect the authentication context described in the SSO assertion to determine if step-up authentication is required.</t>
      </section>
      <section anchor="response">
        <name>Response</name>
        <t>If access is granted, the IdP creates a signed Identity Assertion Authorization Grant JWT and returns it in the token exchange response defined in Section 2.2 of <xref target="RFC8693"/>:</t>
        <artwork><![CDATA[
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": "eyJhbGciOiJIUzI1NiIsI...",
  "token_type": "N_A",
  "scope": "chat.read chat.history",
  "expires_in": 300
}
]]></artwork>
        <dl>
          <dt><tt>issued_token_type</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - <tt>urn:ietf:params:oauth:token-type:id-jag</tt></t>
          </dd>
          <dt><tt>access_token</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - The Identity Assertion Authorization Grant JWT. (Note: Token Exchange requires the <tt>access_token</tt> response parameter for historical reasons, even though this is not an OAuth access token.)</t>
          </dd>
          <dt><tt>token_type</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - <tt>N_A</tt> (because this is not an OAuth access token.)</t>
          </dd>
          <dt><tt>scope</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14> if the scope of the issued token is identical to the scope requested by the client; otherwise, it is <bcp14>REQUIRED</bcp14>. Various policies in the IdP may result in different scopes being issued from the scopes the application requested.</t>
          </dd>
          <dt><tt>expires_in</tt>:</dt>
          <dd>
            <t><bcp14>RECOMMENDED</bcp14> - The lifetime in seconds of the authorization grant.</t>
          </dd>
          <dt><tt>refresh_token</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14> according to Section 2.2 of <xref target="RFC8693"/>. In the context of this specification, this parameter <bcp14>SHOULD NOT</bcp14> be used.</t>
          </dd>
        </dl>
        <section anchor="error-response">
          <name>Error Response</name>
          <t>On an error condition, the IdP returns an OAuth 2.0 Token Error response as defined in Section 5.2 of <xref target="RFC6749"/>, e.g:</t>
          <artwork><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store

{
  "error": "invalid_grant",
  "error_description": "Audience validation failed"
}
]]></artwork>
        </section>
      </section>
      <section anchor="jwt-authorization-grant">
        <name>Identity Assertion Authorization Grant JWT</name>
        <t>The Identity Assertion Authorization Grant JWT is issued and signed by the IdP, and describes the intended audience of the authorization grant as well as the client to which it was issued and the subject identifier of the resource owner, using the following claims:</t>
        <dl>
          <dt><tt>iss</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - The IdP <tt>issuer</tt> URL as defined in Section 4.1.1 of <xref target="RFC7519"/></t>
          </dd>
          <dt><tt>sub</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - The subject identifier (e.g. user ID) of the resource owner at the Resource Application as defined in <xref section="4.1.2" sectionFormat="of" target="RFC7519"/></t>
          </dd>
          <dt><tt>aud</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - The Issuer URL (<xref section="2" sectionFormat="of" target="RFC8414"/>) of the Resource Application's authorization server as defined in <xref section="4.1.3" sectionFormat="of" target="RFC7519"/></t>
          </dd>
          <dt><tt>resource</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14> - The Resource Identifier (<xref section="2" sectionFormat="of" target="RFC8707"/>) of the Resource Application's resource server (either a single URI or an array of URIs)</t>
          </dd>
          <dt><tt>client_id</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - An identifier of the client that this JWT was issued to, which <bcp14>MUST</bcp14> be recognized by the Resource Application's authorization server. For interoperability, the client identifier <bcp14>SHOULD</bcp14> be a <tt>client_id</tt> as defined in <xref section="4.3" sectionFormat="of" target="RFC8693"/>.</t>
          </dd>
          <dt><tt>jti</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - Unique ID of this JWT as defined in <xref section="4.1.7" sectionFormat="of" target="RFC7519"/></t>
          </dd>
          <dt><tt>exp</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - as defined in <xref section="4.1.4" sectionFormat="of" target="RFC7519"/></t>
          </dd>
          <dt><tt>iat</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - as defined in <xref section="4.1.6" sectionFormat="of" target="RFC7519"/></t>
          </dd>
          <dt><tt>scope</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14> - a JSON string containing a space-separated list of scopes associated with the token, in the format described in <xref section="3.3" sectionFormat="of" target="RFC6749"/></t>
          </dd>
        </dl>
        <t>The <tt>typ</tt> of the JWT indicated in the JWT header <bcp14>MUST</bcp14> be <tt>oauth-id-jag+jwt</tt>. Using typed JWTs is a recommendation of the JSON Web Token Best Current Practices <xref target="RFC8725"/>.</t>
        <t>An example JWT shown with expanded header and payload claims is below:</t>
        <artwork><![CDATA[
{
  "typ": "oauth-id-jag+jwt"
}
.
{
  "jti": "9e43f81b64a33f20116179",
  "iss": "https://acme.idp.example",
  "sub": "U019488227",
  "aud": "https://acme.chat.example/",
  "client_id": "f53f191f9311af35",
  "exp": 1311281970,
  "iat": 1311280970,
  "scope": "chat.read chat.history"
}
.
signature
]]></artwork>
        <t>The authorization server <bcp14>MAY</bcp14> add additional claims as necessary.</t>
        <t>Implementation notes:</t>
        <ul spacing="normal">
          <li>
            <t>If the IdP is multi-tenant and uses the same <tt>issuer</tt> for all tenants, the Resource Application will already have IdP-specific logic to determine the tenant from the OpenID Connect ID Token (e.g. a custom <tt>hd</tt> claim in Google) or SAML assertion, and will need to use that if the IdP also has only one client registration for the Resource Application.</t>
          </li>
          <li>
            <t><tt>sub</tt> should be an opaque ID, as <tt>iss</tt>+<tt>sub</tt> is unique. The IdP might want to also include the user's email here, which it should do as a new <tt>email</tt> claim. This would let the app dedupe existing users who may have an account with an email address but have not done SSO yet.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="token-request">
      <name>Access Token Request</name>
      <t>The Client makes an access token request to the Resource Application's token endpoint using the previously obtained Identity Assertion Authorization Grant as a JWT Assertion as defined by <xref target="RFC7523"/>.</t>
      <dl>
        <dt><tt>grant_type</tt>:</dt>
        <dd>
          <t><bcp14>REQUIRED</bcp14> - The value of <tt>grant_type</tt> is <tt>urn:ietf:params:oauth:grant-type:jwt-bearer</tt></t>
        </dd>
        <dt><tt>assertion</tt>:</dt>
        <dd>
          <t><bcp14>REQUIRED</bcp14> - The Identity Assertion Authorization Grant JWT obtained in the previous token exchange step</t>
        </dd>
      </dl>
      <t>The Client authenticates with its credentials as registered with the Resource Application's authorization server.</t>
      <t>For example:</t>
      <artwork><![CDATA[
POST /oauth2/token HTTP/1.1
Host: acme.chat.example
Authorization: Basic yZS1yYW5kb20tc2VjcmV0v3JOkF0XG5Qx2

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
assertion=eyJhbGciOiJIUzI1NiIsI...
]]></artwork>
      <section anchor="processing-rules-1">
        <name>Processing Rules</name>
        <t>All of Section 5.2 of <xref target="RFC7521"/> applies, in addition to the following processing rules:</t>
        <ul spacing="normal">
          <li>
            <t>Validate the JWT <tt>typ</tt> is <tt>oauth-id-jag+jwt</tt> (per <xref target="RFC8725"/>)</t>
          </li>
          <li>
            <t>The <tt>aud</tt> claim <bcp14>MUST</bcp14> identify the Issuer URL of the Resource Application's authorization server as the intended audience of the JWT.</t>
          </li>
          <li>
            <t>The <tt>client_id</tt> claim <bcp14>MUST</bcp14> identify the same client as the client authentication in the request.</t>
          </li>
        </ul>
      </section>
      <section anchor="response-1">
        <name>Response</name>
        <t>The Resource Application token endpoint responds with an OAuth 2.0 Token Response, e.g.:</t>
        <artwork><![CDATA[
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"
}
]]></artwork>
      </section>
    </section>
    <section anchor="idp-metadata">
      <name>Authorization Server (IdP) Metadata</name>
      <t>An IdP can advertise its support for this profile in its OAuth Authorization Server Metadata <xref target="RFC8414"/>. Identity and Authorization Chaining Across Domains <xref target="I-D.ietf-oauth-identity-chaining"/> defines a new metadata property <tt>identity_chaining_requested_token_types_supported</tt> for this purpose.</t>
      <t>To advertise support for the Identity Assertion Authorization Grant, the authorization server <bcp14>SHOULD</bcp14> include the following value in the <tt>identity_chaining_requested_token_types_supported</tt> property:</t>
      <t><tt>urn:ietf:params:oauth:token-type:id-jag</tt></t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="client-authentication">
        <name>Client Authentication</name>
        <t>This specification <bcp14>SHOULD</bcp14> only be supported for confidential clients.  Public clients <bcp14>SHOULD</bcp14> redirect the user with an OAuth 2.0 Authorization Request.</t>
      </section>
      <section anchor="step-up-authentication">
        <name>Step-Up Authentication</name>
        <t>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 <tt>insufficient_user_authentication</tt> 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 <xref target="RFC9470"/>.</t>
        <artwork><![CDATA[
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
}
]]></artwork>
        <t>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.</t>
        <t>TBD: It may make more sense to request the Identity Assertion 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.</t>
      </section>
      <section anchor="cross-domain-use">
        <name>Cross-Domain Use</name>
        <t>This specification is intended for cross-domain uses where the Client, Resource App, and Identity Provider are all in different trust domains. In particular, the Identity Provider <bcp14>MUST NOT</bcp14> issue access tokens in response to an ID-JAG it issued itself. Doing so could lead to unintentional broadening of the scope of authorization.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="media-types">
        <name>Media Types</name>
        <t>This section registers <tt>oauth-id-jag+jwt</tt>, a new media type <xref target="RFC2046"/> in the "Media Types" registry <xref target="IANA.media-types"/> in the manner described in <xref target="RFC6838"/>. It can be used to indicate that the content is a Identity Assertion Authorization Grant JWT.</t>
      </section>
      <section anchor="oauth-uri-registration">
        <name>OAuth URI Registration</name>
        <t>This section registers <tt>urn:ietf:params:oauth:token-type:id-jag</tt> in the "OAuth URI" subregistry of the "OAuth Parameters" registry <xref target="IANA.oauth-parameters"/>.</t>
        <ul spacing="normal">
          <li>
            <t>URN: urn:ietf:params:oauth:token-type:id-jag</t>
          </li>
          <li>
            <t>Common Name: Token type URI for a Identity Assertion JWT Authorization Grant</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Specification Document: This document</t>
          </li>
        </ul>
      </section>
      <section anchor="json-web-token-claims-registration">
        <name>JSON Web Token Claims Registration</name>
        <t>This section registers <tt>resource</tt> in the "JSON Web Token Claims" subregistry of the "JSON Web Token (JWT)" registry <xref target="IANA.jwt"/>. The "JSON Web Token Claims" subregistry was established by <xref target="RFC7519"/>.</t>
        <ul spacing="normal">
          <li>
            <t>Claim Name: <tt>resource</tt></t>
          </li>
          <li>
            <t>Claim Description: Resource</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Specification Document(s): <xref target="jwt-authorization-grant"/></t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC7521">
          <front>
            <title>Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="Y. Goland" initials="Y." surname="Goland"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification provides a framework for the use of assertions with OAuth 2.0 in the form of a new client authentication mechanism and a new authorization grant type. Mechanisms are specified for transporting assertions during interactions with a token endpoint; general processing rules are also specified.</t>
              <t>The intent of this specification is to provide a common framework for OAuth 2.0 to interwork with other identity systems using assertions and to provide alternative client authentication mechanisms.</t>
              <t>Note that this specification only defines abstract message flows and processing rules. In order to be implementable, companion specifications are necessary to provide the corresponding concrete instantiations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7521"/>
          <seriesInfo name="DOI" value="10.17487/RFC7521"/>
        </reference>
        <reference anchor="RFC7523">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a means for requesting an OAuth 2.0 access token as well as for client authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7523"/>
          <seriesInfo name="DOI" value="10.17487/RFC7523"/>
        </reference>
        <reference anchor="RFC8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
            <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC8707">
          <front>
            <title>Resource Indicators for OAuth 2.0</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document specifies an extension to the OAuth 2.0 Authorization Framework defining request parameters that enable a client to explicitly signal to an authorization server about the identity of the protected resource(s) to which it is requesting access.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8707"/>
          <seriesInfo name="DOI" value="10.17487/RFC8707"/>
        </reference>
        <reference anchor="RFC8725">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="I-D.ietf-oauth-identity-chaining">
          <front>
            <title>OAuth Identity and Authorization Chaining Across Domains</title>
            <author fullname="Arndt Schwenkschuster" initials="A." surname="Schwenkschuster">
              <organization>SPIRL</organization>
            </author>
            <author fullname="Pieter Kasselman" initials="P." surname="Kasselman">
              <organization>SPIRL</organization>
            </author>
            <author fullname="Kelley Burgin" initials="K." surname="Burgin">
              <organization>MITRE</organization>
            </author>
            <author fullname="Michael J. Jenkins" initials="M. J." surname="Jenkins">
              <organization>NSA-CCSS</organization>
            </author>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <date day="3" month="July" year="2025"/>
            <abstract>
              <t>   This specification defines a mechanism to preserve identity and
   authorization information across trust domains that use the OAuth 2.0
   Framework.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the Web Authorization
   Protocol Working Group mailing list (oauth@ietf.org), which is
   archived at https://mailarchive.ietf.org/arch/browse/oauth/.

   Source for this draft and an issue tracker can be found at
   https://github.com/oauth-wg/oauth-identity-chaining.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-identity-chaining-05"/>
        </reference>
        <reference anchor="IANA.media-types" target="https://www.iana.org/assignments/media-types">
          <front>
            <title>Media Types</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.oauth-parameters" target="https://www.iana.org/assignments/oauth-parameters">
          <front>
            <title>OAuth Parameters</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.jwt" target="https://www.iana.org/assignments/jwt">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC9470">
          <front>
            <title>OAuth 2.0 Step Up Authentication Challenge Protocol</title>
            <author fullname="V. Bertocci" initials="V." surname="Bertocci"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>It is not uncommon for resource servers to require different authentication strengths or recentness according to the characteristics of a request. This document introduces a mechanism that resource servers can use to signal to a client that the authentication event associated with the access token of the current request does not meet its authentication requirements and, further, how to meet them. This document also codifies a mechanism for a client to request that an authorization server achieve a specific authentication strength or recentness when processing an authorization request.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9470"/>
          <seriesInfo name="DOI" value="10.17487/RFC9470"/>
        </reference>
        <reference anchor="RFC9728">
          <front>
            <title>OAuth 2.0 Protected Resource Metadata</title>
            <author fullname="M.B. Jones" initials="M.B." surname="Jones"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <author fullname="A. Parecki" initials="A." surname="Parecki"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client or authorization server can use to obtain the information needed to interact with an OAuth 2.0 protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9728"/>
          <seriesInfo name="DOI" value="10.17487/RFC9728"/>
        </reference>
      </references>
    </references>
    <?line 479?>

<section anchor="use-cases">
      <name>Use Cases</name>
      <section anchor="enterprise-deployment">
        <name>Enterprise Deployment</name>
        <t>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.</t>
        <t>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 capabilites for the organization.  End-users get a better experience (SSO) and administrators get better security outcomes such multi-factor authentication and zero-trust.  SaaS applications today enable the administrator to establish trust with an IdP for user authentication.</t>
        <t>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.</t>
        <section anchor="preconditions">
          <name>Preconditions</name>
          <ul spacing="normal">
            <li>
              <t>The Client has a registered OAuth 2.0 Client with the IdP Authorization Server</t>
            </li>
            <li>
              <t>The Client has a registered OAuth 2.0 Client with the Resource Application</t>
            </li>
            <li>
              <t>Enterprise has established a trust relationship between their IdP and the Client for SSO and Identity Assertion Authorization Grant</t>
            </li>
            <li>
              <t>Enterprise has established a trust relationship between their IdP and the Resource Application for SSO and Identity Assertion Authorization Grant</t>
            </li>
            <li>
              <t>Enterprise has granted the Client permission to act on behalf of users for the Resource Application with a set of scopes</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="email-and-calendaring-applications">
        <name>Email and Calendaring Applications</name>
        <t>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 distruptive 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.</t>
        <t>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.</t>
        <t>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.</t>
        <section anchor="preconditions-1">
          <name>Preconditions</name>
          <ul spacing="normal">
            <li>
              <t>The Client does not have a pre-registered OAuth 2.0 client at the IdP Authorization Server or the Resource Application</t>
            </li>
            <li>
              <t>The Client has obtained an Identity Assertion (e.g. ID Token) from the IdP Authorization Server</t>
            </li>
            <li>
              <t>The Resource Application is configured to allow the Identity Assertion Authorization Grant from unregistered clients</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="llm-agent-using-enterprise-tools">
        <name>LLM Agent using Enterprise Tools</name>
        <t>AI agents, including those based on large language models (LLMs), are designed to manage user context, memory, and interaction state across multi-turn conversations. To perform complex tasks, these agents often integrate with external systems such as SaaS applications, internal services, or enterprise data sources. When accessing these systems, the agent operates on behalf of the end user, and its actions are constrained by the user’s identity, role, and permissions as defined by the enterprise. This ensures that all data access and operations are properly scoped and compliant with organizational access controls.</t>
        <section anchor="preconditions-2">
          <name>Preconditions</name>
          <ul spacing="normal">
            <li>
              <t>The LLM Agent has a registered OAuth 2.0 Client (<tt>com.example.ai-agent</tt>) with the Enterprise IdP (<tt>cyberdyne.idp.example</tt>)</t>
            </li>
            <li>
              <t>The LLM Agent has a registered OAuth 2.0 Client (<tt>4960880b83dc9</tt>) with the External Tool Application (<tt>saas.example.net</tt>)</t>
            </li>
            <li>
              <t>Enterprise has established a trust relationship between their IdP and the LLM Agent for SSO</t>
            </li>
            <li>
              <t>Enterprise has established a trust relationship between their IdP and the External Tool Application for SSO and Identity Assertion Authorization Grant</t>
            </li>
            <li>
              <t>Enterprise has granted the LLM Agent permission to act on behalf of users for the External Tool Application with a specific set of scopes</t>
            </li>
          </ul>
        </section>
        <section anchor="llm-agent-establishes-a-user-identity-with-enterprise-idp">
          <name>LLM Agent establishes a User Identity with Enterprise IdP</name>
          <t>LLM Agent discovers the Enterprise IdP's OpenID Connect Provider configuration based on a configured <tt>issuer</tt> that was previously establshed.</t>
          <ul empty="true">
            <li>
              <t>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.</t>
            </li>
          </ul>
          <artwork><![CDATA[
GET /.well-known/openid-configuration
Host: cyberdyne.idp.example
Accept: application/json

HTTP/1.1 200 OK
Content-Type: application/json

{
  "issuer": "https://cyberdyne.idp.example/",
  "authorization_endpoint": "https://cyberdyne.idp.example/oauth2/authorize",
  "token_endpoint": "https://cyberdyne.idp.example/oauth2/token",
  "userinfo_endpoint": "https://cyberdyne.idp.example/oauth2/userinfo",
  "jwks_uri": "https://cyberdyne.idp.example/oauth2/keys",
  "registration_endpoint": "https://cyberdyne.idp.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"],
  ...
}
]]></artwork>
          <t>LLM Agent discovers all necessary endpoints for authentication as well as support for the Identity Chaining requested token type <tt>urn:ietf:params:oauth:token-type:id-jag</tt></t>
        </section>
        <section anchor="idp-authorization-request-with-pkce">
          <name>IdP Authorization Request (with PKCE)</name>
          <t>LLM Agent generates a PKCE <tt>code_verifier</tt> and a <tt>code_challenge</tt> (usually a SHA256 hash of the verifier, base64url-encoded) and redirects the end-user to the Enterprise IdP with an authorization request</t>
          <artwork><![CDATA[
GET /authorize?
  response_type=code
  &client_id=com.example.ai-agent
  &redirect_uri=https://ai-agent.example.com/oauth2/callback
  &scope=openid+profile+email
  &state=xyzABC123
  &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256
Host: cyberdyne.idp.example
]]></artwork>
        </section>
        <section anchor="user-authenticates-and-authorizes-llm-agent">
          <name>User authenticates and authorizes LLM Agent</name>
          <t>Enterprise IdP authenticates the end-user and redirects back to the LLM Agent's registered client redirect URI with an authorization code:</t>
          <artwork><![CDATA[
https://ai-agent.example.com/oauth2/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=xyzABC123
]]></artwork>
          <t>LLM Agent exchanges the <tt>code</tt> and PKCE <tt>code_verifier</tt> to obtain an ID Token and Access Token for the IdP's UserInfo endpoint</t>
          <artwork><![CDATA[
POST /oauth2/token
Host: cyberdyne.idp.example
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https://ai-agent.example.com/oauth2/callback
&client_id=com.example.ai-agent
&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

HTTP/1.1 200 Ok
Content-Type: application/json

{
  "id_token": "eyJraWQiOiJzMTZ0cVNtODhwREo4VGZCXzdrSEtQ...",
  "token_type": "Bearer",
  "access_token": "7SliwCQP1brGdjBtsaMnXo",
  "scope": "openid profile email"
}
]]></artwork>
          <t>LLM Agent validates the ID Token using the published JWKS for the IdP</t>
          <artwork><![CDATA[
{
  "iss": "https://cyberdyne.idp.example/",
  "sub": "1997e829-2029-41d4-a716-446655440000",
  "aud": "com.example.ai-agent",
  "exp": 1984444800,
  "iat": 1684441200,
  "auth_time": 1684440000,
  "name": "John Connor",
  "email": "john.connor@cyberdyne.example",
  "email_verified": true
}
]]></artwork>
          <t>LLM Agent now has an identity binding for context</t>
        </section>
        <section anchor="llm-agent-calls-enterprise-external-tool">
          <name>LLM Agent calls Enterprise External Tool</name>
          <t>LLM Agent tool calls an external tool provided by an Enterprise SaaS Application (Resource Server) without a valid access token and is issued an authentication challenge per Protected Resource Metadata <xref target="RFC9728"/>.</t>
          <ul empty="true">
            <li>
              <t>Note: How agents discover available tools is out of scope of this specification</t>
            </li>
          </ul>
          <artwork><![CDATA[
GET /tools
Host: saas.example.net
Accept: application/json

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata=
  "https://saas.example.net/.well-known/oauth-protected-resource"
]]></artwork>
          <t>LLM Agent fetches the external tool resource's OAuth 2.0 Protected Resource Metadata per <xref target="RFC9728"/> to dynamically discover an authorization server that can issue an access token for the resource.</t>
          <artwork><![CDATA[
GET /.well-known/oauth-protected-resource
Host: saas.example.net
Accept: application/json

HTTP/1.1 200 Ok
Content-Type: application/json

{
   "resource":
     "https://saas.example.net/",
   "authorization_servers":
     [ "https://authorization-server.saas.com/" ],
   "bearer_methods_supported":
     ["header", "body"],
   "scopes_supported":
     ["agent.tools.read", "agent.tools.write"],
   "resource_documentation":
     "https://saas.example.net/tools/resource_documentation.html"
 }
]]></artwork>
          <t>LLM Agent discovers the Authorization Server configuration per <xref target="RFC8414"/></t>
          <artwork><![CDATA[
GET /.well-known/oauth-authorization-server
Host: authorization-server.saas.com
Accept: application/json

HTTP/1.1 200 Ok
Content-Type: application/json

{
  "issuer": "https://authorization-server.saas.com/",
  "authorization_endpoint": "https://authorization-server.saas.com/oauth2/authorize",
  "token_endpoint": "https://authorization-server.saas.com/oauth2/token",
  "jwks_uri": "https://authorization-server.saas.com/oauth2/keys",
  "registration_endpoint": "authorization-server.saas.com/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"
  ],
  ...
}
]]></artwork>
          <t>LLM Agent has learned all necessary endpoints and supported capabilites to obtain an access token for the external tool.</t>
          <t>If the <tt>urn:ietf:params:oauth:grant-type:jwt-bearer</tt> grant type is supported the LLM can first attempt to silently obtain an access token using an Identity Assertion Authorization Grant from the Enterprise's IdP otherwise it can fallback to interactively obtaining a standard <tt>authorization_code</tt> from the SaaS Application's Authorization Server</t>
          <ul empty="true">
            <li>
              <t>Note: This would benefit from an Authorization Server Metadata <xref target="RFC8414"/> property to indicate whether the Identity Assertion Authorization Grant form of <tt>jwt-bearer</tt> would be accepted by this authorization server. There are other uses of <tt>jwt-bearer</tt> that may be supported by the authorization server as well, and is not necessarily a reliable indication that the Identity Assertion Authorization Grant would be supported. See <eref target="https://github.com/aaronpk/draft-parecki-oauth-identity-assertion-authz-grant/issues/16">issue #16</eref>.</t>
            </li>
          </ul>
        </section>
        <section anchor="llm-agent-obtains-an-identity-assertion-grant-for-enterprise-external-tool-from-the-enterprise-idp">
          <name>LLM Agent obtains an Identity Assertion Grant for Enterprise External Tool from the Enterprise IdP</name>
          <t>LLM Agent makes an Identity Assertion Grant Token Exchange <xref target="RFC8693"/> request for the external tool's resource from the user's Enterprise IdP using the ID Token the LLM Agent obtained when establishing an identity binding context along with scopes and the resource identifier for the external tool that was returned in the tool's <tt>OAuth 2.0 Protected Resource Metadata</tt></t>
          <artwork><![CDATA[
POST /oauth2/token HTTP/1.1
Host: cyberdyne.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://authorization-server.saas.com/
&resource=https://saas.example.net/
&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...
]]></artwork>
          <t>If access is granted, the Enterprise IdP creates a signed Identity Assertion Authorization Grant JWT and returns it in the token exchange response defined in Section 2.2 of <xref target="RFC8693"/>:</t>
          <artwork><![CDATA[
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": "eyJhbGciOiJIUzI1NiIsI...",
  "token_type": "N_A",
  "scope": "agent.read agent.write",
  "expires_in": 300
}
]]></artwork>
          <t>Identity Assertion Authorization Grant JWT claims:</t>
          <artwork><![CDATA[
{
  "alg": "ES256",
  "typ": "oauth-id-jag+jwt"
}
.
{
  "jti": "9e43f81b64a33f20116179",
  "iss": "https://cyberdyne.idp.example",
  "sub": "1llb-b4c0-0000-8000-t800b4ck0000",
  "aud": "https://authorization-server.saas.com",
  "resource": "https://saas.example.net/",
  "client_id": "com.example.ai-agent",
  "exp": 1984445160,
  "iat": 1984445100,
  "scope": "agent.read agent.write"
}
.
signature
]]></artwork>
        </section>
        <section anchor="llm-agent-obtains-an-access-token-for-enterprise-external-tool">
          <name>LLM Agent obtains an Access Token for Enterprise External Tool</name>
          <t>LLM Agent makes a token request to the previously discovered external tool's Authorization Server token endpoint using the Identity Assertion Authorization Grant obtained from the Enterprise IdP as a JWT Assertion as defined by <xref target="RFC7523"/>.</t>
          <t>The LLM Agent authenticates with its client credentials that were registered with the SaaS Authorization Server</t>
          <ul empty="true">
            <li>
              <t>Note: How the LLM Agent registers with the Authorization Server (e.g static or dynamic client registration), and whether or not it has credentials, is out-of-scope of this specification</t>
            </li>
          </ul>
          <artwork><![CDATA[
POST /oauth2/token HTTP/1.1
Host: authorization-server.saas.com
Authorization: Basic yZS1yYW5kb20tc2VjcmV0v3JOkF0XG5Qx2

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
assertion=eyJhbGciOiJIUzI1NiIsI...
]]></artwork>
          <t>SaaS Authorization Server validates the Identity Assertion Authorization Grant using the published JWKS for the trusted Enterprise IdP</t>
          <artwork><![CDATA[
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"
}
]]></artwork>
        </section>
        <section anchor="llm-agent-makes-an-authorized-external-tool-request">
          <name>LLM Agent makes an authorized External Tool request</name>
          <t>LLM Agent tool calls an external tool provided by the Enterprise SaaS Application (Resource Server) with a valid access token</t>
          <artwork><![CDATA[
GET /tools
Host: saas.example.net
Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA"
Accept: application/json

HTTP/1.1 200 OK
Content-Type: application/json

{
  ...
}
]]></artwork>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the following people for their contributions and reviews of this specification: Kamron Batmanghelich, Sofia Desenberg, Meghna Dubey, George Fletcher, Pieter Kasselman, Kai Lehmann, Dean H. Saxe, Filip Skokan.</t>
    </section>
    <section numbered="false" anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial revision as adopted working group draft</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
v5qnZ1fOVgfdEu2bKJ5FW9znpV1YvJXHVXtYOZcLGMo0W9Tf5g7VmTXFlomd
UFwLypadf2y37FFJQLePIFPZdAOncuHl2iNxbo4eBfcIf85q/YHUm2asd7Ob
9BpsqJWHuBFzKxhs59SuD45ixaXyUysdBIb6VbcZVC2EWk6TtF78IBN9mvKh
3yzIrKZZC0fEhgbVd01i4MIXq+2cEJpC6SBeWLM1QhWUtRNoEMyVa4j1PKqV
wZd6tudSzrX5CSzeZ9lGvuSrNVVoCxOPdAqVKTPNTCRtjayfe1TMV9bNVV7y
BrH1yx9OzzbtZcFfUmVz6abTx+27hoVSQU9f/nQBX/VU7kff2cjTnKxK1+k9
O9l5sI8Cbqy0PfV6ixj9/l6ehG3ZMGNTpiuw/ag8myqkEdcpNfWd1yS6LMZr
msTJjaz2ipM3rC5xdQqWekpBiTzBNNaQD+m3YAR1hjEcQ+EvOYDdme6+PJ33
6bjqJ9AuePhh/vHk0Wl3Z1fDV0D3w7OjlyIcx+7Oxez9k+Ts5dXzUX76zI3F
D93s8M3rt4P86fNems3a3sv6Ea7Zp/OwBzt1q/whSnpTbZpHpKBwnBptwo7i
sTZVeK2ww8XNt/Nf9HDfFDKrdb2CdDhgaHlxKz6ZZLrOXv2Fms71puGH8OKR
+OXHH38e/Nzbf/uhNzg/qWyPdXKKHUrpgPBpqT1GBXeDaZ2DCZV2FYHhDqhL
4R6cg4QyzUkX5IivpFL8TZv21eOv8RWO0Spn9U8FbD/0H70bZs/FL3unP122
J4+Odn7YOcjHgzfP33Sn3eR69rY7evL2ycXZu7/e/J/oM6gzgFlTqAo31Z9G
dnJS5GnVmOTKoHr+9oeeTaZVxXIdrVIWvHWPjg7E4c5Re2cb/trr+ntt96C7
397b299/8GBvbxv+VErh6qihUt12dLgHfw63K9Vt+3iju2PdQNq7xu4I+jZO
q2/jb8vitM/jcUTmTWxtECMW7r6Dux2P7n5vFl8p9KPnFcHiauh3liv7AjYE
G+rWD6YOMFkJtkWm4KLbqWzd4flJbSlasBrtCTK0Ivlx69em+LLt/ncjezhy
KBWs/lJz3U3jGGXaKnpYZb9VXX1fya7VOaZYlVHzKz/FPHX8lVrKhVFW4TNA
m/SUKbXNcd/jLzlzIATbqa5k1lnKBb1l8dmym2Mdq21vu+u8ibQo9enu27dv
21auLf6OMbdLUyk91ypD/qGiInXKyrAUTVDO9FJIbKvhmjYdDIXpJFWkAvX4
N+nSn+AyW6ILaXhbqDByDodH5qqYDSnLb5lQT7Y/uvhlAuQC77yCa6HlvWDZ
X2kL7ygoyBRj9B9r+2nJRmqOUTayZNzSHuVXqzq4kKAlA5A0OErZpjGpnCbX
cUn9sGA6WSM3uZgajbhB7M+b1vtVI9V+j0U8nR0qgcER7GuzJMiEPZwmdpXU
x/nbKyGLhtyqH0H+1rlTYbFFd1ZtVKXoujKFYlQes5T86vbBLuNbtk1/B2qs
cQPdQjlruIOWj3QXt9BKI5bcQ3UunZXGWdG1s9JY67p2+IQUzwuflH9Wz46p
GK2AUettQaUnhOcpPLnA30IheF2RZKfs3R7bLci4DrXoIytunUJl2WmI3DRB
aoGirFkUYsMgwRRQzg6gCgfQw6NM12pXIJQ/nb76j2uosKzRz+inBC9NdzLV
mH4ozSrOtdPZoRoWVY0he+32q5vfN9OVdUBMUa0LCmulzKrTVwkqS38ku64W
0dQG2kn7s7GgJIV1oskYYcVKdXs/Z7q/AXFdFVAMFjXGueJwA/zHSRI5JzEX
B+XCHbdUPzcwdVp1ZcEoSAo/367oPyCPWyLCgH9XmlEQqAKhNTCgF6uB6gDm
hfMrq133uvu/bSiGOQJlPh8QR3PdJI6mN1v0k92YHCG8m6Bc42m6seL1j5wh
vkUDp1vd/c1O2WBRP2ZTT/bmV2QWmTR1p6Act9K9FxbOsEJ//Vr+Ybd/0oDI
phYlz5ixqLWRXQwG6qQMSk7SYTrJEypGoKpDdENM6iK/mGoQJCOaGjKrS1Pt
KkzQTRcV6n6itMb+Svp/f50+Bn87Z9Ufpg3zUv1ATcs4fLhQs+Xn2JtslIP7
lmYgn/j/1s26dfPirrulM/n/DXgtY+AP2oDXEL1jq8O3NuBdYyt1+8YCUtxw
hPOfYeDEAvnv1Cmslj9Wvaeg1rUHe952Gx2W7UP8K4O/4dJNred0JeZkGz/K
ZbGKp6LYfmx1J+2D7n7FSStv1HXVWEARlR2wWpAt1DkqIZhVXKfqV3lqezhZ
eSvKwQDnvqw11Oq9C/s8rUjLWoNYoBOt2/SpmDZWDO2ZzkgcpbMbJLE6IeiX
vat9kth8WGowPJMJomZyU6lpfoWvDoWYukoZl4GHaY3S/VjX+mxT9lGTFgQ8
TFVvbIBaq2lJf3E7HrZv9Rev2MPpdueP/cQfrJ/Twv0rx5JWI9pbI02qsKqs
399NVP6ztxRazvxKjM40ndMBh5L1pFMp1g8MlfjLipGh2rDQ2sGW0vHgaMkC
9K7tTV0/qc5yZGFvQPQDh8IfUY+OxqfjKJ8MkAc+bA6BoYjmF7snpu5gGNzI
chU3uiHkWk3ORIy1dvJEBBz9S4JBLhOXSRV9H4hZWs+cjp0f3AlY78BIsgko
pmMBixm3nF48DFwsExcRADhqgSk3GkdwJR+Iect5KmLMin8SUogoaTmXATVo
/wHZRAgDteBj4LwQY2y80IKBgGCedYAUPoiW8yQIg6nTu4lvXCqI0OXkzjP5
mzO1mPm3X//tV0yGpxY3ExCfljgDOYWJ64WSkN9+azRA+6FuoLIXEOIilcLN
9WPy58zi5AZROUrifOqQD6Pxv6XpepKulwAA

-->

</rfc>
