<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-rosenberg-oauth-aauth-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="AAuth">AAuth - Agentic Authorization OAuth 2.1 Extension</title>
    <seriesInfo name="Internet-Draft" value="draft-rosenberg-oauth-aauth-02"/>
    <author fullname="Jonathan Rosenberg">
      <organization>jdrosen.net</organization>
      <address>
        <email>jdrosen@jdrosen.net</email>
      </address>
    </author>
    <author fullname="Pat White">
      <organization>Bitwave</organization>
      <address>
        <email>pat.white@bitwave.io</email>
      </address>
    </author>
    <date year="2026" month="November" day="01"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>AI-native</keyword>
    <abstract>
      <?line 95?>

<t>AI Agents are increasingly accessing web resources on behalf of the users they serve. Traditionally these agents are granted normal OAuth access tokens through existing OAuth grant flows. However, these flows were designed in the era of traditional software, and when applied to AI Agents, multiple problems have arisen. This document outlines some of the problems, and then proposes a simple OAuth2.1 extension that enables AI Agents to obtain access tokens at time of resource access using Human-In-the-Loop or other approval flows. We call this the Agent Authorization Grant (aauth) grant flow. This document also compares the proposed solution with another, non-backwards compatible aauth solution.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://jdrosen.github.io/draft-rosenberg-oauth-aauth/draft-rosenberg-oauth-aauth.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-rosenberg-oauth-aauth/"/>.
      </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/jdrosen/draft-rosenberg-oauth-aauth"/>.</t>
    </note>
  </front>
  <middle>
    <?line 101?>

<section anchor="intro">
      <name>Introduction</name>
      <t>OAuth 2.0 <xref target="RFC6749"/>, and its consolidation as OAuth 2.1 <xref target="I-D.ietf-oauth-v2-1"/>, provides a framework for delegated access via bearer tokens. It has been wildly successful, with widespread deployment across the Internet. It was built to solve a key problem - how to allow software applications to access resources on a user's behalf, without requiring the user to give the application their username and password or other credentials.</t>
      <t>The key assumption behind OAuth is that software applications know in advance what kinds of access they require. They can therefore request scopes - which are an umbrella set of permissions - associated with that acess. Ther user, presented with that set of scopes, can approve (or reject), resulting in the delivery of an access token to the software application. Once delivered, then the software application can make use of it to access the resource.</t>
      <t>AI Agents - like traditional software applications - also need to invoke APIs on behalf of resource owners, and most implementations make use of OAuth grant flows to enable those AI agents to gain access tokens. However - key differences between AI Agents and traditional software applications have introduced several problems:</t>
      <ol spacing="normal" type="1"><li>
          <t>It is not known what APIs an AI Agent might need to access ahead of time. AI Agents make decisions adaptively, based on the needs of the user. This can be solved by granting wide token scopes that grant all access. However, this introduces a security problem.</t>
        </li>
        <li>
          <t>AI Agents can make mistakes. As a result, giving them broadly scoped tokens could potentially lead to disastrous results.</t>
        </li>
      </ol>
      <t>There is currently no easy way to solve these problems jointly.</t>
      <t>This document proposes a simple solution to the problem, in the form of a new OAuth grant flow - which we call the Agent Authorization Grant (aauth) Flow, and a new well-defined scope.</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>
    <section anchor="terminology">
      <name>Terminology</name>
      <dl>
        <dt>AI Agent:</dt>
        <dd>
          <t>A piece of software that acts as the OAuth client, and operates in an agentic nature, requiring usage of the grant flow defined in this specification. Like all other clients, it has a stable, long-lived identity (<tt>client_id</tt>).</t>
        </dd>
        <dt>Authorization Server (AS):</dt>
        <dd>
          <t>Validates Scope Challenges, issues <tt>request_code</tt> handles, obtains the resource owner's approval, and issues access tokens.</t>
        </dd>
        <dt>Resource Server (RS):</dt>
        <dd>
          <t>API server that protects resources via OAuth tokens. It issues Scope Challenges when a request exceeds the minimal AI Agent scope, and publishes its signing keys and scope descriptions through OAuth Protected Resource Metadata <xref target="RFC9728"/>.</t>
        </dd>
        <dt>Scope Challenge:</dt>
        <dd>
          <t>A JWT, signed by the RS, returned to the AI Agent when a request exceeds the minimal AI Agent scope. It carries the scopes required to perform the operation and the reason they are required. Defined in <xref target="scope-challenge"/>.</t>
        </dd>
        <dt>request_code:</dt>
        <dd>
          <t>Opaque handle returned by the AS to correlate an agent's request with subsequent token retrieval.</t>
        </dd>
        <dt>reason:</dt>
        <dd>
          <t>Human-readable explanation, generated by the RS and carried in the Scope Challenge, shown to the user during approval.</t>
        </dd>
        <dt>Scope Descriptions Document:</dt>
        <dd>
          <t>A JSON document published by the RS that provides human-readable, localizable descriptions of each scope it supports. Defined in <xref target="scope-descriptions"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="brief-overview-of-operation">
      <name>Brief Overview of Operation</name>
      <t>This section provides a brief overview of how AAuth works. It is composed of a new grant flow, a well-defined scope, and a signed object format.</t>
      <t>Firstly, an AI agent initially gets an access token through any of the existing OAuth grant flows. However - the access token is associated with a specific scope defined by this specification - "ai-agent-minimal". This scope serves two purposes - (1) it only allows the AI Agent to do a minimum set of operations which are not risky, (2) it informs the resource server that it can execute the AAuth grant flow defined here. This specification doesn't rely on any kind of new AI Agent identification.</t>
      <t>The AI Agent then tries to perform an operation against the resource server, for which its minimum scope is insufficient. The resource server rejects the request, and passes a signed object to the AI agent. This signed object contains the reason - in natural language - for the rejection, with enough detail for a human to decide if its allowed. The signed object also contains the list of required scopes.</t>
      <t>The AI Agent then connects to the AS to try and obtain a token, and it passes this signed object to the AS. The AS verifies the signature, and retrieves a natural language description of the scopes from the RS. It then responds to the AI Agent - informing it that it is seeking approval. It tells the AI agent to come back later for the token, assuming the user approves. From there, the AI Agent can poll the AS for the token, or get notified via WebSocket or SSE once it is available.</t>
      <t>The AS then seeks user approval. It can do that via out-of-band techniques like mobile push notifications, email or text. It uses the reason text - something like "The AI Agent wants to book a reservation for two at 9pm this Friday at Luigi's.", to provide the user the information they need to decide. In many cases the AS may not have an out-of-band way to connect to the user. In such a case, the AS can serve a web page which requests user approval. The AI Agent can launch a browser to this URL, allowing the user to approve (or reject). The AS can also use automated techniques -  such as an AI Agent that approves or rejects requests on the user's behalf - to determine approval.</t>
      <t>Once the approval has been gained, the AI Agent obtains and token (via the polling, SSE or WebSocket approaches) and then can access the resource.</t>
    </section>
    <section anchor="the-aauth-grant-flow">
      <name>The AAuth Grant Flow</name>
      <t>This flow is modeled on the OAuth 2.0 Device Authorization Grant <xref target="RFC8628"/> but is tailored for clients with long-lived identities, and optimized for performant delivery of tokens to the agent.</t>
      <t>The flow executes through a series of steps.</t>
      <section anchor="step1">
        <name>Step 1: Requesting the Minimal Scope AI Agent Token</name>
        <t>In the first step, the AI Agent requests an access token with very limited scope. This scope has a very specific meaning in the context of this specification. It refers to the set of access that is permitted by an AI Agent which is completely safe and should not require the resource owner - or software or AI agents operating on their behalf -  to explicitly approve. The precise set of API calls that fit under this umbrella are entirely a matter of local implementation in the resource server.</t>
        <t>We call this scope the "Minimal AI Agent scope". This specification standardizes a well-known value for this scope - "ai-agent-minimal". This is similar in concept to OIDC which defines a small set of well-defined scopes <xref target="OIDC"/>.</t>
        <t>AI Agents gain access tokens associated with this scope through any of the existing OAuth2.0 grant flows.</t>
        <t>For the authorization code grant flow, it is <bcp14>RECOMMENDED</bcp14> that Authorization Servers render information to the resource owner, informing them that this is an AI Agent, and they may be required to perform additional approvals to when the AI Agent does something that has some risk. It is <bcp14>RECOMMENDED</bcp14> that examples are provided on what type of access is considered risky. For example, a travel website may allow an AI Agent to list flights, or enumerate airports. However, listing of a user's travel plans or making flight changes, is considered risky.</t>
        <t>In all ways, the access token obtained with this scope is a normal access token and the AI Agent can use it in the same way it uses any other access token.</t>
      </section>
      <section anchor="step2">
        <name>Step 2: Access the Resource</name>
        <t>When the AI Agent accesses a resource on the resource server using the minimal AI Agent scope, if the minimal scope associated with the token is sufficient, the resource server will accept the request and all is well.</t>
        <t>However, if the AI Agent attempts to perform an action which the resource server determines is beyond the minimal AI Agent scope, it rejects the request with a 403 (Forbidden) response carrying an <tt>insufficient_scope</tt> error code in the <tt>WWW-Authenticate</tt> header, as defined in <xref section="3" sectionFormat="of" target="RFC6750"/>. Alongside the <tt>scope</tt> auth-param defined by <xref target="RFC6750"/>, the RS includes a new auth-param defined by this specification, <tt>scope_challenge</tt>. Its value is a Scope Challenge (<xref target="scope-challenge"/>): a JWT, signed by the RS, that carries both the set of scopes required to perform the operation and a <tt>reason</tt> - a natural language explanation of why the minimal AI Agent scope was insufficient for this particular operation. Because the challenge is signed, neither the AI Agent nor any other party between the RS and the AS can alter the scopes or the reason that will ultimately be shown to the user.</t>
        <figure>
          <name>Resource server response carrying a Scope Challenge (line breaks within header values added for readability)</name>
          <artwork><![CDATA[
HTTP/1.1 403 Forbidden
WWW-Authenticate: Bearer error="insufficient_scope",
  scope="urn:example:reservations.write",
  resource_metadata="https://api.example.com/.well-known/
    oauth-protected-resource",
  scope_challenge="eyJhbGciOiJFUzI1NiIsInR5cCI6InNjb3BlLWNoYWxsZW5
    nZStqd3QiLCJraWQiOiJyczEifQ.eyJpc3MiOiJodHRwczovL2FwaS5leGFtcG
    xlLmNvbSIsImF1ZCI6Imh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbSIsImlhdCI6
    MTc5MzQ2OTYwMCwiZXhwIjoxNzkzNDY5OTAwLCJqdGkiOiI5ZjFjMmUzYS00Yj
    VkLTRlNmYtOGE5Yi0wYzFkMmUzZjRhNWIiLCJjbGllbnRfaWQiOiJyZXNlcnZl
    Ym90Iiwic3ViIjoiMjQ4Mjg5NzYxMDAxIiwic2NvcGUiOiJ1cm46ZXhhbXBsZT
    pyZXNlcnZhdGlvbnMud3JpdGUiLCJyZWFzb24iOiJSZXNlcnZlQm90IHdhbnRz
    IHRvIGJvb2sgYSB0YWJsZSBmb3IgdHdvIGF0IEpvZSdzIEl0YWxpYW4gb24gRn
    JpZGF5IGF0IDlwbS4ifQ.DtsKx1Q...2Qw"
]]></artwork>
        </figure>
        <t>The RS <bcp14>MUST</bcp14> issue a Scope Challenge only in response to a request that presented a valid access token. A request with a missing, expired, revoked, or otherwise invalid token is rejected with the <tt>invalid_token</tt> error as usual, and no Scope Challenge is issued. The RS <bcp14>SHOULD</bcp14> also include the <tt>resource_metadata</tt> auth-param defined in <xref section="5.1" sectionFormat="of" target="RFC9728"/>, so that the AI Agent and the AS can locate the RS's metadata (<xref target="rs-metadata"/>).</t>
        <t>This exchange is similar in structure to the step-up authentication challenge of <xref target="RFC9470"/>, in which an RS tells a client that a token obtained with stronger authentication is required. Here, the RS tells the client that additional scopes - and the resource owner's approval - are required, and says why.</t>
        <section anchor="scope-challenge">
          <name>The Scope Challenge</name>
          <t>A Scope Challenge is a JSON Web Token <xref target="RFC7519"/> signed by the resource server as a JWS <xref target="RFC7515"/>, using a key published in the JWK Set <xref target="RFC7517"/> referenced by the <tt>jwks_uri</tt> member of its Protected Resource Metadata <xref target="RFC9728"/>.</t>
          <t>The JOSE header <bcp14>MUST</bcp14> include the following parameters:</t>
          <ul spacing="normal">
            <li>
              <t><tt>typ</tt>: <bcp14>MUST</bcp14> be <tt>scope-challenge+jwt</tt>, as recommended by <xref section="3.11" sectionFormat="of" target="RFC8725"/>.</t>
            </li>
            <li>
              <t><tt>alg</tt>: <bcp14>MUST</bcp14> be an asymmetric digital signature algorithm. The value <tt>none</tt> and MAC-based algorithms <bcp14>MUST NOT</bcp14> be used. The RS <bcp14>SHOULD</bcp14> list the algorithms it uses in the <tt>resource_signing_alg_values_supported</tt> member of its metadata.</t>
            </li>
            <li>
              <t><tt>kid</tt>: <bcp14>SHOULD</bcp14> be present, and identify the signing key within the RS's JWK Set.</t>
            </li>
          </ul>
          <t>The following claims are defined:</t>
          <dl>
            <dt><tt>iss</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The resource identifier of the RS, as defined in <xref target="RFC9728"/>. The AS uses this value to locate the RS's Protected Resource Metadata and, through it, the RS's signing keys.</t>
            </dd>
            <dt><tt>aud</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The issuer identifier <xref target="RFC8414"/> of the AS that is expected to process this challenge.</t>
            </dd>
            <dt><tt>iat</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The time at which the challenge was issued.</t>
            </dd>
            <dt><tt>exp</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The time after which the challenge <bcp14>MUST NOT</bcp14> be accepted. The lifetime <bcp14>SHOULD</bcp14> be short - five minutes is <bcp14>RECOMMENDED</bcp14> - since it bounds only the time the AI Agent has to present the challenge to the AS, not the time available for approval.</t>
            </dd>
            <dt><tt>jti</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A unique identifier for the challenge, used by the AS to detect replay.</t>
            </dd>
            <dt><tt>client_id</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The client identifier of the AI Agent whose request was refused, as determined from the access token the AI Agent presented (for example, from the <tt>client_id</tt> claim of a JWT access token <xref target="RFC9068"/>, or from a token introspection response <xref target="RFC7662"/>).</t>
            </dd>
            <dt><tt>sub</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14> when the access token presented to the RS was issued on behalf of a resource owner; otherwise absent. The subject identifier of that resource owner, as known to the AS. This tells the AS whose approval it must obtain.</t>
            </dd>
            <dt><tt>scope</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A space-delimited list of the scopes required to perform the operation, in the format of the <tt>scope</tt> parameter of <xref section="3.3" sectionFormat="of" target="RFC6749"/>.</t>
            </dd>
            <dt><tt>reason</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A human-readable explanation of why the operation requires these scopes, suitable for display to the resource owner. See <xref target="reason-guidance"/>.</t>
            </dd>
          </dl>
          <t>Additional claims <bcp14>MAY</bcp14> be present. The AS <bcp14>MUST</bcp14> ignore claims it does not understand.</t>
          <t>The claims of the challenge shown in the example above, decoded, are:</t>
          <artwork><![CDATA[
{
  "iss": "https://api.example.com",
  "aud": "https://auth.example.com",
  "iat": 1793469600,
  "exp": 1793469900,
  "jti": "9f1c2e3a-4b5d-4e6f-8a9b-0c1d2e3f4a5b",
  "client_id": "reservebot",
  "sub": "248289761001",
  "scope": "urn:example:reservations.write",
  "reason": "ReserveBot wants to book a table for two at Joe's
             Italian on Friday at 9pm."
}
]]></artwork>
          <section anchor="reason-guidance">
            <name>Content of the Reason</name>
            <t>The quality of the AAuth flow depends on the reason being a concise, simple-to-understand explanation of the specific action the AI Agent is attempting, in a form that lets the resource owner decide whether to approve it. It is generated by the RS at the time of the refused request, and so can describe that request precisely ("book a table for two at Joe's Italian on Friday at 9pm") rather than describing the scope in general ("make reservations").</t>
            <t>The reason <bcp14>MUST</bcp14> be plain text. It <bcp14>MUST NOT</bcp14> contain markup, and the AS <bcp14>MUST NOT</bcp14> interpret it as anything other than plain text when rendering it. It <bcp14>SHOULD</bcp14> be short enough to display in constrained contexts such as mobile push notifications; the AS <bcp14>MAY</bcp14> truncate reasons that exceed its display limits. The reason <bcp14>MUST NOT</bcp14> contain credentials, tokens, or other secrets, and <bcp14>SHOULD NOT</bcp14> contain personal data beyond what is needed to describe the action. The RS <bcp14>SHOULD</bcp14> write the reason in the resource owner's preferred language when that is known to it.</t>
          </section>
        </section>
      </section>
      <section anchor="step3">
        <name>Step 3: Initiate AAuth Grant Flow with AS</name>
        <t>Next, the AI Agent initiates the flow defined in this specification to obtain a higher scoped, short-lived access token with the set of required scopes. To do that, it sends an HTTP POST to a new endpoint of the AS defined in this specification - the agent authorization endpoint - and includes the Scope Challenge it received from the resource server. The AS learns the required scopes and the reason from the Scope Challenge; the AI Agent does not supply them separately, and cannot modify them. The location of the agent authorization endpoint is published in the AS's metadata (<xref target="as-metadata"/>).</t>
        <t>An example of such a request is:</t>
        <figure>
          <name>Agent authorization request (line breaks added for readability)</name>
          <artwork><![CDATA[
POST /agent_authorization HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64(client_id:client_secret)>

grant_type=urn:ietf:params:oauth:grant-type:agent_authorization
&scope_challenge=eyJhbGciOiJFUzI1NiIsInR5cCI6InNjb3BlLWNoYWxsZW5
nZStqd3QiLCJraWQiOiJyczEifQ.eyJpc3MiOiJodHRwczovL2FwaS5leGFtcGxl
LmNvbSIsImF1ZCI6Imh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbSIs...fQ.DtsKx1Q
...2Qw
&timeout=300
]]></artwork>
        </figure>
        <t>The following parameters are included in the body:</t>
        <dl>
          <dt><tt>grant_type</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. <bcp14>MUST</bcp14> be <tt>urn:ietf:params:oauth:grant-type:agent_authorization</tt>.</t>
          </dd>
          <dt><tt>scope_challenge</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. The Scope Challenge, exactly as received from the RS.</t>
          </dd>
          <dt><tt>timeout</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. The maximum time, in seconds, that the AI Agent is willing to wait for approval. See <xref target="timeout"/>.</t>
          </dd>
        </dl>
        <t>The AI Agent <bcp14>MUST</bcp14> authenticate to the agent authorization endpoint using the client authentication method registered for it, as described in <xref section="2.3" sectionFormat="of" target="RFC6749"/>. This grant is defined for confidential clients only; an AS <bcp14>MUST</bcp14> reject a request from a public client with an <tt>unauthorized_client</tt> error.</t>
        <section anchor="timeout">
          <name>Agent-Supplied Timeout</name>
          <t>An AI Agent often knows how long it can usefully wait for approval - for example, because it is itself operating under a deadline set by its user. The AI Agent <bcp14>MAY</bcp14> communicate this by including a <tt>timeout</tt> parameter in the agent authorization request.</t>
          <t>When <tt>timeout</tt> is present, the AS <bcp14>MUST NOT</bcp14> return an <tt>expires_in</tt> value (<xref target="step4-response"/>) greater than the agent's <tt>timeout</tt>. The AS <bcp14>MAY</bcp14> return a smaller value in accordance with its own policy; the effective lifetime of the request is therefore the lower of the two. When <tt>timeout</tt> is absent, the AS determines the lifetime alone.</t>
          <t>If the agent's <tt>timeout</tt> is shorter than the AS is able to support - for example, shorter than its approval channel can reasonably deliver a decision - the AS <bcp14>MAY</bcp14> reject the request with an <tt>invalid_request</tt> error rather than initiate an approval that the resource owner cannot complete in time. In that case the AS <bcp14>SHOULD</bcp14> state the minimum it supports in the <tt>error_description</tt>.</t>
          <t>Whichever party's limit applies, once it has elapsed the request is expired: the AS <bcp14>MUST NOT</bcp14> deliver a token for it on any channel, and <bcp14>SHOULD</bcp14> withdraw any outstanding approval prompt so that the resource owner is not asked to approve an action the AI Agent has already abandoned.</t>
        </section>
      </section>
      <section anchor="step4">
        <name>Step 4: AS Processes Grant Request</name>
        <t>The AS validates the client credentials as per normal OAuth processing.</t>
        <section anchor="validate-challenge">
          <name>Validating the Scope Challenge</name>
          <t>The AS then validates the Scope Challenge. If any of the following checks fails, the AS <bcp14>MUST</bcp14> reject the request with an <tt>invalid_scope_challenge</tt> error (<xref target="errors"/>), except where another error code is stated.</t>
          <ol spacing="normal" type="1"><li>
              <t>The value <bcp14>MUST</bcp14> parse as a JWS-signed JWT with a <tt>typ</tt> header parameter of <tt>scope-challenge+jwt</tt>.</t>
            </li>
            <li>
              <t>The <tt>iss</tt> claim <bcp14>MUST</bcp14> identify a resource server that the AS is configured to issue tokens for. The AS <bcp14>MUST NOT</bcp14> process challenges from resource servers it does not recognize; see <xref target="sec-challenge"/>.</t>
            </li>
            <li>
              <t>The AS obtains the RS's Protected Resource Metadata from the well-known location derived from <tt>iss</tt>, as described in <xref section="3" sectionFormat="of" target="RFC9728"/>, and the RS's JWK Set from the <tt>jwks_uri</tt> member of that metadata. The AS <bcp14>SHOULD</bcp14> cache both documents in accordance with the HTTP caching directives they are served with, and <bcp14>MAY</bcp14> re-fetch the JWK Set when it encounters an unrecognized <tt>kid</tt>, subject to rate limiting (<xref target="sec-dos"/>).</t>
            </li>
            <li>
              <t>The signature <bcp14>MUST</bcp14> verify using a key from that JWK Set, with an algorithm acceptable to the AS and, if the RS publishes <tt>resource_signing_alg_values_supported</tt>, listed there.</t>
            </li>
            <li>
              <t>The <tt>aud</tt> claim <bcp14>MUST</bcp14> match the AS's issuer identifier.</t>
            </li>
            <li>
              <t>The current time <bcp14>MUST</bcp14> be before <tt>exp</tt>. The AS <bcp14>MAY</bcp14> also reject challenges whose <tt>iat</tt> is unreasonably far in the past.</t>
            </li>
            <li>
              <t>The <tt>client_id</tt> claim <bcp14>MUST</bcp14> match the identifier of the authenticated client.</t>
            </li>
            <li>
              <t>The <tt>jti</tt> claim <bcp14>MUST NOT</bcp14> have been accepted previously. The AS <bcp14>MUST</bcp14> retain the <tt>jti</tt> values it has accepted at least until the corresponding <tt>exp</tt> times have passed, and <bcp14>MUST</bcp14> reject any challenge whose <tt>jti</tt> it has already accepted. This prevents an AI Agent from using a single challenge to initiate multiple approval requests.</t>
            </li>
            <li>
              <t>The AS <bcp14>MUST</bcp14> be willing, under its own policy, to issue each of the scopes in <tt>scope</tt> to this client for this resource server. If it is not, it <bcp14>MUST</bcp14> reject the request with an <tt>invalid_scope</tt> error.</t>
            </li>
          </ol>
        </section>
        <section anchor="obtaining-scope-descriptions">
          <name>Obtaining Scope Descriptions</name>
          <t>In order for the approver - whether it is a human or an AI agent operating on their behalf - to approve the request for higher scopes, natural language descriptions of those scopes are needed. The AS obtains them from the RS's Scope Descriptions Document (<xref target="scope-descriptions"/>), located through the <tt>scope_descriptions_uri</tt> member of the RS's Protected Resource Metadata (<xref target="rs-metadata"/>), or from its own configuration. The AS <bcp14>SHOULD</bcp14> cache the Scope Descriptions Document in accordance with the HTTP caching directives it is served with.</t>
          <t>The AS <bcp14>MUST NOT</bcp14> ask the resource owner to approve a scope for which it has no human-readable description. If a description is unavailable for any scope in the challenge, the AS <bcp14>MUST</bcp14> reject the request with an <tt>invalid_scope</tt> error.</t>
        </section>
        <section anchor="step4-response">
          <name>Agent Authorization Response</name>
          <t>Having validated the challenge and obtained a description of each scope, the AS creates a pending authorization request, initiates the approval process (<xref target="approval"/>), and returns an HTTP 200 (OK) response to the AI Agent with a JSON body of the following form:</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "request_code": "GhiJkl-QRstuVwxyz",
  "token_endpoint": "https://auth.example.com/token",
  "user_approval_endpoint" : "https://auth.example.com/approve",
  "poll_interval": 5,
  "expires_in": 300,
  "poll_sse_endpoint":
    "https://auth.example.com/agent_authorization/sse",
  "poll_ws_endpoint":
    "wss://auth.example.com/agent_authorization/ws"
}
]]></artwork>
          <t>This response is not providing the AI Agent with a token - it is informing the AI Agent that permission is required from the resource owner to proceed. The AI Agent will need to come back and obtain the token later, once permission has been given. Since the AI Agent doesn't know how long it will take for such permission to be granted, the AS provides the AI Agent with a few options.</t>
          <dl>
            <dt><tt>request_code</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. An opaque handle that the AI Agent presents when retrieving the token. The AS <bcp14>MUST</bcp14> bind the request_code to the authenticated client, to the subject, scopes, and reason of the Scope Challenge, and to the outcome of the approval. The request_code <bcp14>MUST</bcp14> contain enough entropy that it cannot be guessed; at least 128 bits is <bcp14>RECOMMENDED</bcp14>. It is single-use: once a token has been delivered for it on any retrieval channel, it is consumed.</t>
            </dd>
            <dt><tt>token_endpoint</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The URL of the AS's token endpoint, which the AI Agent can poll to retrieve the token (<xref target="polling"/>).</t>
            </dd>
            <dt><tt>expires_in</tt>:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The lifetime of the request_code in seconds. This is the maximum duration the AS is willing to wait for approval, and the upper bound on the time for which the AI Agent may poll. When the AI Agent supplied a <tt>timeout</tt>, this value <bcp14>MUST NOT</bcp14> exceed it (<xref target="timeout"/>).</t>
            </dd>
            <dt><tt>poll_interval</tt>:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>. The minimum interval, in seconds, that the AI Agent <bcp14>MUST</bcp14> wait between polling requests. If absent, the default is 5 seconds. The AS can adjust the interval later using the <tt>Retry-After</tt> header (<xref target="errors"/>).</t>
            </dd>
            <dt><tt>poll_sse_endpoint</tt>:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>. An <tt>https</tt> URL at which the AI Agent can subscribe to a Server-Sent Events stream that delivers the outcome (<xref target="sse"/>).</t>
            </dd>
            <dt><tt>poll_ws_endpoint</tt>:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>. A <tt>wss</tt> URL at which the AI Agent can open a WebSocket connection that delivers the outcome (<xref target="ws"/>).</t>
            </dd>
            <dt><tt>user_approval_endpoint</tt>:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>. The URL of a page, rendered by the AS, through which the resource owner can approve or reject the request. See <xref target="web-approval"/> and <xref target="sec-approval-channel"/>.</t>
            </dd>
          </dl>
          <t>The AS <bcp14>MAY</bcp14> support SSE or WebSocket to allow for push-based notification once the resource owner has granted permission; it advertises these by including the corresponding endpoints in the response.</t>
          <t>When the AI Agent accesses any of these endpoints, it <bcp14>MUST</bcp14> pass the request_code back to the AS, and <bcp14>MUST</bcp14> authenticate as the client that made the agent authorization request. The AS <bcp14>MUST</bcp14> reject any attempt to use a request_code by a client other than the one it was issued to with an <tt>invalid_grant</tt> error. The request_code allows the AS to echo state back to itself, for scaling and security reasons.</t>
        </section>
      </section>
      <section anchor="approval">
        <name>User Approval</name>
        <t>The AS <bcp14>MUST</bcp14> obtain user approval in order to grant the token. It may do so using the simple approval technique defined here, or employ any number of mechanisms outside the scope of this specification to do so.</t>
        <t>In this architecture, the AS plays the role of advocate for the resource owner, making sure their security interests are met. As such, it relies on a trust relationship between the resource owner and the AS.</t>
        <t>Whatever technique is used, the information presented to the approver <bcp14>MUST</bcp14> be taken from the validated Scope Challenge and from the AS's own records: the registered name of the client (<xref target="RFC7591"/>), the identity of the resource server (for example, the <tt>resource_name</tt> from its metadata), the <tt>reason</tt>, and the human-readable description of each requested scope. The AS <bcp14>MUST NOT</bcp14> present text supplied directly by the AI Agent. See <xref target="sec-approval-channel"/> for the properties the approval channel needs to have.</t>
        <section anchor="non-standardized-approval-techniques">
          <name>Non-Standardized Approval Techniques</name>
          <t>Examples of how the AS can gain approval include sending the user an SMS or email, sending a push notification to the user's mobile device, or making a policy decision through programmatic or agentic means.</t>
          <t>As an example, consider an AI Agent that wishes to book a dinner reservation on behalf of a user, using OpenTable APIs. In this case, OpenTable is the resource server, and its AS is the one executing the AAuth grant flow. If the user has the OpenTable app on their mobile phone, they could get a push notification like, "AI Agent ReserveBot wants to book dinner at Joe's Italian at 9pm on Friday. Do you approve?". The text in this case, comes from the "reason" parameter generated on the RS. This allows the AS to perform this push notification without knowing intimate details on the behavior of the APIs on the RS.</t>
          <t>As another example, the AS can avoid a HITL entirely by running an AI agent whose sole goal is to determine whether or not the approve the access.</t>
        </section>
        <section anchor="web-approval">
          <name>Web Approval Technique</name>
          <t>This specification defines a simple web based approval technique, and is <bcp14>OPTIONAL</bcp14> to implement on an AS. If the AS supports it, it includes the user_approval_endpoint field in the response to the agent_authorization request.</t>
          <t>The user_approval_endpoint URI points to a page, renderable in a browser, that presents the user with the reason for the approval, and then lists and describes the scopes that are being requested. This page is rendered by the AS.</t>
          <t>The AS <bcp14>SHOULD</bcp14> authenticate the end user, and once authenticated, present the information in a way that makes it clear that an AI Agent is asking for these permissions, and why.</t>
          <t>Once the AS has collected the users approval (or rejection), it can now pass (or not pass) the token to the AI Agent using the next steps in the flow. The approval (or rejection) are bound to the request_code, so that the AI Agent can retrieve it.</t>
          <t>Note that the AI agent itself is not involved in the rendering of this approval page. The AI Agent receives the URI, and then it <bcp14>MUST</bcp14> launch a browser and open that page, and let the human user perform the approval. The AI Agent silently awaits approval, using one of the token retrieval techniques defined here.</t>
        </section>
      </section>
      <section anchor="retrieval">
        <name>Token Retrieval</name>
        <t>After the agent authorization request has been accepted, the AI Agent obtains its access token via one of three techniques: HTTP polling of the token endpoint, a Server-Sent Events stream, or a WebSocket connection. The following rules apply to all three:</t>
        <ul spacing="normal">
          <li>
            <t>The AI Agent <bcp14>MUST</bcp14> authenticate as the client that made the agent authorization request, using its registered client authentication method. For the SSE and WebSocket endpoints, which are accessed with GET, a client that authenticates with a client secret <bcp14>MUST</bcp14> use the HTTP Basic scheme and <bcp14>MUST NOT</bcp14> place the secret in the query component; a client that authenticates with a <tt>client_assertion</tt> sends it as a query parameter.</t>
          </li>
          <li>
            <t>The AI Agent <bcp14>MUST</bcp14> present the request_code.</t>
          </li>
          <li>
            <t>The AS <bcp14>MUST</bcp14> deliver the token for a given request_code at most once, across all channels. The AI Agent <bcp14>MAY</bcp14> use more than one technique for the same request_code (for example, an SSE stream with polling as a fallback), but the token will be delivered on exactly one of them; the others will report that the request_code has been consumed.</t>
          </li>
          <li>
            <t>Every response that carries a token or request state <bcp14>MUST</bcp14> include <tt>Cache-Control: no-store</tt>.</t>
          </li>
          <li>
            <t>All endpoints <bcp14>MUST</bcp14> be served over TLS.</t>
          </li>
        </ul>
        <t>On success, the token response is a standard OAuth 2.0 token response as defined in <xref section="5.1" sectionFormat="of" target="RFC6749"/>. The issued token <bcp14>SHOULD</bcp14> be short-lived, and its scope <bcp14>MUST NOT</bcp14> exceed the scope of the Scope Challenge.</t>
        <section anchor="polling">
          <name>HTTP Polling</name>
          <t>The AI Agent can retrieve the token by posting to the token endpoint:</t>
          <artwork><![CDATA[
POST /token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64(client_id:client_secret)>

grant_type=urn:ietf:params:oauth:grant-type:agent_authorization
&request_code=GhiJkl-QRstuVwxyz
]]></artwork>
          <t>Note that the endpoint requires the AI Agent to authenticate itself using its client ID and secret. Note further that the body contains the request_code parameter, which acts as the primary key bound to the approval and the resulting token.</t>
          <t>The AS communicates the state of the request through the HTTP status code, so that the AI Agent can determine the outcome without parsing the response body:</t>
          <table>
            <name>Token endpoint status codes for the agent authorization grant</name>
            <thead>
              <tr>
                <th align="left">Status</th>
                <th align="left">State</th>
                <th align="left">Body</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">200 (OK)</td>
                <td align="left">Approved; token issued</td>
                <td align="left">Token response (<xref section="5.1" sectionFormat="of" target="RFC6749"/>)</td>
              </tr>
              <tr>
                <td align="left">202 (Accepted)</td>
                <td align="left">Approval pending</td>
                <td align="left">
                  <tt>{"status":"authorization_pending"}</tt>. <tt>Retry-After</tt> <bcp14>SHOULD</bcp14> be present.</td>
              </tr>
              <tr>
                <td align="left">403 (Forbidden)</td>
                <td align="left">Resource owner or policy denied the request</td>
                <td align="left">
                  <tt>{"error":"access_denied"}</tt></td>
              </tr>
              <tr>
                <td align="left">410 (Gone)</td>
                <td align="left">request_code expired, or already consumed</td>
                <td align="left">
                  <tt>{"error":"expired_token"}</tt> or <tt>{"error":"invalid_grant"}</tt></td>
              </tr>
              <tr>
                <td align="left">429 (Too Many Requests)</td>
                <td align="left">AI Agent is polling too quickly</td>
                <td align="left">
                  <tt>{"error":"slow_down"}</tt>. <tt>Retry-After</tt> <bcp14>MUST</bcp14> be present.</td>
              </tr>
            </tbody>
          </table>
          <t>Requests that are malformed, that present an unknown request_code or one issued to another client, or that fail client authentication, receive the status codes and error responses defined in <xref section="5.2" sectionFormat="of" target="RFC6749"/> (400, or 401 for <tt>invalid_client</tt>). Server-side failures receive 5xx status codes. <xref target="errors"/> gives the complete mapping.</t>
          <t>This departs from <xref target="RFC8628"/>, which returns 400 for the <tt>authorization_pending</tt> and <tt>slow_down</tt> conditions. <xref section="5.2" sectionFormat="of" target="RFC6749"/> permits extensions to specify status codes other than 400 for their errors.</t>
          <t>Examples:</t>
          <artwork><![CDATA[
HTTP/1.1 202 Accepted
Content-Type: application/json
Cache-Control: no-store
Retry-After: 5

{"status":"authorization_pending"}
]]></artwork>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "access_token": "2YotnFZFEjr1zCsicMWpAA",
  "token_type": "Bearer",
  "expires_in": 900,
  "scope": "urn:example:reservations.write"
}
]]></artwork>
          <t>Once a request has been denied, has expired, or has been consumed, the AS <bcp14>MUST</bcp14> continue to return the corresponding status for subsequent requests presenting that request_code, for at least the request_code's original lifetime.</t>
        </section>
        <section anchor="sse">
          <name>Server-Sent Events (SSE)</name>
          <t>If the agent authorization response included a <tt>poll_sse_endpoint</tt>, the AI Agent can subscribe to a Server-Sent Events stream <xref target="HTML"/> on which the AS delivers the outcome as soon as it is known.</t>
          <section anchor="establishing-the-stream">
            <name>Establishing the Stream</name>
            <artwork><![CDATA[
GET /agent_authorization/sse?request_code=GhiJkl-QRstuVwxyz HTTP/1.1
Host: auth.example.com
Accept: text/event-stream
Authorization: Basic <base64(client_id:client_secret)>
]]></artwork>
            <t>The AI Agent sends a GET request to the <tt>poll_sse_endpoint</tt> with the request_code as a query parameter, an <tt>Accept</tt> header of <tt>text/event-stream</tt>, and client authentication.</t>
            <t>The AS evaluates the current state of the request at the time of the GET, exactly as it would for a polling request:</t>
            <ul spacing="normal">
              <li>
                <t>If client authentication fails, the request is malformed, the request_code is unknown or was issued to another client, the client is being rate-limited, or the request has already been denied, has expired, or has been consumed, the AS responds with the same status code and JSON body it would return to a polling request (<xref target="polling"/>, <xref target="errors"/>), and does not open a stream.</t>
              </li>
              <li>
                <t>Otherwise, the AS responds with a 200 (OK) status, a <tt>Content-Type</tt> of <tt>text/event-stream</tt>, and <tt>Cache-Control: no-store</tt>, and begins the event stream. If the request has already been approved, the AS delivers the <tt>token_response</tt> event immediately.</t>
              </li>
            </ul>
          </section>
          <section anchor="event-format">
            <name>Event Format</name>
            <t>Events are formatted as described in <xref target="HTML"/>. Each event carries an <tt>event</tt> field naming the event type and a <tt>data</tt> field containing a single JSON object <xref target="RFC8259"/>. The object <bcp14>MAY</bcp14> be split across several <tt>data</tt> lines, as <xref target="HTML"/> permits, since the newlines introduced when the lines are joined are insignificant whitespace in JSON. The AS <bcp14>MAY</bcp14> include <tt>id</tt> and <tt>retry</tt> fields. Events are not replayed on reconnection, so the <tt>Last-Event-ID</tt> request header has no effect. The AI Agent <bcp14>MUST</bcp14> ignore event types and JSON members it does not recognize.</t>
            <t>This specification defines the following event types:</t>
            <dl>
              <dt><tt>authorization_pending</tt>:</dt>
              <dd>
                <t>Sent once, immediately after the stream is opened, to confirm that the subscription is active. The <tt>data</tt> object contains the <tt>request_code</tt> and <tt>expires_in</tt>, the number of seconds remaining before the request expires. Not terminal.</t>
              </dd>
              <dt><tt>token_response</tt>:</dt>
              <dd>
                <t>Sent when the request has been approved. The <tt>data</tt> object is a token response as defined in <xref section="5.1" sectionFormat="of" target="RFC6749"/>. Terminal.</t>
              </dd>
              <dt><tt>error</tt>:</dt>
              <dd>
                <t>Sent when the request has reached a terminal state other than approval. The <tt>data</tt> object is an error response as defined in <xref section="5.2" sectionFormat="of" target="RFC6749"/>, with <tt>error</tt> set to <tt>access_denied</tt> (the resource owner or policy denied the request), <tt>expired_token</tt> (the request expired while the stream was open), <tt>invalid_grant</tt> (the token was delivered on another channel), or <tt>server_error</tt>. Terminal.</t>
              </dd>
            </dl>
          </section>
          <section anchor="stream-lifecycle">
            <name>Stream Lifecycle</name>
            <t>While the stream is open, the AS <bcp14>SHOULD</bcp14> send a comment line (a line beginning with a colon) at least every 30 seconds, so that the connection is not closed as idle by intermediaries. AI Agents ignore comment lines, as <xref target="HTML"/> requires.</t>
            <t>After sending a terminal event, the AS <bcp14>MUST</bcp14> close the connection. The AI Agent <bcp14>MUST</bcp14> treat the request as complete and <bcp14>MUST NOT</bcp14> reconnect for that request_code.</t>
            <t>If the connection is closed without a terminal event having been received - because of a network failure, an AS restart, or an intermediary timeout - the AI Agent <bcp14>MAY</bcp14> reconnect, after waiting the interval given by the most recent <tt>retry</tt> field or, if none was given, <tt>poll_interval</tt>. The AS handles the new request exactly as described above, according to the current state of the request. The AS <bcp14>MUST NOT</bcp14> send a <tt>token_response</tt> event for a request_code on which it has already sent one; an AI Agent that reconnects after the token was delivered receives a 410 (Gone) response, and if it did not receive the token, must restart the flow from <xref target="step2"/>. See <xref target="sec-push"/>.</t>
            <t>When <tt>expires_in</tt> elapses while the stream is open, the AS <bcp14>MUST</bcp14> send an <tt>error</tt> event with <tt>expired_token</tt> and close the connection. The AS <bcp14>MAY</bcp14> close a stream earlier without a terminal event, for example to rebalance load; the AI Agent then reconnects as described above.</t>
          </section>
          <section anchor="example">
            <name>Example</name>
            <figure>
              <name>SSE stream ending in token delivery; the AS closes the connection after the final event</name>
              <artwork><![CDATA[
event: authorization_pending
data: {"request_code":"GhiJkl-QRstuVwxyz","expires_in":287}

: keepalive

: keepalive

event: token_response
data: {"access_token":"2YotnFZFEjr1zCsicMWpAA",
data:  "token_type":"Bearer","expires_in":900,
data:  "scope":"urn:example:reservations.write"}

]]></artwork>
            </figure>
            <figure>
              <name>SSE stream ending in denial</name>
              <artwork><![CDATA[
event: authorization_pending
data: {"request_code":"GhiJkl-QRstuVwxyz","expires_in":287}

: keepalive

event: error
data: {"error":"access_denied",
data:  "error_description":"The user denied the request."}

]]></artwork>
            </figure>
          </section>
        </section>
        <section anchor="ws">
          <name>WebSocket</name>
          <t>If the agent authorization response included a <tt>poll_ws_endpoint</tt>, the AI Agent can open a WebSocket connection <xref target="RFC6455"/> on which the AS delivers the outcome as soon as it is known.</t>
          <section anchor="establishing-the-connection">
            <name>Establishing the Connection</name>
            <artwork><![CDATA[
GET /agent_authorization/ws?request_code=GhiJkl-QRstuVwxyz HTTP/1.1
Host: auth.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Protocol: aauth.agent-flow
Authorization: Basic <base64(client_id:client_secret)>
]]></artwork>
            <t>The <tt>poll_ws_endpoint</tt> <bcp14>MUST</bcp14> use the <tt>wss</tt> scheme. The AI Agent sends the opening handshake with the request_code as a query parameter, client authentication, and a <tt>Sec-WebSocket-Protocol</tt> header requesting the <tt>aauth.agent-flow</tt> subprotocol.</t>
            <t>The AS evaluates the current state of the request at handshake time, exactly as for SSE: in the conditions listed in <xref target="sse"/> under which no stream is opened, the AS responds with the corresponding HTTP status code and JSON body instead of completing the handshake. Otherwise it completes the handshake with a 101 (Switching Protocols) response that includes <tt>Sec-WebSocket-Protocol: aauth.agent-flow</tt>. If the AS does not select this subprotocol, the AI Agent <bcp14>MUST</bcp14> close the connection.</t>
          </section>
          <section anchor="message-format">
            <name>Message Format</name>
            <t>Every message is a text frame (opcode 0x1) whose payload is exactly one JSON object <xref target="RFC8259"/>. The AS <bcp14>MUST NOT</bcp14> send binary frames. Each object has a <tt>type</tt> member identifying the message. The AI Agent <bcp14>MUST</bcp14> ignore messages whose <tt>type</tt> it does not recognize, and members it does not recognize.</t>
            <t>This specification defines the following AS-to-agent message types, whose semantics are those of the SSE events of the same name:</t>
            <dl>
              <dt><tt>authorization_pending</tt>:</dt>
              <dd>
                <t>Sent once, immediately after the handshake completes. Contains <tt>request_code</tt> and <tt>expires_in</tt>. Not terminal.</t>
              </dd>
              <dt><tt>token_response</tt>:</dt>
              <dd>
                <t>Sent when the request has been approved. The remaining members of the object are those of a token response (<xref section="5.1" sectionFormat="of" target="RFC6749"/>). Terminal.</t>
              </dd>
              <dt><tt>error</tt>:</dt>
              <dd>
                <t>Sent when the request has reached a terminal state other than approval. The remaining members are those of an error response (<xref section="5.2" sectionFormat="of" target="RFC6749"/>), with the same <tt>error</tt> values as the SSE <tt>error</tt> event. Terminal.</t>
              </dd>
            </dl>
            <t>This specification defines no agent-to-AS data messages. An AS <bcp14>MUST</bcp14> ignore data messages it does not recognize.</t>
          </section>
          <section anchor="connection-lifecycle">
            <name>Connection Lifecycle</name>
            <t>While the connection is open, the AS <bcp14>SHOULD</bcp14> send a Ping control frame at least every 30 seconds, and the AI Agent <bcp14>MUST</bcp14> respond with a Pong frame as required by <xref section="5.5.3" sectionFormat="of" target="RFC6455"/>. Either party <bcp14>MAY</bcp14> close a connection on which the peer does not respond to Pings.</t>
            <t>After sending a terminal message, the AS <bcp14>MUST</bcp14> close the connection with status code 1000 (Normal Closure). The AI Agent <bcp14>MUST</bcp14> treat the request as complete and <bcp14>MUST NOT</bcp14> reconnect for that request_code.</t>
            <t>When <tt>expires_in</tt> elapses while the connection is open, the AS <bcp14>MUST</bcp14> send an <tt>error</tt> message with <tt>expired_token</tt> and then close with status code 1000. An AS that must shut down a connection before a terminal message has been sent <bcp14>SHOULD</bcp14> close with status code 1001 (Going Away); the AI Agent <bcp14>MAY</bcp14> then reconnect after waiting <tt>poll_interval</tt>, and the AS handles the new handshake according to the current state of the request. As with SSE, the AS <bcp14>MUST NOT</bcp14> send a <tt>token_response</tt> for a request_code on which it has already sent one; an AI Agent that lost the connection before receiving the token must restart the flow from <xref target="step2"/>.</t>
            <t>An AS <bcp14>MAY</bcp14> close a connection with status code 1003 (Unsupported Data) if it receives a binary frame, or 1008 (Policy Violation) if the AI Agent otherwise violates this specification.</t>
          </section>
          <section anchor="example-1">
            <name>Example</name>
            <t>On open:</t>
            <artwork><![CDATA[
{"type":"authorization_pending",
 "request_code":"GhiJkl-QRstuVwxyz","expires_in":287}
]]></artwork>
            <t>On approval:</t>
            <artwork><![CDATA[
{"type":"token_response",
 "access_token":"2YotnFZFEjr1zCsicMWpAA",
 "token_type":"Bearer","expires_in":900,
 "scope":"urn:example:reservations.write"}
]]></artwork>
            <t>On denial:</t>
            <artwork><![CDATA[
{"type":"error","error":"access_denied",
 "error_description":"The user denied the request."}
]]></artwork>
            <t>On expiration:</t>
            <artwork><![CDATA[
{"type":"error","error":"expired_token",
 "error_description":"The request_code has expired."}
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="errors">
        <name>Error Handling and Back-Off</name>
        <section anchor="status-codes">
          <name>Status Codes</name>
          <t>The AS uses HTTP status codes <xref target="RFC9110"/> to report the outcome of requests to the agent authorization endpoint, to the token endpoint when the <tt>grant_type</tt> is the one defined here, and to the SSE and WebSocket endpoints when no stream is opened. The AI Agent can act on the status code alone; the JSON body, when present, carries the OAuth error code and an optional <tt>error_description</tt>.</t>
          <table>
            <name>HTTP status codes and OAuth error codes used by this specification</name>
            <thead>
              <tr>
                <th align="left">Status</th>
                <th align="left">OAuth error</th>
                <th align="left">Meaning</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">200 (OK)</td>
                <td align="left">-</td>
                <td align="left">Agent authorization request accepted; or token issued.</td>
              </tr>
              <tr>
                <td align="left">202 (Accepted)</td>
                <td align="left">- (<tt>status</tt> is <tt>authorization_pending</tt>)</td>
                <td align="left">Token endpoint: approval pending. Poll again after <tt>Retry-After</tt>.</td>
              </tr>
              <tr>
                <td align="left">400 (Bad Request)</td>
                <td align="left">
                  <tt>invalid_request</tt>, <tt>invalid_grant</tt>, <tt>invalid_scope</tt>, <tt>unauthorized_client</tt>, <tt>unsupported_grant_type</tt>, <tt>invalid_scope_challenge</tt></td>
                <td align="left">The request is malformed or unacceptable, including an unknown request_code or one issued to another client. Not retryable without change.</td>
              </tr>
              <tr>
                <td align="left">401 (Unauthorized)</td>
                <td align="left">
                  <tt>invalid_client</tt></td>
                <td align="left">Client authentication failed. The response <bcp14>MUST</bcp14> include a <tt>WWW-Authenticate</tt> header, as required by <xref section="5.2" sectionFormat="of" target="RFC6749"/>.</td>
              </tr>
              <tr>
                <td align="left">403 (Forbidden)</td>
                <td align="left">
                  <tt>access_denied</tt></td>
                <td align="left">The resource owner, or policy, denied the request. Terminal.</td>
              </tr>
              <tr>
                <td align="left">410 (Gone)</td>
                <td align="left">
                  <tt>expired_token</tt>, <tt>invalid_grant</tt></td>
                <td align="left">The request_code has expired (<tt>expired_token</tt>), or a token has already been delivered for it (<tt>invalid_grant</tt>). Terminal.</td>
              </tr>
              <tr>
                <td align="left">429 (Too Many Requests) <xref target="RFC6585"/></td>
                <td align="left">
                  <tt>slow_down</tt></td>
                <td align="left">The client has exceeded a rate limit: polling too quickly, opening too many push connections, or creating too many agent authorization requests. <tt>Retry-After</tt> <bcp14>MUST</bcp14> be present. Retryable.</td>
              </tr>
              <tr>
                <td align="left">500 (Internal Server Error)</td>
                <td align="left">
                  <tt>server_error</tt></td>
                <td align="left">Unexpected server-side failure. Retryable.</td>
              </tr>
              <tr>
                <td align="left">503 (Service Unavailable)</td>
                <td align="left">
                  <tt>temporarily_unavailable</tt></td>
                <td align="left">The server is overloaded or under maintenance. <tt>Retry-After</tt> <bcp14>SHOULD</bcp14> be present. Retryable.</td>
              </tr>
            </tbody>
          </table>
          <t>The AS <bcp14>MUST</bcp14> use these status codes. In particular, it <bcp14>MUST</bcp14> return 429 rather than 400 when rate limiting, <bcp14>MUST</bcp14> return a 5xx status for server-side failures rather than reporting them as client errors, and <bcp14>MUST</bcp14> return 410 once a request_code has expired or been consumed. Error codes defined by <xref target="RFC6749"/> retain the status codes assigned there (400, or 401 for <tt>invalid_client</tt>); the states particular to asynchronous approval (202, 403, 410, and 429) are the additions of this specification.</t>
          <t><tt>invalid_scope_challenge</tt> is a new error code defined by this specification. It is returned by the agent authorization endpoint when the Scope Challenge fails any of the checks in <xref target="validate-challenge"/>.</t>
          <t>All error responses that have a body use the format of <xref section="5.2" sectionFormat="of" target="RFC6749"/> and <bcp14>MUST</bcp14> include <tt>Cache-Control: no-store</tt>.</t>
          <t>Once a stream has been opened, the SSE and WebSocket endpoints report terminal outcomes through <tt>error</tt> events and messages rather than HTTP status codes; the mapping is given in <xref target="sse"/> and <xref target="ws"/>.</t>
        </section>
        <section anchor="back-off">
          <name>Back-Off</name>
          <t>The following rules govern the AI Agent's behavior when polling and when connecting to push endpoints:</t>
          <ul spacing="normal">
            <li>
              <t>The AI Agent <bcp14>MUST NOT</bcp14> poll more frequently than <tt>poll_interval</tt>, and <bcp14>MUST NOT</bcp14> make a further request before any <tt>Retry-After</tt> interval it has received on a 202, 429, or 503 response has elapsed. <tt>Retry-After</tt> is the means by which the AS adjusts the polling interval after the initial response.</t>
            </li>
            <li>
              <t>On receiving a 429 or 503 response without a <tt>Retry-After</tt> header, the AI Agent <bcp14>MUST</bcp14> at least double the interval it last used before retrying, and <bcp14>SHOULD</bcp14> add random jitter.</t>
            </li>
            <li>
              <t>On receiving a 500 response, the AI Agent <bcp14>MAY</bcp14> retry, with exponential back-off and jitter.</t>
            </li>
            <li>
              <t>On receiving a 400, 401, 403, or 410 response, the AI Agent <bcp14>MUST</bcp14> stop polling for that request_code; these outcomes are not retryable.</t>
            </li>
            <li>
              <t>The AI Agent <bcp14>MUST</bcp14> stop polling and treat the request as expired once <tt>expires_in</tt> has elapsed since the agent authorization response, whether or not it has received a 410 response.</t>
            </li>
            <li>
              <t>An AI Agent that receives a 429 response when attempting to open an SSE or WebSocket connection <bcp14>MUST</bcp14> wait at least the <tt>Retry-After</tt> interval before attempting again.</t>
            </li>
          </ul>
          <t>The AS <bcp14>SHOULD</bcp14> apply rate limits per client, and <bcp14>SHOULD</bcp14> limit the number of concurrent push connections, and of outstanding agent authorization requests, per client and per resource owner (<xref target="sec-dos"/>).</t>
        </section>
      </section>
    </section>
    <section anchor="metadata">
      <name>Discovery Metadata</name>
      <section anchor="as-metadata">
        <name>Authorization Server Metadata</name>
        <t>This specification defines the following OAuth Authorization Server Metadata <xref target="RFC8414"/> member:</t>
        <dl>
          <dt><tt>agent_authorization_endpoint</tt>:</dt>
          <dd>
            <t>URL of the AS's agent authorization endpoint (<xref target="step3"/>). An AS that supports this specification <bcp14>SHOULD</bcp14> publish it.</t>
          </dd>
        </dl>
      </section>
      <section anchor="rs-metadata">
        <name>Protected Resource Metadata</name>
        <t>A resource server that supports this specification publishes OAuth Protected Resource Metadata <xref target="RFC9728"/> at the well-known location derived from its resource identifier. In that metadata, the RS:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> include <tt>jwks_uri</tt>, referencing a JWK Set that contains the public key(s) used to sign Scope Challenges. Keys used for this purpose <bcp14>SHOULD</bcp14> carry a <tt>use</tt> value of <tt>sig</tt>.</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> include <tt>resource_signing_alg_values_supported</tt>, listing the algorithms it uses to sign Scope Challenges.</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> include <tt>authorization_servers</tt>, listing the authorization servers for which it issues Scope Challenges. The AS <bcp14>SHOULD</bcp14> verify that it is listed.</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> include <tt>scope_descriptions_uri</tt>, defined below, unless the AS obtains scope descriptions by other means.</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> include <tt>resource_name</tt>, which the AS can display to the resource owner to identify the RS.</t>
          </li>
        </ul>
        <t>This specification defines one new Protected Resource Metadata member:</t>
        <dl>
          <dt><tt>scope_descriptions_uri</tt>:</dt>
          <dd>
            <t>URL of the RS's Scope Descriptions Document (<xref target="scope-descriptions"/>). This URL <bcp14>MUST</bcp14> use the <tt>https</tt> scheme.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="comparison-with-hardt-oauth-aauth-protocol">
      <name>Comparison with hardt-oauth-aauth-protocol</name>
      <t>This specification shares the name aauth with <xref target="I-D.hardt-oauth-aauth-protocol"/>, but differs significantly in its approach.</t>
      <t>Both documents are aimed at solving the same core issue - how to grant AI Agents access tokens, doing so securely and potentially involving human approvals. Both have the idea of a minimal baseline access, both deliver tokens to the AI Agent once some kind of approval has been performed, both have the idea of scope descriptions, both use short lived tokens.</t>
      <t>The biggest difference however - is on relationship to OAuth. This specification is an extension to OAuth, whereas the Hardt draft is a full-on replacement. The authors believe a faster path to deployment is by riding on the success and widespread deployment of OAuth.</t>
      <t>The protocols also differ in size and complexity. This document is a more narrow, defining a new grant flow, a well-known scope, and a signed challenge object. The Hardt draft brings its own agent identity, uses HTTP message signatures, defines new token types, new roles, and introduces the concepts of missions, delegation and federation. Since it depends on HTTP Message Signatures <xref target="RFC9421"/>, it requires that technology to be co-deployed throughout the impacted web infrastructure along with the new AAuth protocol.</t>
      <t>An important technical difference is on who writes the text that the human sees to perform approvals. In this spec, it is written by the RS, and it is written per operation. This allows for highly targeted, per API decision making - e.g., "approve my AI Agent to book a table for two at Joe's Italian on Friday at 9pm". Only the RS can author this level of specificity. In addition, because the text is written by the RS, and not the AS, it reduces the trust required of the AI Agent. Indeed, this specification provides cryptographic protections which ensure that the AI Agent cannot manipulate, generate, or alter this reason text in any way. The authors of this document believe that it is paramount that we do NOT rely on AI Agents for asserting their own reasons for operations when seeking to gain human approval for them.</t>
      <t>By contrast, in the Hardt protocol, the text is written by the agent, as a justification document. This requires a higher level of trust on the AI Agent, and is also not operation specific. The Hardt draft does allow for scope descriptions (similar to this document). However, these are not operation specific.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="trust-model">
        <name>Trust Model</name>
        <t>This specification is built on the core idea that the AI Agent is NOT TRUSTED, and the human user is seeking to gate its access. The human user does however trust the AS and RS, which is the normal situation with OAuth.</t>
      </section>
      <section anchor="on-agent-identity">
        <name>On Agent Identity</name>
        <t>There is much ongoing work and discussion on how to identify AI agents on the Internet. These include WIMSE ((I-D.ietf-wimse-arch)) <xref target="I-D.ietf-wimse-workload-creds"/> <xref target="I-D.ietf-wimse-wpt"/>, W3C Agent Identity <xref target="W3C-AgentId"/>, and arguably WebBotAuth <xref target="I-D.ietf-webbotauth-httpsig-protocol"/>.</t>
        <t>This specification does not depend on an authenticated identifier that is unique to AI Agents. It restricts what the AI Agent can do not by its identity, but rather, by the baseline minimum scope it obtains.</t>
        <t>The AI Agent will normally obtain this minimum scoped token by existing OAuth flows, most likely a combination of the authorization code grant flow or client credentials flow. In the former case, the AI Agent would be pre-configured to request this scope initially when a user configures it. This relies on human judgement for the author of the AI Agent (in requesting this scope) and on the resource owner (in approving it) to identify this software as one for which these reduced permissions are required. It doesn't matter whether the software is ACTUALLY an AI Agent, it only matters whether the level of trust in it is low enough to warrant this minimal scope.</t>
        <t>Similarly, for AI Agents configured through the client credentials grant flow, the human user that configures the clientID and secret are trusted to select this scope as the one it requests.</t>
        <t>Consequently, the security properties afforded by this specification are rooted in the human judgement of the users who author the software, configure it (in the case of client credential grants) or approve its access (in the case of authorization code grants), that the software is one for which this lower level of trust applies. In our view, this human judgement is a good thing, not a bad one.</t>
        <t>It does however introduce a potential weakness - a malicious AI Agent can still avoid this specification entirely and just request access tokens through existing OAuth grant flows which give it elevated privilege. That weakness is, unfortunately, the current situation of the world we live in - with AI Agents built before we had the right types of security techniques in place to authorize their access. Consequently, it is not a security flaw in this specification per se.</t>
      </section>
      <section anchor="sec-challenge">
        <name>Preventing Malicious AI Agents from Altering Reasons and Scopes</name>
        <t>The reason and the scopes are the information on which the resource owner bases their decision. If an AI Agent could alter either, it could obtain approval for one action while presenting another - for example, by pairing a benign reason with a broader set of scopes. This specification does not trust the AI Agent to pass these unaltered. As a result, it protects them with the signatures on the scope challenge.</t>
        <t>The signature uses keys shared between the AS and RS, and require no trust in the AI Agent. This ensures the AI Agent cannot manipulate keying material to adjust signatures.</t>
        <t>The signature covers the reason and the required scopes, not just one of them alone. This prevents an attack wherein a malicious AI Agent could modify the scopes to be larger, with a reason that seems to imply lesser scopes.</t>
      </section>
      <section anchor="preventing-malicious-ai-agents-from-tricking-the-as-or-rs">
        <name>Preventing Malicious AI Agents from Tricking the AS or RS</name>
        <t>A potential attack from a malicious AI Agent is one in which it colludes with a malicious AS in order to obtain tokens which can be used against an RS it wishes to access. Similarly, a malicous AI Agent might try to fool a legitimate AS into issuing tokens by creating its own scope challenges, and getting the AS to sign them.</t>
        <t>This is preventing by requiring that the AS only accept Scope Challenges from resource servers it is configured to serve. Similarly, the <tt>client_id</tt> claim binds the challenge to the AI Agent that encountered the refusal, so that a challenge obtained by one client cannot be redeemed by another. The <tt>sub</tt> claim binds it to the resource owner whose token was presented, so that an AI Agent cannot cause a different resource owner to be prompted. The <tt>jti</tt> claim and the short <tt>exp</tt> prevent a single challenge from being used to generate repeated approval prompts.</t>
      </section>
      <section anchor="sec-request-code">
        <name>Preventing Token Theft via request_code Reuse</name>
        <t>A malicious agent might try to reuse a request code which generated a previous approval to obtain a new token. Or, it might try to attack web infratructure to obtain previously used request_code values which produced a token.</t>
        <t>Request code reuse is prevented in several ways.</t>
        <t>First - it is protected by client authentication on every endpoint at which it is presented, so that the request_code alone is insufficient to retrieve a token. Only the same agent which initially tried to access the resource (and was challenged) can reuse the code. These attacks are further limited because the codes require sufficient entropy to resist guessing. They are short-lived (single use) which limits their ability to be reused should they be revealed.</t>
        <t>There is certainly some risk of request_code's being leaked.
The SSE and WebSocket endpoints receive the request_code in the query component of the request URI, which is more likely than a request body to be recorded in server, proxy, and client logs. The AS and AI Agents <bcp14>SHOULD NOT</bcp14> log request_code values, and operators <bcp14>SHOULD</bcp14> configure intermediaries accordingly. This is admittedly a difficult requirement to implement, and this is why additional security measures noted above are applied to them.</t>
        <t>The request_code <bcp14>SHOULD NOT</bcp14> be exposed to the resource owner or to a browser; see <xref target="sec-approval-channel"/>.</t>
      </section>
      <section anchor="sec-push">
        <name>Delivery of Tokens over Push Channels</name>
        <t>Delivering the access token over an SSE stream or a WebSocket connection is as secure as delivering it in a token endpoint response, provided that the following requirements are met:</t>
        <ul spacing="normal">
          <li>
            <t>The connection <bcp14>MUST</bcp14> use TLS (<tt>https</tt> or <tt>wss</tt>). Plaintext <tt>http</tt> or <tt>ws</tt> endpoints <bcp14>MUST NOT</bcp14> be advertised or used.</t>
          </li>
          <li>
            <t>The connection <bcp14>MUST</bcp14> be client-authenticated, with the same client authentication the token endpoint requires. A push endpoint that accepted a request_code without client authentication would deliver the token to anyone who learned the request_code.</t>
          </li>
          <li>
            <t>The AS <bcp14>MUST</bcp14> verify that the request_code was issued to the authenticated client.</t>
          </li>
          <li>
            <t>The AS <bcp14>MUST</bcp14> deliver the token at most once over a push connection. Because the AS cannot know whether a pushed message was received before a connection was lost, an AI Agent that loses the connection during delivery loses the token and must restart the flow.</t>
          </li>
          <li>
            <t>The AS <bcp14>MUST</bcp14> close the connection after delivering a terminal event.</t>
          </li>
        </ul>
        <t>That said - there is an important limitation with push-based tokens. A
token delivered in a token endpoint response can be bound to a DPoP proof <xref target="RFC9449"/> presented with the request. No equivalent proof accompanies a pushed token. Tokens bound to a client certificate <xref target="RFC8705"/> can be delivered over a push connection established with that certificate.</t>
        <t>Push connections are long-lived, and are often routed through different infrastructure. Infrastructure that terminates TLS sees the token in cleartext, and <bcp14>MUST NOT</bcp14> log or buffer frame payloads in a way that retains tokens.</t>
      </section>
      <section anchor="sec-approval-channel">
        <name>Approval Channels and Agent-Mediated Approval</name>
        <t>As noted at the top of this section - a key goal of the AAuth flow is that it does not require trust in the AI Agent.</t>
        <t>There is one part of the flow where this is not exactly true - the web approval feature. With this feature, the AS sends the AI Agent a URL that it can use to launch a browser for the user to gain approval. A malicious AI Agent could do any number of things - it could launch the browser and use remote-control techniques to click "approve". Or, it could fetch the contents itself, and launch a browser to a fake page which presents misleading information.</t>
        <t>These attacks are partly mitigated by good security practices on AI Agent usage on user desktops. A user that grants permission for an AI Agent to control its browser - with cached session tokens, cookies, and so on - is exposing themselves to a lot of risk. If the user has not allowed an AI Agent to control its browser, many of the worst attacks are removed. That said, if the AI Agent doesn't possess user's credentials to log into the AS, the AI Agent will not be able to perform the attack without the user manually entering credentials. Modern web security features, such as passcodes and password managers protect against the malicious AI Agent from taking the use to a fraudulent site. However, if the AI agent has browser controls, it could await user password entry and then auto-click on approval.</t>
        <t>If the AI Agent doesn't have browser control, but only launches browser tabs, could attempt to launch the user to a malicious AS approval page. However, that AS would not be able to create tokens that will be accepted by the RS, limiting the efficacy of this attack.</t>
        <t>The best protections against malicious AI Agents happen by keeping the AI Agent out of the loop entirely. This works with an AS that has an easy way to reach the user - push notifications and SMS being ideal. However, we anticipate many cases where the AS has no easy and quick way to reach the user, in which case the web approval flow will be used.</t>
        <t>There are also good practices the AS can follow in the approval page to further limit risks:</t>
        <ol spacing="normal" type="1"><li>
            <t>Approval <bcp14>MUST</bcp14> require an explicit user action, <bcp14>MUST</bcp14> be protected against cross-site request forgery, and <bcp14>MUST NOT</bcp14> be possible through a GET request. The page <bcp14>MUST NOT</bcp14> be embeddable in a frame (for example, through a Content Security Policy of <tt>frame-ancestors 'none'</tt>).</t>
          </li>
          <li>
            <t>The page <bcp14>MUST</bcp14> display the client's registered name, the resource server, the reason, and the description of each scope, taken from the validated Scope Challenge and the AS's own records, and <bcp14>MUST NOT</bcp14> display text supplied by the AI Agent.</t>
          </li>
          <li>
            <t>For highly secure operations, the page <bcp14>SHOULD</bcp14> require the user to re-authenticate with their credentials</t>
          </li>
        </ol>
      </section>
      <section anchor="sec-dos">
        <name>Rate Limiting and Resource Exhaustion</name>
        <t>Because this specification makes use of polling, the AS needs to take steps to make sure it doesnt subject itself to a self-inflicted DoS attack. But more importantly, it needs to make sure it doesnt generate a flood of approvals to the human user.</t>
        <t>The AS <bcp14>SHOULD</bcp14> rate-limit polling and push connections per client, returning 429 as described in <xref target="errors"/>. It <bcp14>SHOULD</bcp14> limit the number of simultaneous push connections per client and per request_code.</t>
        <t>Validation of a Scope Challenge may cause the AS to fetch an RS's metadata and JWK Set. The AS <bcp14>SHOULD</bcp14> cache these, and <bcp14>SHOULD</bcp14> rate-limit re-fetches triggered by unrecognized <tt>kid</tt> values, so that an AI Agent cannot cause the AS to make unbounded outbound requests.</t>
        <t>To avoid flooding the user, the AS <bcp14>MUST</bcp14> limit the number of outstanding approval requests per combination of client (the AI Agent) and per resource owner (the user). The <tt>jti</tt> of the Scope Challenge ensures that each challenge can create at most one request.</t>
      </section>
      <section anchor="sec-scope-descriptions">
        <name>Scope Descriptions</name>
        <t>Scope descriptions are an essential part of the security of the solution. They are consumed by humans - or AI Agents operating on their behalf. This means that they need to contain sufficient explanatory text to allow either of those actors to make a good decision.</t>
        <t>In addition, because they are fairly public, they shouldn't expose any sensitive information about the RS behavior.</t>
      </section>
      <section anchor="elevated-tokens">
        <name>Elevated Tokens</name>
        <t>Just because a user approves an action an AI agent takes once, does not mean they would approve further actions which involve the same set of scopes.</t>
        <t>For example, take again our use case of a dinner reservation. If the an AI Agent is trying to book a dinner for a user, and requires a "write" scope to do so, the user might approve that operation. Later on, the AI Agent might decide to modify the dinner, reducing the number of guests from 5 to 1. This is something the user might not approve, but the AI could do so with the same token scope ("write") it obtained previously.</t>
        <t>As a result, the efficacy of the AAuth flow relies on the tokens being short-lived - generally long enough for the AI Agent to hit a number of API endpoints in a row to achieve a specified operation, but not longer.</t>
        <t>The exact amount of time for the lifetime of the token is somewhat dependent on the resource server and what APIs it exposes. As a general rule of thumb, 10 seconds to a minute is a reasonable amount of time.</t>
        <t>OPEN ISSUE - Even better security can be achieved if the AS is able to issue tokens which are bound to the specific operation associated with the reason phrase. Should we enhance the challenge to include API endpoints so that the AS can construct a token that actually specifies the specific API endpoints and values? Or is this too complicated? It will result in massively large tokens.</t>
        <t>For similar reasons, an AS compliant to this specification <bcp14>SHOULD NOT</bcp14> issue refresh tokens.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="oauth-uri-registration">
        <name>OAuth URI Registration</name>
        <t>This specification registers the following value in the "OAuth URI" sub-registry of the "OAuth Parameters" registry:</t>
        <ul spacing="normal">
          <li>
            <t>URN: <tt>urn:ietf:params:oauth:grant-type:agent_authorization</tt></t>
          </li>
          <li>
            <t>Common Name: Agent Authorization Grant Type</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Specification Document: this document</t>
          </li>
        </ul>
      </section>
      <section anchor="oauth-parameters-registration">
        <name>OAuth Parameters Registration</name>
        <t>This specification registers the following values in the "OAuth Parameters" registry established by <xref target="RFC6749"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Parameter name: <tt>scope_challenge</tt>; Parameter usage location: agent authorization request; Change controller: IETF; Specification document: <xref target="step3"/> of this document.</t>
          </li>
          <li>
            <t>Parameter name: <tt>timeout</tt>; Parameter usage location: agent authorization request; Change controller: IETF; Specification document: <xref target="timeout"/> of this document.</t>
          </li>
          <li>
            <t>Parameter name: <tt>request_code</tt>; Parameter usage location: token request; Change controller: IETF; Specification document: <xref target="polling"/> of this document.</t>
          </li>
        </ul>
      </section>
      <section anchor="oauth-extensions-error-registration">
        <name>OAuth Extensions Error Registration</name>
        <t>This specification registers the following value in the "OAuth Extensions Error" registry established by <xref target="RFC6749"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Error name: <tt>invalid_scope_challenge</tt></t>
          </li>
          <li>
            <t>Error usage location: agent authorization endpoint error response</t>
          </li>
          <li>
            <t>Related protocol extension: Agent Authorization Grant</t>
          </li>
          <li>
            <t>Change controller: IETF</t>
          </li>
          <li>
            <t>Specification document: <xref target="errors"/> of this document</t>
          </li>
        </ul>
      </section>
      <section anchor="oauth-authorization-server-metadata-registration">
        <name>OAuth Authorization Server Metadata Registration</name>
        <t>This specification registers the following value in the "OAuth Authorization Server Metadata" registry established by <xref target="RFC8414"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Metadata name: <tt>agent_authorization_endpoint</tt></t>
          </li>
          <li>
            <t>Metadata description: URL of the agent authorization endpoint</t>
          </li>
          <li>
            <t>Change controller: IETF</t>
          </li>
          <li>
            <t>Specification document: <xref target="as-metadata"/> of this document</t>
          </li>
        </ul>
      </section>
      <section anchor="oauth-protected-resource-metadata-registration">
        <name>OAuth Protected Resource Metadata Registration</name>
        <t>This specification registers the following value in the "OAuth Protected Resource Metadata" registry established by <xref target="RFC9728"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Metadata name: <tt>scope_descriptions_uri</tt></t>
          </li>
          <li>
            <t>Metadata description: URL of the resource server's Scope Descriptions Document</t>
          </li>
          <li>
            <t>Change controller: IETF</t>
          </li>
          <li>
            <t>Specification document: <xref target="rs-metadata"/> of this document</t>
          </li>
        </ul>
      </section>
      <section anchor="media-type-registration">
        <name>Media Type Registration</name>
        <t>This specification registers the <tt>application/scope-challenge+jwt</tt> media type in the "Media Types" registry, for use as the <tt>typ</tt> header parameter value <tt>scope-challenge+jwt</tt> of a Scope Challenge (<xref target="scope-challenge"/>). The registration follows the template of <xref target="RFC7519"/> for <tt>application/jwt</tt>, with the security considerations of <xref target="sec-challenge"/>.</t>
      </section>
      <section anchor="websocket-subprotocol-registration">
        <name>WebSocket Subprotocol Registration</name>
        <t>This specification registers the following value in the "WebSocket Subprotocol Name" registry established by <xref target="RFC6455"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Subprotocol Identifier: <tt>aauth.agent-flow</tt></t>
          </li>
          <li>
            <t>Subprotocol Common Name: AAuth Agent Authorization Flow</t>
          </li>
          <li>
            <t>Subprotocol Definition: <xref target="ws"/> of this document</t>
          </li>
        </ul>
      </section>
      <section anchor="well-defined-scope">
        <name>Well-Defined Scope</name>
        <t>There is no IANA registry for OAuth scope values. The <tt>ai-agent-minimal</tt> scope is defined by this specification (<xref target="step1"/>) and requires no registration.</t>
      </section>
    </section>
    <section anchor="ai-authorship-considerations">
      <name>AI Authorship Considerations</name>
      <t>The explanatory and descriptive prose was authored by human hands. AI assistance was used in the generation of protocol elements, tables, JSON documents, signatures, and detailed error code and protocol handling. AI was also used in the generation of much of the content in the security and IANA considerations sections, however the resulting text was heavily edited by human hands for clarity and style.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC5646">
          <front>
            <title>Tags for Identifying Languages</title>
            <author fullname="A. Phillips" initials="A." role="editor" surname="Phillips"/>
            <author fullname="M. Davis" initials="M." role="editor" surname="Davis"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document describes the structure, content, construction, and semantics of language tags for use in cases where it is desirable to indicate the language used in an information object. It also describes how to register values for use in language tags and the creation of user-defined extensions for private interchange. 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="47"/>
          <seriesInfo name="RFC" value="5646"/>
          <seriesInfo name="DOI" value="10.17487/RFC5646"/>
        </reference>
        <reference anchor="RFC6455">
          <front>
            <title>The WebSocket Protocol</title>
            <author fullname="I. Fette" initials="I." surname="Fette"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6455"/>
          <seriesInfo name="DOI" value="10.17487/RFC6455"/>
        </reference>
        <reference anchor="RFC6585">
          <front>
            <title>Additional HTTP Status Codes</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>This document specifies additional HyperText Transfer Protocol (HTTP) status codes for a variety of common situations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6585"/>
          <seriesInfo name="DOI" value="10.17487/RFC6585"/>
        </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="RFC6750">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC7515">
          <front>
            <title>JSON Web Signature (JWS)</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 Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </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="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </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>
        <reference anchor="RFC8628">
          <front>
            <title>OAuth 2.0 Device Authorization Grant</title>
            <author fullname="W. Denniss" initials="W." surname="Denniss"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="August" year="2019"/>
            <abstract>
              <t>The OAuth 2.0 device authorization grant is designed for Internet- connected devices that either lack a browser to perform a user-agent- based authorization or are input constrained to the extent that requiring the user to input text in order to authenticate during the authorization flow is impractical. It enables OAuth clients on such devices (like smart TVs, media consoles, digital picture frames, and printers) to obtain user authorization to access protected resources by using a user agent on a separate device.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8628"/>
          <seriesInfo name="DOI" value="10.17487/RFC8628"/>
        </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="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9728">
          <front>
            <title>OAuth 2.0 Protected Resource Metadata</title>
            <author fullname="M.B. Jones" initials="M.B." surname="Jones"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <author fullname="A. Parecki" initials="A." surname="Parecki"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client or authorization server can use to obtain the information needed to interact with an OAuth 2.0 protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9728"/>
          <seriesInfo name="DOI" value="10.17487/RFC9728"/>
        </reference>
        <reference anchor="HTML" target="https://html.spec.whatwg.org/multipage/server-sent-events.html">
          <front>
            <title>HTML Living Standard - Server-sent events</title>
            <author>
              <organization>WHATWG</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="I-D.bhutton-json-schema">
          <front>
            <title>JSON Schema: A Media Type for Describing JSON Documents</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry H. Andrews" initials="H. H." surname="Andrews">
         </author>
            <author fullname="Ben Hutton" initials="B." surname="Hutton">
              <organization>Postman</organization>
            </author>
            <author fullname="Greg Dennis" initials="G." surname="Dennis">
         </author>
            <date day="10" month="June" year="2022"/>
            <abstract>
              <t>   JSON Schema defines the media type "application/schema+json", a JSON-
   based format for describing the structure of JSON data.  JSON Schema
   asserts what a JSON document must look like, ways to extract
   information from it, and how to interact with it.  The "application/
   schema-instance+json" media type provides additional feature-rich
   integration with "application/schema+json" beyond what can be offered
   for "application/json" documents.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bhutton-json-schema-01"/>
        </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="I-D.ietf-oauth-v2-1">
          <front>
            <title>The OAuth 2.1 Authorization Framework</title>
            <author fullname="Dick Hardt" initials="D." surname="Hardt">
              <organization>Hellō</organization>
            </author>
            <author fullname="Aaron Parecki" initials="A." surname="Parecki">
              <organization>Okta</organization>
            </author>
            <author fullname="Torsten Lodderstedt" initials="T." surname="Lodderstedt">
              <organization>SPRIND</organization>
            </author>
            <date day="30" month="October" year="2026"/>
            <abstract>
              <t>   The OAuth 2.1 authorization framework enables an application to
   obtain limited access to a protected resource, either on behalf of a
   resource owner by orchestrating an approval interaction between the
   resource owner and an authorization service, or by allowing the
   application to obtain access on its own behalf.  This specification
   replaces and obsoletes the OAuth 2.0 Authorization Framework
   described in RFC 6749 and the Bearer Token Usage in RFC 6750.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-v2-1-17"/>
        </reference>
        <reference anchor="I-D.hardt-oauth-aauth-protocol">
          <front>
            <title>AAuth Protocol</title>
            <author fullname="Dick Hardt" initials="D." surname="Hardt">
              <organization>Hellō</organization>
            </author>
            <date day="25" month="September" year="2026"/>
            <abstract>
              <t>   This document defines the AAuth authorization protocol for agent-to-
   resource authorization and identity claim retrieval.  The protocol
   supports five resource access modes — agent identity, resource-
   managed (two-party), person identity, PS authorization (three-party),
   and federated authorization (four-party) — with agent governance as
   an orthogonal layer.  It builds on the HTTP Signature Keys
   specification ([I-D.hardt-httpbis-signature-key]) for HTTP Message
   Signatures and key discovery.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-hardt-oauth-aauth-protocol-11"/>
        </reference>
        <reference anchor="RFC4647">
          <front>
            <title>Matching of Language Tags</title>
            <author fullname="A. Phillips" initials="A." role="editor" surname="Phillips"/>
            <author fullname="M. Davis" initials="M." role="editor" surname="Davis"/>
            <date month="September" year="2006"/>
            <abstract>
              <t>This document describes a syntax, called a "language-range", for specifying items in a user's list of language preferences. It also describes different mechanisms for comparing and matching these to language tags. Two kinds of matching mechanisms, filtering and lookup, are defined. Filtering produces a (potentially empty) set of language tags, whereas lookup produces a single language tag. Possible applications include language negotiation or content selection. This document, in combination with RFC 4646, replaces RFC 3066, which replaced RFC 1766. 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="47"/>
          <seriesInfo name="RFC" value="4647"/>
          <seriesInfo name="DOI" value="10.17487/RFC4647"/>
        </reference>
        <reference anchor="RFC7591">
          <front>
            <title>OAuth 2.0 Dynamic Client Registration Protocol</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="M. Machulak" initials="M." surname="Machulak"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <date month="July" year="2015"/>
            <abstract>
              <t>This specification defines mechanisms for dynamically registering OAuth 2.0 clients with authorization servers. Registration requests send a set of desired client metadata values to the authorization server. The resulting registration responses return a client identifier to use at the authorization server and the client metadata values registered for the client. The client can then use this registration information to communicate with the authorization server using the OAuth 2.0 protocol. This specification also defines a set of common client metadata fields and values for clients to use during registration.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7591"/>
          <seriesInfo name="DOI" value="10.17487/RFC7591"/>
        </reference>
        <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>
        <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="RFC8705">
          <front>
            <title>OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes OAuth client authentication and certificate-bound access and refresh tokens using mutual Transport Layer Security (TLS) authentication with X.509 certificates. OAuth clients are provided a mechanism for authentication to the authorization server using mutual TLS, based on either self-signed certificates or public key infrastructure (PKI). OAuth authorization servers are provided a mechanism for binding access tokens to a client's mutual-TLS certificate, and OAuth protected resources are provided a method for ensuring that such an access token presented to it was issued to the client presenting the token.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8705"/>
          <seriesInfo name="DOI" value="10.17487/RFC8705"/>
        </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>
        <reference anchor="RFC9421">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="RFC9449">
          <front>
            <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Waite" initials="D." surname="Waite"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows for the detection of replay attacks with access and refresh tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9449"/>
          <seriesInfo name="DOI" value="10.17487/RFC9449"/>
        </reference>
        <reference anchor="RFC9470">
          <front>
            <title>OAuth 2.0 Step Up Authentication Challenge Protocol</title>
            <author fullname="V. Bertocci" initials="V." surname="Bertocci"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>It is not uncommon for resource servers to require different authentication strengths or recentness according to the characteristics of a request. This document introduces a mechanism that resource servers can use to signal to a client that the authentication event associated with the access token of the current request does not meet its authentication requirements and, further, how to meet them. This document also codifies a mechanism for a client to request that an authorization server achieve a specific authentication strength or recentness when processing an authorization request.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9470"/>
          <seriesInfo name="DOI" value="10.17487/RFC9470"/>
        </reference>
        <reference anchor="RFC9700">
          <front>
            <title>Best Current Practice for OAuth 2.0 Security</title>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="A. Labunets" initials="A." surname="Labunets"/>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <date month="January" year="2025"/>
            <abstract>
              <t>This document describes best current security practice for OAuth 2.0. It updates and extends the threat model and security advice given in RFCs 6749, 6750, and 6819 to incorporate practical experiences gathered since OAuth 2.0 was published and covers new threats relevant due to the broader application of OAuth 2.0. Further, it deprecates some modes of operation that are deemed less secure or even insecure.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="240"/>
          <seriesInfo name="RFC" value="9700"/>
          <seriesInfo name="DOI" value="10.17487/RFC9700"/>
        </reference>
        <reference anchor="I-D.ietf-wimse-arch">
          <front>
            <title>Workload Identity in a Multi System Environment (WIMSE) Architecture</title>
            <author fullname="Joseph A. Salowey" initials="J. A." surname="Salowey">
              <organization>Palo Alto Networks</organization>
            </author>
            <author fullname="Yaroslav Rosomakho" initials="Y." surname="Rosomakho">
              <organization>Zscaler</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>University of the Bundeswehr Munich</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   The increasing prevalence of cloud computing and micro service
   architectures has led to the rise of complex software functions being
   built and deployed as workloads, where a workload is defined as
   software executing for a specific purpose, potentially comprising one
   or more running instances.  This document discusses an architecture
   for designing and standardizing protocols and payloads for conveying
   workload identity and security context information.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-arch-08"/>
        </reference>
        <reference anchor="I-D.ietf-wimse-workload-creds">
          <front>
            <title>WIMSE Workload Credentials</title>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <author fullname="Joseph A. Salowey" initials="J. A." surname="Salowey">
              <organization>Palo Alto Networks</organization>
            </author>
            <author fullname="Arndt Schwenkschuster" initials="A." surname="Schwenkschuster">
              <organization>Defakto Security</organization>
            </author>
            <author fullname="Yaron Sheffer" initials="Y." surname="Sheffer">
              <organization>Independent</organization>
            </author>
            <author fullname="Yaroslav Rosomakho" initials="Y." surname="Rosomakho">
              <organization>Zscaler</organization>
            </author>
            <date day="30" month="October" year="2026"/>
            <abstract>
              <t>   The WIMSE architecture defines authentication and authorization for
   software workloads in a variety of runtime environments, from the
   most basic ones up to complex multi-service, multi-cloud, multi-
   tenant deployments.

   This document defines the credentials that workloads use to represent
   their identity.  They can be used in various protocols to
   authenticate workloads to each other.  To use these credentials,
   workloads must provide proof of possession of the associated private
   key material, which is covered in other documents.  This document
   focuses on the credentials alone, independent of the proof-of-
   possession mechanism.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-creds-03"/>
        </reference>
        <reference anchor="I-D.ietf-wimse-wpt">
          <front>
            <title>WIMSE Workload Proof Token</title>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <author fullname="Arndt Schwenkschuster" initials="A." surname="Schwenkschuster">
              <organization>Defakto Security</organization>
            </author>
            <date day="27" month="August" year="2026"/>
            <abstract>
              <t>   The WIMSE architecture defines authentication and authorization for
   software workloads in a variety of runtime environments, from basic
   deployments to complex multi-service, multi-cloud, multi-tenant
   systems.  This document specifies the Workload Proof Token (WPT), a
   mechanism for workloads to prove possession of the private key
   associated with a Workload Identity Token (WIT).  The WPT is a signed
   JWT that binds the workload's authentication to a specific HTTP
   request, providing application-layer proof of possession for
   workload-to-workload communication.  This specification is designed
   to work alongside the WIT credential format defined in draft-ietf-
   wimse-workload-creds and can be combined with other WIMSE protocols
   in multi-hop call chains.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-wpt-02"/>
        </reference>
        <reference anchor="I-D.ietf-webbotauth-httpsig-protocol">
          <front>
            <title>HTTP Message Signatures for automated traffic</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Sandor Major" initials="S." surname="Major">
              <organization>Google</organization>
            </author>
            <date day="29" month="October" year="2026"/>
            <abstract>
              <t>   This document describes a protocol for identifying automated traffic
   using [HTTP-MESSAGE-SIGNATURES].  The goal is to allow automated HTTP
   clients to cryptographically sign outbound requests, allowing HTTP
   servers to verify their identity with confidence.

   It defines the Signature-Agent header field for in-band key
   discovery, a key directory format based on JWKS, and a well-known URI
   at which that directory is served.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webbotauth-httpsig-protocol-01"/>
        </reference>
        <reference anchor="OIDC" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0 incorporating errata set 2</title>
            <author initials="N." surname="Sakimura">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="M." surname="Jones">
              <organization/>
            </author>
            <author initials="B." surname="de Medeiros">
              <organization/>
            </author>
            <author initials="C." surname="Mortimore">
              <organization/>
            </author>
            <date year="2023" month="December"/>
          </front>
        </reference>
        <reference anchor="W3C-AgentId" target="https://www.w3.org/groups/cg/agent-identity/">
          <front>
            <title>Agent Identity Registry Protocol Community Group</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 935?>

<section anchor="scope-descriptions">
      <name>Scope Descriptions Document</name>
      <t>This appendix defines the format of the Scope Descriptions Document that an RS publishes at its <tt>scope_descriptions_uri</tt> (<xref target="rs-metadata"/>), and gives a JSON Schema <xref target="I-D.bhutton-json-schema"/> for it.</t>
      <t>OPEN ISSUE: Human-readable, localizable scope descriptions published by the resource server are useful well beyond this specification. Any consent user interface would need this. It may make sense to publish this format as its own OAuth extension, with this specification simply referencing it. Feedback on that question is welcome.</t>
      <section anchor="format">
        <name>Format</name>
        <t>The document is a JSON object <xref target="RFC8259"/>, served with a media type of <tt>application/json</tt> over HTTPS. The RS <bcp14>SHOULD</bcp14> serve it with caching directives that allow the AS to cache it. Its members are:</t>
        <dl>
          <dt><tt>default_locale</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. A language tag <xref target="RFC5646"/> identifying the language of the top-level <tt>title</tt> and <tt>description</tt> of each scope. If absent, that language is unspecified.</t>
          </dd>
          <dt><tt>scope_descriptions</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. An object whose member names are scope values and whose member values are Scope Description objects.</t>
          </dd>
        </dl>
        <t>A Scope Description object has the following members:</t>
        <dl>
          <dt><tt>title</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. A short label for the scope, suitable for use as a heading or as a single line in a list. At most 100 characters.</t>
          </dd>
          <dt><tt>description</tt>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. One or two sentences describing what a client holding this scope can do, in terms the resource owner can act on. At most 500 characters.</t>
          </dd>
          <dt><tt>risk</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. The RS's assessment of the risk of granting the scope: one of <tt>low</tt>, <tt>medium</tt>, or <tt>high</tt>. An AS <bcp14>MAY</bcp14> use this to adjust how prominently it presents the scope, or to inform an automated approval policy.</t>
          </dd>
          <dt><tt>localizations</tt>:</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. An object whose member names are language tags <xref target="RFC5646"/> and whose member values are objects containing a <tt>title</tt> and a <tt>description</tt> in that language, subject to the same constraints as the top-level members.</t>
          </dd>
        </dl>
        <t>Unrecognized members <bcp14>MUST</bcp14> be ignored, to allow for extension.</t>
        <t>When presenting a scope, the AS selects the localization that best matches the resource owner's language preferences - for example, by applying the lookup algorithm of <xref target="RFC4647"/> to the member names of <tt>localizations</tt> - and falls back to the top-level <tt>title</tt> and <tt>description</tt> if none matches. The AS <bcp14>MUST</bcp14> render all of these values as plain text.</t>
      </section>
      <section anchor="example-2">
        <name>Example</name>
        <figure>
          <name>Scope Descriptions Document (line breaks within strings added for readability)</name>
          <artwork><![CDATA[
{
  "default_locale": "en",
  "scope_descriptions": {
    "urn:example:reservations.read": {
      "title": "View your reservations",
      "description": "Lets the agent see your upcoming and past
                      restaurant reservations.",
      "risk": "low",
      "localizations": {
        "de": {
          "title": "Ihre Reservierungen anzeigen",
          "description": "Erlaubt dem Agenten, Ihre vergangenen
                          und kommenden Restaurantreservierungen
                          einzusehen."
        }
      }
    },
    "urn:example:reservations.write": {
      "title": "Make and change reservations",
      "description": "Lets the agent book, change, and cancel
                      restaurant reservations on your behalf.",
      "risk": "high"
    }
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="json-schema">
        <name>JSON Schema</name>
        <figure>
          <name>JSON Schema for the Scope Descriptions Document</name>
          <artwork><![CDATA[
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "AAuth Scope Descriptions Document",
  "type": "object",
  "required": ["scope_descriptions"],
  "properties": {
    "default_locale": { "$ref": "#/$defs/languageTag" },
    "scope_descriptions": {
      "type": "object",
      "minProperties": 1,
      "additionalProperties": { "$ref": "#/$defs/scopeDescription" }
    }
  },
  "$defs": {
    "languageTag": {
      "type": "string",
      "description": "A language tag as defined by RFC 5646",
      "pattern": "^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "description": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "localizedText": {
      "type": "object",
      "required": ["title", "description"],
      "properties": {
        "title": { "$ref": "#/$defs/title" },
        "description": { "$ref": "#/$defs/description" }
      }
    },
    "scopeDescription": {
      "type": "object",
      "required": ["title", "description"],
      "properties": {
        "title": { "$ref": "#/$defs/title" },
        "description": { "$ref": "#/$defs/description" },
        "risk": {
          "type": "string",
          "enum": ["low", "medium", "high"]
        },
        "localizations": {
          "type": "object",
          "propertyNames": { "$ref": "#/$defs/languageTag" },
          "additionalProperties": {
            "$ref": "#/$defs/localizedText"
          }
        }
      }
    }
  }
}
]]></artwork>
        </figure>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
TQzSayaIirLWARDO44YBVWJgGbsAzR0cVNWpVdJT2hqIBs13Ab9L48pKRozy
bqLglqqhJXAe6lMSoonEbQfAR4CsToP3/DrtbhlQr1I0aSVcceDSPIzpV/IZ
w0FnWqZnhwZnzX7qXN5S5JPW7aZOULVaXXgRx85Sz9jBoiYgb2vW0rfDgEKy
T7dNg0FrPTBFTcXlOPmAFHxeDhUj8E7hT9N69dgSqrVq5Pdd0chcxQ7HRasE
YpLdm6PKO72tWOuXGhpPHl31m8U2nI2UaluXBzhtgDesBaHoRDjdgHpyxtYS
QGJ6GgoFkpflqsGGiw3Xo89g6B+/ZRUa0oHhDgVFNErejOR6yaBGmBl2npRL
g13SYp4WJUOjGS2KcQ1v8nU07AIV96ZCkt/XTm7UI4b1hrJxb9GahPBbcpwt
Zdc5eG64GxXe82bytTBUCeDYxThIUNK7QfCYwRrQLgG0HCvR2p2Q82XitAVD
IULD+y3VWHLgMMlebJHGjHi0gTnBmM7qzJ23lvt/xAtYbBx5wi2KZiq7FIZu
sDXFqwsy3uLTHOPw57Aoa/hSVVpc7aReXz0fESfUTnx9jyBaJ11oKpI6hX4b
j22ramfL8Ng4/9hamnCMRlYhZ41ZBYVNKE0be8O40o7sZEmUs8bk6D/fUrdF
Iy3C45IWBhP0CUjN37yDonq5TPzT/5jsJRd9f2o5w9mb64sSRrB1U+S9AqEe
KxCBwxJ2oXIXD9UqWKBtiuaY1YUaLXkuig1o9CJwrpshdIbAO+2UVgVoW3Dx
MKTQE6eMSOMUOZJWg1rGU8igk1MhIjTdzUbSgBvEQ3iIT9Vl8BVxzepcRGLE
faBKI4b9qhBpLp9kRf2GvalxBv4Qw7/3EVC/9X4bDAbm//CcicT4TfQ0dGhq
hS+6mr+JrGPm2N9+pw8CHvM42D8XmcaOjCKi2GN+C8af9xgIe2d7HsK9l2f2
voyHDR9TqzDPkKZrVuv8zYY8sT0SXQ5qw8mSRrQ+LYWs2bgSon7v+TFYAY9/
BCB6AiQfh/awyxRMQ64ngYJK1/2B5Umui4YDwxvOz55x3cx7fC/Yv8rz4AUa
mCW8viR4OmqOcrMKHoTbNr0G9uRNXYK09j4CSHRA1OSTW3jajL4rj8S5OFta
5bJDVJNNYFctqWluFMplmCJdY0nXarEcOcxR1h6A0eSROUzCWDk0QiAXUoDR
+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
sSPXVqT65C5a/6X3/wGir9xg/h0BAA==

-->

</rfc>
