<?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.35 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-chen-oauth-agent-revocation-00" category="std" consensus="true" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="Authorization revocation">OAuth 2.0 Agent Authorization Explicit Revocation</title>
    <seriesInfo name="Internet-Draft" value="draft-chen-oauth-agent-revocation-00"/>
    <author initials="M." surname="Chen" fullname="Meiling Chen">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <city>BeiJing</city>
          <country>China</country>
        </postal>
        <email>chenmeiling@chinamobile.com</email>
      </address>
    </author>
    <author initials="L." surname="Su" fullname="Li Su">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <city>BeiJing</city>
          <country>China</country>
        </postal>
        <email>suli@chinamobile.com</email>
      </address>
    </author>
    <date year="2026" month="April" day="27"/>
    <area>Security</area>
    <workgroup>OAuth Working Group</workgroup>
    <keyword>OAuth</keyword>
    <keyword>Security</keyword>
    <keyword>Authorization</keyword>
    <keyword>Revocation</keyword>
    <abstract>
      <?line 39?>

<t>The OAuth 2.0 Token Revocation mechanism defined in RFC 7009 enables clients to notify authorization servers that a token is no longer needed. However, that mechanism is limited to single-token operations and does not support batch revocation, cascade propagation, or context-aware semantics at the agent level. With the emergence of autonomous systems and cross-domain agent networks, authorization servers require more granular, traceable revocation semantics.</t>
      <t>This document defines an agent-based explicit revocation extension, introducing new endpoints, request/response formats, and coordination protocols to support batch revocation based on agent IDs, cascade propagation, conditional revocation, and verifiable audit trails.</t>
    </abstract>
  </front>
  <middle>
    <?line 45?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>RFC 7009 defines the standard OAuth 2.0 token revocation flow, which operates at the granularity of individual tokens (access tokens or refresh tokens). This design works well in traditional client-server architectures but reveals significant limitations in emerging scenarios:</t>
      <t>Agent Networks: Multiple agent proxies form delegation chains through authorization topology</t>
      <t>Autonomous Systems: Agents can dynamically generate sub-agents and distribute permissions</t>
      <t>Cross-Domain Collaboration: Agents migrate across different trust domains
In these scenarios, revoking access for an upstream agent typically requires simultaneously revoking all its delegated sub-agents. RFC 7009 lacks mechanisms to support such cascade revocation.</t>
      <t>Existing RFC 7009 exhibits the following core deficiencies:</t>
      <t>Single Granularity: Supports only per-token revocation, cannot batch process by agent ID
No Cascade Propagation: After upstream agent revocation, downstream sub-agent tokens remain valid
Insufficient Response Information: 200 OK status does not provide revocation confirmation, execution results, or failure details
No Audit Context: Cannot convey revocation reasons, operator identity, or other critical audit information
No Event Notification: No standard mechanism to notify relevant parties (e.g., resource servers, downstream agents) of token status changes
Missing Conditional Revocation: Does not support suspension, partial permission revocation, or other fine-grained policies</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC8174">RFC2119</xref>.</t>
      <t>Readers are expected to be familiar with the terms and concepts described in the core OAuth 2.0 Framework <xref target="RFC6749"/> and <xref target="RFC7009"/>.</t>
    </section>
    <section anchor="agent-revocation-endpoint">
      <name>Agent Revocation Endpoint</name>
      <section anchor="endpoint-definition">
        <name>Endpoint Definition</name>
        <t>To support agent-based explicit revocation, a new endpoint is defined:</t>
        <artwork><![CDATA[
  POST /agent/revoke
]]></artwork>
        <t>This endpoint accepts a JSON request body containing the revocation target, reason, and propagation strategy.</t>
      </section>
      <section anchor="request-format">
        <name>Request Format</name>
        <t>The request MUST include the following parameters:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Metadata Field</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>agent_id</tt></td>
              <td align="left">String</td>
              <td align="left">Yes</td>
              <td align="left">Identifier of the agent to be revoked.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>reason</tt></td>
              <td align="left">Object</td>
              <td align="left">Yes</td>
              <td align="left">Revocation reason, containing code and description.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>cascade_depth</tt></td>
              <td align="left">integer</td>
              <td align="left">Yes</td>
              <td align="left">Cascade depth, -1 for unlimited, 0 for this agent only.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>context</tt></td>
              <td align="left">Object</td>
              <td align="left">Recommended</td>
              <td align="left">Operation context including operator, source_ip, request_id.</td>
            </tr>
          </tbody>
        </table>
        <t>Status Parameters:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>revoke_all_tokens</tt></td>
              <td align="left">boolean</td>
              <td align="left">No</td>
              <td align="left">Whether to revoke all tokens for this agent, default true.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>revoke_for_duration</tt></td>
              <td align="left">integer</td>
              <td align="left">No</td>
              <td align="left">Temporary suspension duration in seconds, absent means permanent.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>revoke_scopes</tt></td>
              <td align="left">array</td>
              <td align="left">No</td>
              <td align="left">List of scopes to be removed.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>retain_scopes</tt></td>
              <td align="left">array</td>
              <td align="left">No</td>
              <td align="left">List of scopes to be retained.</td>
            </tr>
          </tbody>
        </table>
        <t>Example Requst:</t>
        <artwork><![CDATA[
POST /agent/revoke HTTP/1.1
Host: authorization-server.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...

{
  "agent_id": "urn:agent:root:12345",
  "reason": {
    "code": "SECURITY_INCIDENT",
    "description": "Agent exhibited anomalous behavior pattern"
  },
  "cascade_depth": -1,
  "context": {
    "operator": "urn:user:admin:security",
    "source_ip": "10.0.0.1",
    "request_id": "req-abc-123"
  },
  "revoke_all_tokens": true
}
]]></artwork>
      </section>
      <section anchor="response-format">
        <name>Response Format</name>
        <t>The server MUST return a JSON response containing execution status and detailed statistics.</t>
        <t>Example Successful Response (HTTP 200):</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "status": "completed",
  "transaction_id": "tx-uuid-001",
  "timestamp": "2026-03-25T10:30:00Z",
  "summary": {
    "direct_agents_revoked": 1,
    "cascade_agents_revoked": 3,
    "tokens_revoked": 15,
    "events_emitted": 15,
    "failures": []
  },
  "affected_agents": [
    {"agent_id": "urn:agent:root:12345", "status": "revoked"},
    {"agent_id": "urn:agent:sub:child_1", "status": "revoked"},
    {"agent_id": "urn:agent:sub:child_2", "status": "revoked"},
    {"agent_id": "urn:agent:sub:child_3", "status": "revoked"}
  ],
  "audit_reference": "urn:audit:log:entry-98765"
}
]]></artwork>
        <t>Example Failure Response (HTTP 400)</t>
        <artwork><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "status": "failed",
  "transaction_id": "tx-uuid-002",
  "timestamp": "2026-03-25T10:31:00Z",
  "error": {
    "code": "INVALID_AGENT_ID",
    "description": "The specified agent_id does not exist or has already been revoked."
  },
  "summary": {
    "direct_agents_revoked": 0,
    "cascade_agents_revoked": 0,
    "tokens_revoked": 0,
    "events_emitted": 0,
    "failures": [
      {
        "agent_id": "urn:agent:root:99999",
        "reason": "Agent not found"
      }
    ]
  },
  "audit_reference": "urn:audit:log:entry-98766"
}
]]></artwork>
        <t>Response Status Codes</t>
        <table>
          <thead>
            <tr>
              <th align="left">HTTP Status</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>200 OK</tt></td>
              <td align="left">Revocation completed successfully</td>
            </tr>
            <tr>
              <td align="left">
                <tt>400 Bad Request</tt></td>
              <td align="left">Invalid request parameters (e.g., missing required fields, malformed agent_id)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>401 Unauthorized</tt></td>
              <td align="left">Missing or invalid authentication credentials</td>
            </tr>
            <tr>
              <td align="left">
                <tt>403 Forbidden</tt></td>
              <td align="left">Authenticated client lacks permission to revoke the specified agent</td>
            </tr>
            <tr>
              <td align="left">
                <tt>404 Not Found</tt></td>
              <td align="left">Agent ID not recognized</td>
            </tr>
            <tr>
              <td align="left">
                <tt>409 Conflict</tt></td>
              <td align="left">Revocation conflicts with an existing operation (e.g., partial revocation already in progress)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>429 Too Many Requests</tt></td>
              <td align="left">Rate limit exceeded</td>
            </tr>
            <tr>
              <td align="left">
                <tt>500 Internal Server Error</tt></td>
              <td align="left">Unexpected server error</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This document based on RFC7009</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-informative-references">
      <name>Informative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC7009">
        <front>
          <title>OAuth 2.0 Token Revocation</title>
          <author fullname="T. Lodderstedt" initials="T." role="editor" surname="Lodderstedt"/>
          <author fullname="S. Dronia" initials="S." surname="Dronia"/>
          <author fullname="M. Scurtescu" initials="M." surname="Scurtescu"/>
          <date month="August" year="2013"/>
          <abstract>
            <t>This document proposes an additional endpoint for OAuth authorization servers, which allows clients to notify the authorization server that a previously obtained refresh or access token is no longer needed. This allows the authorization server to clean up security credentials. A revocation request will invalidate the actual token and, if applicable, other tokens based on the same authorization grant.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7009"/>
        <seriesInfo name="DOI" value="10.17487/RFC7009"/>
      </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>
    </references>
    <?line 219?>



  </back>
  <!-- ##markdown-source:
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
fjj1x9v4GSJKz/8FAN6/WQMdAAA=

-->

</rfc>
