<?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.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-parecki-oauth-identity-assertion-authz-grant-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="ID Token Authz Grant">Identity Assertion Authorization Grant</title>
    <seriesInfo name="Internet-Draft" value="draft-parecki-oauth-identity-assertion-authz-grant-03"/>
    <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>
    <date year="2025" month="April" day="23"/>
    <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 56?>

<t>This specification provides a mechanism for an application to use an identity assertion to obtain an access token for a third-party API 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 60?>

<section anchor="introduction">
      <name>Introduction</name>
      <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 is an application of a combination of 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 when using identity tokens as the input to the token exchange request. This specification assumes that there is a single authorization server that is trusted by two applications in different trust domains, as typically found in an enterprise scenario where the two applications allow users to log in using the same enterprise identity provider. The same enterprise identity provider that is trusted by applications for single sign-on can be extended to broker access to APIs as well.</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>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.</t>
          </dd>
          <dt>Resource Application</dt>
          <dd>
            <t>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.</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.</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 Section 3 of <xref 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 Section 2.1 of <xref 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. Section 2.3.1 of <xref 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>. This may be fewer scopes than the application requested based on various policies in the IdP.</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 Section 4.1.2 of <xref 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 Section 4.1.3 of <xref 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 Section 4.3 <xref target="RFC8693"/>.</t>
          </dd>
          <dt><tt>jti</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - Unique ID of this JWT as defined in Section 4.1.7 of <xref target="RFC7519"/></t>
          </dd>
          <dt><tt>exp</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - as defined in Section 4.1.4 of <xref target="RFC7519"/></t>
          </dd>
          <dt><tt>iat</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> - as defined in Section 4.1.6 of <xref 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 Section 3.3 of <xref 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>.</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. the <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 as an additional <tt>response_type</tt> on the authorization request if using OIDC 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>SHOULD 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="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="I-D.ietf-oauth-resource-metadata">
          <front>
            <title>OAuth 2.0 Protected Resource Metadata</title>
            <author fullname="Michael B. Jones" initials="M. B." surname="Jones">
              <organization>Self-Issued Consulting</organization>
            </author>
            <author fullname="Phil Hunt" initials="P." surname="Hunt">
              <organization>Independent Identity, Inc.</organization>
            </author>
            <author fullname="Aaron Parecki" initials="A." surname="Parecki">
              <organization>Okta</organization>
            </author>
            <date day="15" month="October" year="2024"/>
            <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="Internet-Draft" value="draft-ietf-oauth-resource-metadata-13"/>
        </reference>
        <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>
      </references>
    </references>
    <?line 445?>

<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 using <xref target="I-D.ietf-oauth-resource-metadata"/></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 <tt>OAuth 2.0 Protected Resource Metadata</tt> per <xref target="I-D.ietf-oauth-resource-metadata"/> 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: Brian Campbell, Kamron Batmanghelich, Sofia Desenberg.</t>
    </section>
    <section numbered="false" anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <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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
MQw+YtY1qGzUFFM2TsLdw0Tv1v8Cg+g+196QAAA=

-->

</rfc>
