<?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-parecki-oauth-identity-assertion-authz-grant-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="ID Token Authz Grant">Identity Assertion Authorization Grant</title>
    <seriesInfo name="Internet-Draft" value="draft-parecki-oauth-identity-assertion-authz-grant-04"/>
    <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="June" day="20"/>
    <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 60?>

<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.aaronpk.com/draft-parecki-oauth-identity-assertion-authz-grant/draft-parecki-oauth-identity-assertion-authz-grant.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-parecki-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/aaronpk/draft-parecki-oauth-identity-assertion-authz-grant"/>.</t>
    </note>
  </front>
  <middle>
    <?line 64?>

<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>resource</tt>:</dt>
        <dd>
          <t><bcp14>REQUIRED</bcp14> - The Issuer URL of the Resource Application's authorization server.</t>
        </dd>
        <dt><tt>audience</tt>:</dt>
        <dd>
          <t>The audience parameter <bcp14>MUST NOT</bcp14> be used to indicate the authorization server.</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
&resource=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 of the Resource Application's authorization server as defined in <xref section="4.1.3" sectionFormat="of" target="RFC7519"/></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",
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
}
]]></artwork>
      </section>
    </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.MediaTypes"/> 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: IESG</t>
          </li>
          <li>
            <t>Specification Document: This document</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="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="27" month="February" 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-04"/>
        </reference>
        <reference anchor="IANA.MediaTypes">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </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="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 455?>

<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"
  ],
  ...
}
]]></artwork>
          <t>LLM Agent discovers all necessary endpoints for authentication as well as support for the Token Exchange grant type <tt>urn:ietf:params:oauth:grant-type:token-exchange</tt></t>
          <ul empty="true">
            <li>
              <t>Note: Token Exchange <xref target="RFC8693"/> doesn't define an authorization server metadata parameter for <tt>requested_token_types_supported</tt> to discover if <tt>urn:ietf:params:oauth:token-type:id-jag</tt> is specifically supported. Currently, the LLM Agent needs to first attempt Token Exchange to learn if the specific Enterprise IdP supports issuing an Identity Assertion Grant. This specification could define an Authorization Server Metadata <xref target="RFC8414"/> parameter to enable the agent to discover if this request is 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="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
&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",
  "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",
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
}
]]></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, Pieter Kasselman, Kai Lehmann, Dean H. Saxe.</t>
    </section>
    <section numbered="false" anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-04</t>
      <ul spacing="normal">
        <li>
          <t>Improved section references to other specs</t>
        </li>
        <li>
          <t>Editorial clarifications</t>
        </li>
        <li>
          <t>Updated references to RFC9728</t>
        </li>
        <li>
          <t>Rewrote intro</t>
        </li>
        <li>
          <t>Added Brian Campbell as co-author</t>
        </li>
        <li>
          <t>Changed "<bcp14>SHOULD NOT</bcp14>" to "<bcp14>MUST NOT</bcp14>" issue access tokens in response to an ID-JAG it issued itself</t>
        </li>
      </ul>
      <t>-03</t>
      <ul spacing="normal">
        <li>
          <t>Added example for AI Agent</t>
        </li>
      </ul>
      <t>-02</t>
      <ul spacing="normal">
        <li>
          <t>Changed the <tt>aud</tt> property to the Issuer URL instead of the token endpoint</t>
        </li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Corrected the <tt>scope</tt> property in the JWT to match token exchange and JWT access token profile</t>
        </li>
        <li>
          <t>Formatting and editorial fixes</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial revision</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
V0ERRobXCHU5HA6tRzNmR+d+J1JkYDfDxCGGcY6BD7aJq8tHM1+FoPvqijkt
sSq6jPlxDd1Cqt5OIVlb6wXmyKvFbK3J9EJjlndlt4s/OGCx7NuXLDkqOCVp
YKLvhYupc6WCXzmQ/E1377dbmhPwz6/Rz6N9+Q+wbdLAxWZ3b0P0zXnLTCe9
3iKhfvbs6HjDPT3wlyjsId0Menh638LCqFqkJ13g+epAZ570glvTYkpUEQbn
Tw637+yhejPSur5+vUVifm93midt6WawIckS7D3Qfm0d0MrqVNr6JlaCb0fs
2n5bwi/m227JDafhVp16rZ/SUKJIsF0P5CHzFu6hsHA8KBT8lAHcJl+3hTnf
Jm5tnkCr8P6H64+HD4662zsGPg/d94/vvVDJKAu3T2fvH+XHLy6eXk6PnoSZ
etYt91+/etOfPn56XpSz9uBF/Qhv2aN3/xx26kbtgyjp9Xz/MSIFjePCnno3
hsu6tPeat8P+5rvZN2a4b720XZMML+4mjGwv7momGYzr7NXfqH/X+ST5kJw+
UL/8+OPP/Z/P9958OO+fHM5tj3Ny/GaPdED4tNQeI8/ZZPua4K8NuSnqWgix
Jo17cAIKiu3zuCABeSWF8h/a/6wef42vcIxWOat/8bB9P3rwblg+Vb/sHv10
1h4/uLf9bPvudNR//fR1d9LN387edC8fvXl0evzu71f/X7RsC4T1sHe0Oa9D
6eYh0mZHk6dTwDDV5vTTN8/OXTKdNyvWsCmkmKp7795dtb99r729BX/tdqPd
dni3u9fe3d3bu3Nnd3cL/syVWdURw1zl1L39XfizvzVXObWHN7rbzg0kvbdY
uW5u47TmNv4aJ077NBulZNtmzv4wXuHuO7jbGdDdH+za59ZNz2t6xdXQD9fO
bQsYkOylcX56so+pUrArkv+LPseqaY/Hp3CFqOcycCco0YXAjzu/28OX3dhP
mLrDkTfRc/lU2pRuWK84k5bvXpfOlaYyei611yS4YsZ/ze+l+Bob/t4nZU9p
ZfsJoE3cpEZLC9/jT+NyFAwbU65k0zu6Bb3lsNmqj2sdk313qxu8To0kjeju
mzdv2k6iL/7yK7ey0kXVb7UFcF9TkT5kVVh8/wPnmWkktvVwTZcOhsp2+fGp
QD/+bbH0x4zslpgiDd4WUpWv4fCIEWE3ZIGdQ44fjO9I9uWC0IyGa6HbZcGy
v9IWfqGcIEOc0X9grOclG2k4RtXElqC1O8qvTuWp1z5Bos80ODDNprWngyaX
CIl26Jn3zsBNrtNFC76fRddN5/15D4X7Hgt4OjpUXYEjuNdmeVwqdzhD6zqj
kHPHV8IVDblZP4L8OHQwx2F9V2ateei7LW0NEtmJS6mvbhvcCrFlu/RPIMYa
F+BywlnDFbh0oC9yCa40YsU1WOfOW2mcFd16K421rluPD4h/XPig/Lt69Wwt
4moePVR5yD+E2sECnx5lX5hiKDdb8+awvifhOtQ8jUy4dUpgXb+g6/ExpiyK
MN8JhsUVoISj22wRhPIT1Kv/SIGOyFvtjH6S7cz2jdINvodiU3GapUkMNrDo
QhDpgtqb3/yena6qAWJ2cl0+gPV/2swTnZu09MeG631yFJTlTvamYGA2UpSf
sk4iAQbXsQba3c+ZqZwnpqtjyfGilisXHGmC/zg/Zsr56/6gXDMUVkr3+rZE
rK7gFOWI9zPYmv5jcrflKon593kZBbGuTVoDA2ax/zpPpT3u+kdBljh36egu
MmjqTkE1ZGmq+hfOsEKf8lr+Qd4qUYININIuoeIWs+a0sbB977nJx6G8NBOh
FZ4wZwLqEsgwwXw+corp1jMSzDaQOf1/aldh462mntF0eqQ19lbS/nvrVMj/
4zxVf5YGuXM6Kj/HXmEr5287Ql6e+J/+uKY/7uLWppXj9T9dTh21/k/a5dQS
feBqtjd2OV1jK02PPA8pYXKJ8x9jAMQB+Z/UTmpFNyhoaO3+7mCrjZ7H9j7+
VcLfcOmq1gW6ptnmNZ1a3X16p7s35z6VG3W9FBZs8RxKncZTC/WBudjIKk5N
/csjtZ17nHQibfvDQa5K9FqddGF3nxWJ00j3BfrKuq1+/Gw+P+Zm++Fw+Mxt
i8OiXtGvF893x2HVfqky/0Tydu3ktpLW/tJYHQoxo5gSYeMBZpuKY7Cu4dWG
dM8S7R4epmJENg6d1bTEk9vOhu0bPbkrdu652S/jPvEn6+KzcP+qQZ7ViPbG
EJCud6vq3l8m+/7dG8ncJN/WbiTjs0bbnMwEDyq2kMmKWD/IU+FIK0Z5akM8
awdOKgeKIx8LNmRt1+j62ZGOWwp7yKFTN1HRJTX7aPx+kE7HfeSa95tDYEGq
+dntnWg63cVXUncUpleEXKcZlsqwaFLOUMyRvDzuTyUDnbTR97GaFfXs7CB4
Fo7BFgfWU45BNx0pWMyoFZxnwzgMHuKv3gKAl63gLKYcpmfIORJ4sgUf4+C5
GmGPhhY8CRTxBGz/8ANGUr4xhf3BE/m5jtrF/vorlilQ85sxSFBHooGowpIC
Lwnrt98ajfbWLrWBHCPBqchpwUCNOgbKKdPHtwtMnY5ibPvOzSZzMx7eej2J
qGDLf12CTnD/lZqhkcq/zgDfDyOk8QcwWAr8ZDzpS+7fIBMnvel9EAVN2xa8
iaM2dT+Q5h9rCIJI2GkYYHRvVKpKPtGJNO2t7YYDC7klqb2Z6/si9m3bmoGu
VCLDkdwrX03BIbs0JP9Cox6Ue93aYZ3esVTYUg5GVfMHqZJsJddjKZkFMMEj
amZbsrMC1md2bxh/wPRzUGqJBKRRFNI3Zrw3/hur7El5g5YAAA==

-->

</rfc>
