<?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-oauth-ai-agents-on-behalf-of-user-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="OAuth 2.0 Extension: On-Behalf-Of User Authorization for AI Agents">OAuth 2.0 Extension: On-Behalf-Of User Authorization for AI Agents</title>
    <seriesInfo name="Internet-Draft" value="draft-oauth-ai-agents-on-behalf-of-user-00"/>
    <author fullname="Thilina Shashimal Senarath">
      <organization>WSO2</organization>
      <address>
        <email>thilinasenarath97@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="May" day="02"/>
    <area>Security</area>
    <keyword>ai-agents</keyword>
    <keyword>authorization</keyword>
    <abstract>
      <?line 36?>

<t>This specification defines an extension to the OAuth 2.0 Authorization Framework <xref target="RFC6749"/> to enable AI agents to obtain delegated access tokens to act on behalf of users. It introduces a new authorization request parameter, <tt>requested_agent</tt>, and defines a grant type, <tt>urn:ietf:params:oauth:grant-type:agent-authorization_code</tt>, specifically designed to facilitate explicit user consent for an agent's actions and enable the agent to exchange an authorization code for a delegated access token using its own authentication credentials (an agent token). The extension ensures secure delegation, explicit user consent captured at the authorization server, and enhanced auditability through specific token claims that document the delegation path from the user to the agent acting via a client application.</t>
    </abstract>
  </front>
  <middle>
    <?line 41?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>AI agents are increasingly integrated into systems to perform tasks on behalf of users. These agents often require access to protected resources, necessitating a robust and secure authorization mechanism that accurately reflects the user's intent and the agent's role in the access request. Standard OAuth 2.0 flows, such as the Authorization Code Grant <xref target="RFC6749"/> and the Client Credentials Grant <xref target="RFC6749"/>, do not fully address the nuances of agent delegation where explicit user consent for a specific agent's action is required and the agent itself acts as a distinct identity in the token exchange process. While the OAuth 2.0 Token Exchange specification <xref target="RFC8693"/> provides a mechanism for exchanging tokens, it typically focuses on inter-service communication or impersonation flows initiated server-side and doesn't inherently provide a mechanism for obtaining explicit user consent for an agent via the front channel initiated from the authorization endpoint.</t>
      <t>This specification extends OAuth 2.0 to specifically support scenarios where a user delegates authority to an AI agent. It leverages the existing Authorization Code Grant flow by introducing mechanisms at the authorization endpoint to identify the specific agent for which delegation is sought and by defining a new grant type for the token endpoint that allows the agent to authenticate itself while presenting the user-approved authorization code. The resulting delegated access token explicitly records the identity of the user, the agent, and the client application involved, facilitating clear audit trails.</t>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>This specification uses the following terms:</t>
      <dl>
        <dt>Agent:</dt>
        <dd>
          <t>An autonomous software entity that acts on behalf of a user. An agent has a distinct identity and authentication credentials separate from the client application that might host or invoke it.</t>
        </dd>
        <dt>Agent Token:</dt>
        <dd>
          <t>A security token (e.g., a JWT <xref target="RFC7519"/>) used by an agent to authenticate itself to the authorization server or resource servers. The sub claim of an agent token identifies the agent.</t>
        </dd>
        <dt>Delegated Access Token:</dt>
        <dd>
          <t>An access token issued by the authorization server to an agent, granting it permission to access protected resources on behalf of a specific user. This token explicitly documents the delegation path.</t>
        </dd>
        <dt>User:</dt>
        <dd>
          <t>The resource owner who grants consent for an agent to access their protected resources.</t>
        </dd>
        <dt>Client:</dt>
        <dd>
          <t>An application that initiates the authorization flow and facilitates the interaction between the user, agent, and authorization server. This is the "client" as defined in OAuth 2.0 <xref target="RFC6749"/>.</t>
        </dd>
        <dt>Authorization Server:</dt>
        <dd>
          <t>The server that issues access tokens to the client and agent after successfully authenticating a resource owner and obtaining authorization.</t>
        </dd>
        <dt>Resource Server:</dt>
        <dd>
          <t>The server hosting the protected resources, capable of accepting and validating delegated access tokens. Resource server can be a model context protocol (MCP) server, another agent or genaric protected resource.</t>
        </dd>
        <dt>Authorization Code:</dt>
        <dd>
          <t>A temporary, single-use code issued by the authorization server to the client's redirect URI after the user has authenticated and granted consent for a specific agent to act on their behalf. This code is then provided to the agent.</t>
        </dd>
      </dl>
    </section>
    <section anchor="preconditions">
      <name>Preconditions</name>
      <t>The agent holds a valid agent token, obtained via a separate process, which is not covered in this document. The agent token is used to authenticate the agent and authorize it to perform actions on its own behalf.</t>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>This extension defines a flow where a client application facilitates user consent for an agent, and the agent then uses this consent along with its own authentication to obtain a delegated access token.</t>
      <section anchor="high-level-overview">
        <name>High-Level Overview</name>
        <ol spacing="normal" type="1"><li>
            <t>The client application initiates the flow by directing the user's user-agent to the Authorization Server's authorization endpoint, including a requested_agent parameter identifying the agent.</t>
          </li>
          <li>
            <t>The Authorization Server authenticates the user and presents a consent screen detailing the client, the requested agent, and the scopes.
Upon user consent, the Authorization Server issues a short-lived Authorization Code tied to the user, client, and agent, and redirects the user-agent back to the client's redirect_uri.</t>
          </li>
          <li>
            <t>The client receives the Authorization Code (via the user-agent redirect). The client then typically passes this code to the agent.</t>
          </li>
          <li>
            <t>The agent requests a Delegated Access Token from the Authorization Server's token endpoint using the new <tt>urn:ietf:params:oauth:grant-type:agent-authorization_code</tt> grant type. This request includes the Authorization Code, the PKCE code_verifier, and the agent token.</t>
          </li>
          <li>
            <t>The Authorization Server validates the request, including verifying the Authorization Code, the PKCE code_verifier, and the Agent Token. It ensures the Agent Token corresponds to the requested_agent approved by the user.</t>
          </li>
          <li>
            <t>Upon successful validation, the Authorization Server issues a Delegated Access Token to the agent. This token is typically a JWT containing claims identifying the user (sub), the client (azp), and the agent (act claim).</t>
          </li>
        </ol>
      </section>
      <section anchor="sequence-diagram">
        <name>Sequence Diagram</name>
        <artwork type="ascii-art"><![CDATA[
+------------+          +--------+        +--------+        +--------------------+        +----------------+
| User-Agent |          | Client |        | Agent  |        | Authorization      |        | Resource       |
|            |          |        |        |        |        | Server             |        | Server         |
+------------+          +--------+        +--------+        +--------------------+        +----------------+
       |                     |                 |                       |                          |
       |                     |       (A) Need to act on behalf of user |                          |
       |                     |<----------------|                       |                          |
       |                     |                 |                       |                          |
           (B) Open browser with authorization url + code challenge + requested_agent             |                          
       |<--------------------|                 |                       |                          |
       |                     |                 |                       |                          |     
       |   (C) Request to authorization endpoint                       |                          |
       |-------------------------------------------------------------->|                          |
       |                     |                 |                       |                          |
       |   (D) User authenticates and consents (show agent + scopes)   |                          |
       |<------------------------------------------------------------->|                          |
       |                     |                 |                       |                          |
       |   (E) Redirect with Authorization Code                        |                          |
       |<--------------------------------------------------------------|                          |
       |                     |                 |                       |                          |
       |   (F) Authorization Code              |                       |                          |
       |-------------------->|                 |                       |                          |
       |                     |   (G) POST /token (code + verifier + agent token)                  |
       |                     |---------------------------------------->|                          |
       |                     |                 |                       |                          |
       |                     |   (H) Delegated Access Token (JWT)      |                          |
       |                     |<----------------------------------------|                          |
       |                     |                                         |                          |
       |                     |   (I) Access Resource with Delegated Access Token                  |
       |                     |------------------------------------------------------------------->|
       |                     |                 |                       |(J) JWKS Token validation |
       |                     |                 |                       |<-------------------------|
       |                     |                 |                       |                          |
       |                     |       (K) Protected Resource Response   |                          |                      
       |                     |<-------------------------------------------------------------------|
       |                     |                 |                       |                          |
       |                     |   (L) Response with Resource Data       |                          |
       |                     |---------------->|                       |                          |
]]></artwork>
        <t>The steps in the sequence diagram are as follows:</t>
        <t>A. Agent requests to access protected resources on behalf of the user.</t>
        <t>B. Client initiates Authorization Request via user-agent, including requested_agent and PKCE challenge.</t>
        <t>C. User-agent is redirected to the Authorization Server's authorization endpoint.</t>
        <t>D. User authenticates and grants consent for the specific agent and requested scopes at the Authorization Server.</t>
        <t>E. Authorization Server issues Authorization Code and redirects user-agent back to client.</t>
        <t>F. Client receives the code.</t>
        <t>G. Client requests Delegated Access Token using the <tt>urn:ietf:params:oauth:grant-type:agent-authorization_code</tt> grant type, presenting the code, PKCE verifier, and its Agent Token.</t>
        <t>H. Authorization Server validates the request (code, verifier, and agent token) and issues the Delegated Access Token.</t>
        <t>I. Client accesses protected resources using the Delegated Access Token.</t>
        <t>J. Resource Server validates the token (e.g., by verifying the signature and claims offline).</t>
        <t>K. Resource Server processes the request and returns the requested resource.</t>
        <t>L. Agent receives the resource data.</t>
      </section>
    </section>
    <section anchor="detailed-protocol-steps">
      <name>Detailed Protocol Steps</name>
      <section anchor="user-authorization-request">
        <name>User Authorization Request</name>
        <t>The client initiates the flow by directing the user's user-agent to the authorization server's authorization endpoint. This request is an extension of the standard Authorization Code Grant request (Section 4.1.1 of <xref target="RFC6749"/>) and SHOULD include the <tt>requested_agent</tt> parameter.</t>
        <artwork><![CDATA[
GET /authorize?response_type=code&
client_id=<client_id>&
redirect_uri=<redirect_uri>&
scope=<scope>&
state=<state>&
code_challenge=<code_challenge>&
code_challenge_method=S256&
requested_agent=<agent_id> HTTP/1.1
]]></artwork>
        <section anchor="parameters">
          <name>Parameters</name>
          <dl>
            <dt>requested_agent:</dt>
            <dd>
              <t>REQUIRED. The unique identifier of the agent for which the client is requesting delegated access on behalf of the user. This identifier MUST uniquely identify the agent within the system and MUST be understood by the Authorization Server.</t>
            </dd>
            <dt>other parameters:</dt>
            <dd>
              <t>The request MUST also include the standard OAuth 2.0 parameters such as <tt>response_type</tt>, <tt>client_id</tt>, <tt>redirect_uri</tt>, <tt>scope</tt>, <tt>state</tt>, and PKCE parameters (<tt>code_challenge</tt> and <tt>code_challenge_method</tt>).</t>
            </dd>
          </dl>
        </section>
        <section anchor="authorization-server-processing">
          <name>Authorization Server Processing</name>
          <t>Upon receiving the authorization request, the Authorization Server MUST perform the following steps:</t>
          <ol spacing="normal" type="1"><li>
              <t>Validate the request parameters according to the OAuth 2.0 Authorization Code Grant (Section 4.1.1 of <xref target="RFC6749"/>).</t>
            </li>
            <li>
              <t>Validate the <tt>requested_agent</tt>. The Authorization Server MUST verify that the provided requested_agent corresponds to a recognized agent identity. The nature of this verification is outside the scope of this document but might involve checking an internal registry of agents.</t>
            </li>
            <li>
              <t>Authroization server MAY Display a consent screen to the User. This screen SHOULD clearly indicate:  </t>
              <ul spacing="normal">
                <li>
                  <t>The name or identity of the client application initiating the request.</t>
                </li>
                <li>
                  <t>The identity of the agent (requested_agent) for which delegation is being requested.</t>
                </li>
                <li>
                  <t>The specific scopes of access being requested.</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>If the request is valid and the user grants consent, the Authorization Server proceeds to issue an Authorization Code. If the request is invalid, the Authorization Server returns an Error Response.</t>
        </section>
        <section anchor="authorization-code-response">
          <name>Authorization Code Response</name>
          <t>If the user grants consent, the Authorization Server issues an Authorization Code and redirects the user-agent back to the client's redirect_uri (if provided in the request) or a pre-registered redirect URI.</t>
          <artwork><![CDATA[
HTTP/1.1 302 Found
Location: <redirect_uri>?code=<authorization_code>&state=<state>
]]></artwork>
          <section anchor="parameters-1">
            <name>Parameters</name>
            <t>Similar to the standard Authorization Code Grant (Section 4.1.2 of <xref target="RFC6749"/>), the response includes:</t>
            <dl>
              <dt>code:</dt>
              <dd>
                <t>REQUIRED. The Authorization Code issued by the Authorization Server. This code is a short-lived, single-use code that the client will pass to the agent.</t>
              </dd>
              <dt>state:</dt>
              <dd>
                <t>OPTIONAL. The state parameter passed in the initial request, if present. This value MUST be included in the redirect URI to maintain state between the request and callback.</t>
              </dd>
            </dl>
          </section>
        </section>
        <section anchor="error-response">
          <name>Error Response</name>
          <t>If the request fails, the Authorization Server redirects the user-agent back to the client's redirect_uri with error parameters.</t>
          <artwork><![CDATA[
HTTP/1.1 302 Found
Location: <redirect_uri>?error=<error_code>&state=<state>
]]></artwork>
        </section>
      </section>
      <section anchor="delegated-access-token-request">
        <name>Delegated Access Token Request</name>
        <t>Upon receiving the Authorization Code, the client then requests a Delegated Access Token from the Authorization Server's token endpoint using the <tt>urn:ietf:params:oauth:grant-type:agent-authorization_code</tt> grant type.</t>
        <artwork><![CDATA[
POST /token HTTP/1.1
Host: authorization-server.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:agent-authorization_code&
client_id=<client_id>&
code=<authorization_code>&
code_verifier=<code_verifier>&
redirect_uri=<redirect_uri>&
agent_token=<agent_token>
]]></artwork>
        <section anchor="parameters-2">
          <name>Parameters</name>
          <dl>
            <dt>agent_token:</dt>
            <dd>
              <t>REQUIRED. The agent token used to authenticate the agent. This token MUST be a valid token issued to the agent and MUST include the sub claim identifying the agent.</t>
            </dd>
            <dt>other parameters:</dt>
            <dd>
              <t>The request MUST also include the standard OAuth 2.0 parameters such as <tt>client_id</tt>, <tt>code</tt>, <tt>code_verifier</tt>, and <tt>redirect_uri</tt>.</t>
            </dd>
          </dl>
        </section>
        <section anchor="authorization-server-processing-1">
          <name>Authorization Server Processing</name>
          <t>Upon receiving the token request, the Authorization Server MUST perform the following steps:</t>
          <ol spacing="normal" type="1"><li>
              <t>Validate the request parameters according to the OAuth 2.0 Token Endpoint (Section 4.1.3 of <xref target="RFC6749"/>).</t>
            </li>
            <li>
              <t>The Authorization Server MUST verify that the agent token is valid, not expired.</t>
            </li>
            <li>
              <t>Verify that the authenticated agent identity (obtained from the Agent Token's sub claim) matches the requested_agent value that the user consented to during the initial Authorization Request and which is associated with the code.</t>
            </li>
          </ol>
          <t>If all validations pass, the Authorization Server issues a Delegated Access Token. If any validation fails, the Authorization Server returns an Error Response.</t>
        </section>
        <section anchor="delegated-access-token-response">
          <name>Delegated Access Token Response</name>
          <t>If the Token Request is valid, the Authorization Server issues a Delegated Access Token to the agent. This token SHOULD be a JSON Web Token (JWT) <xref target="RFC7519"/> to include claims that document the delegation.</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token": "<delegated_access_token>",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "<granted_scope>"
}
]]></artwork>
          <section anchor="parameters-3">
            <name>Parameters</name>
            <t>Similar to the standard Authorization Code Grant (Section 4.1.4 of <xref target="RFC6749"/>)</t>
          </section>
        </section>
        <section anchor="error-response-1">
          <name>Error Response</name>
          <t>If the request is invalid, the Authorization Server returns an error response with an HTTP 400 (Bad Request) status code.</t>
          <artwork><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_grant"
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="delegated-access-token-structure-and-claims">
      <name>Delegated Access Token Structure and Claims</name>
      <t>The Delegated Access Token SHOULD be a JWT Profile for OAuth 2.0 Access Tokens <xref target="RFC9068"/>. It SHOULD carry claims that explicitly document the delegation chain.</t>
      <t>In addition to standard JWT claims (e.g., iss, aud, exp, iat, jti), a Delegated Access Token issued via this flow MUST contain the following claims:</t>
      <dl>
        <dt>act:</dt>
        <dd>
          <t>REQUIRED. Actor - represents the party acting on behalf of the subject (Section 4.1 of <xref target="RFC8693"/>). In a Delegated Access Token issued via this flow, this claim MUST contain a JSON object with at least the following member:
* sub: REQUIRED. The unique identifier of the Agent that is acting on behalf of the user.
* Additional members MAY be included in the act claim.</t>
        </dd>
      </dl>
      <t>Example Decoded JWT Payload:</t>
      <artwork><![CDATA[
{
  "iss": "https://authorization-server.com/oauth2/token",
  "aud": "resource_server",
  "sub": "user-456",
  "azp": "s6BhdRkqt3",
  "scope": "read:email write:calendar",
  "exp": 1746009896,
  "iat": 1746006296,
  "jti": "unique-token-id",
  "act": {
    "sub": "agent-finance-v1",
    "aut": "APPLICATION_AGENT"
  },
  "aut": "APPLICATION_USER"
}
]]></artwork>
      <t>Resource Servers consuming this token can inspect the sub claim to identify the user and the act.sub claim to identify the specific agent that is performing the action. This provides a clear and auditable delegation path.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <dl>
        <dt>Agent Authentication:</dt>
        <dd>
          <t>The security of this flow relies heavily on the Authorization Server's ability to securely authenticate the agent during the Token Request using the Agent Token. The method by which agents obtain and secure their Agent Tokens is critical and outside the scope of this specification but MUST be implemented securely.</t>
        </dd>
        <dt>Proof Key for Code Exchange (PKCE):</dt>
        <dd>
          <t>PKCE <xref target="RFC7636"/> is REQUIRED to prevent authorization code interception attacks, especially relevant if the client (and thus the agent receiving the code) is a public client or runs in an environment where the redirect URI cannot be strictly protected.</t>
        </dd>
        <dt>Single-Use and Short-Lived Authorization Codes:</dt>
        <dd>
          <t>Authorization Codes MUST be single-use and have a short expiration time to minimize the window for compromise.</t>
        </dd>
        <dt>Binding Code to Agent and Client:</dt>
        <dd>
          <t>The Authorization Server MUST bind the Authorization Code to the specific user, client (client_id), and requested agent (requested_agent) during issuance and verify this binding during the Token Request.</t>
        </dd>
        <dt>Clear User Consent:</dt>
        <dd>
          <t>The consent screen presented to the user SHOULD clearly identify the agent and the requested scopes to ensure the user understands exactly what authority they are delegating and to whom.</t>
        </dd>
        <dt>Auditability:</dt>
        <dd>
          <t>The claims in the Delegated Access Token (sub, act) provide essential information for auditing actions performed using the token, clearly showing who (user) authorized the action, which application (client) facilitated it, and which entity (agent) performed it.</t>
        </dd>
        <dt>Token Revocation:</dt>
        <dd>
          <t>Mechanisms for revoking Delegated Access Tokens are essential. Revocation could be triggered by:
* The user revoking consent.
* The agent's Agent Token being revoked.
* The user's account being disabled.
* The agent's identity being disabled.
* The client application being disabled.
</t>
          <t>Resource Servers or Authorization Servers MUST have mechanisms to check the revocation status of tokens.</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="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="RFC7636">
          <front>
            <title>Proof Key for Code Exchange by OAuth Public Clients</title>
            <author fullname="N. Sakimura" initials="N." role="editor" surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Agarwal" initials="N." surname="Agarwal"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>OAuth 2.0 public clients utilizing the Authorization Code Grant are susceptible to the authorization code interception attack. This specification describes the attack as well as a technique to mitigate against the threat through the use of Proof Key for Code Exchange (PKCE, pronounced "pixy").</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7636"/>
          <seriesInfo name="DOI" value="10.17487/RFC7636"/>
        </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>
        <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="RFC9068">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens</title>
            <author fullname="V. Bertocci" initials="V." surname="Bertocci"/>
            <date month="October" year="2021"/>
            <abstract>
              <t>This specification defines a profile for issuing OAuth 2.0 access tokens in JSON Web Token (JWT) format. Authorization servers and resource servers from different vendors can leverage this profile to issue and consume access tokens in an interoperable manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9068"/>
          <seriesInfo name="DOI" value="10.17487/RFC9068"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC7662">
          <front>
            <title>OAuth 2.0 Token Introspection</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <date month="October" year="2015"/>
            <abstract>
              <t>This specification defines a method for a protected resource to query an OAuth 2.0 authorization server to determine the active state of an OAuth 2.0 token and to determine meta-information about this token. OAuth 2.0 deployments can use this method to convey information about the authorization context of the token from the authorization server to the protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7662"/>
          <seriesInfo name="DOI" value="10.17487/RFC7662"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
