<?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.5 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-parecki-oauth-global-token-revocation-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.4 -->
  <front>
    <title>Global Token Revocation</title>
    <seriesInfo name="Internet-Draft" value="draft-parecki-oauth-global-token-revocation-02"/>
    <author fullname="Aaron Parecki">
      <organization>Okta</organization>
      <address>
        <email>aaron@parecki.com</email>
        <uri>https://aaronparecki.com</uri>
      </address>
    </author>
    <date year="2024" month="March" day="02"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>oauth</keyword>
    <keyword>token revocation</keyword>
    <keyword>logout</keyword>
    <abstract>
      <?line 55?>

<t>Global Token Revocation enables parties such as a security incident management tool or an external Identity Provider to send a request to an Authorization Server to indicate that it should revoke all of the user's existing tokens and require that the user re-authenticates before issuing new tokens.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://aaronpk.github.io/global-token-revocation/draft-parecki-oauth-global-token-revocation.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-parecki-oauth-global-token-revocation/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Authorization Protocol Working Group mailing list (<eref target="mailto:oauth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/oauth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/aaronpk/global-token-revocation"/>.</t>
    </note>
  </front>
  <middle>
    <?line 60?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>An OAuth Authorization Server issues tokens in response to a user authorizing a client. A party external to the OAuth Authorization Server may wish to instruct the Authorization Server to revoke all tokens belonging to a particular user, and prevent the server from issuing new tokens until the user re-authenticates.</t>
      <t>For example, a security incident management tool may detect anomalous behaviour on a user's account, or if the user logged in through an enterprise Identity Provider, the Identity Provider may want to revoke all of a user's tokens in the event of a security incident or on the employee's termination.</t>
      <t>This specification describes an API endpoint on an Authorization Server that can accept requests from external parties to revoke all tokens associated with a given user.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="terminology">
        <name>Terminology</name>
        <t>This specification uses the terms "Access Token", "Authorization Code",
"Authorization Endpoint", "Authorization Server" (AS), "Client", "Client Authentication",
"Client Identifier", "Client Secret", "End-User", "Grant Type", "Protected Resource",
"Redirection URI", "Refresh Token", "Resource Owner", "Resource Server" (RS)
and "Token Endpoint" defined by <xref target="RFC6749"/>,
and the terms "OpenID Provider" (OP) and "ID Token" defined by <xref target="OpenID"/>.</t>
        <t>This specification uses the term "Identity Provider" (IdP) to refer to
the Authorization Server or OpenID Provider that is used for End-User authentication.</t>
        <t>TODO: Replace RFC6749 references with OAuth 2.1</t>
      </section>
      <section anchor="roles">
        <name>Roles</name>
        <t>In a typical OAuth deployment, the OAuth client obtains tokens from the authorization server when a user logs in and authorizes the client. In many cases, the method by which a user logs in at the authorization server is through an external identity provider.</t>
        <t>For example, a mobile chat application is an OAuth Client, and obtains tokens from its backend server which stores the chat messages. The mobile chat backend plays the OAuth roles of "Resource Server" and "Authorization Server".</t>
        <t>In some cases, the user will log in to the Authorization Server using an external (e.g. enterprise) Identity Provider. In that case, when a user logs in to the chat application, the backend server may play the role of an OAuth client (or OpenID or SAML relying party) to the Identity Provider in a new authorization or authentication flow.</t>
      </section>
    </section>
    <section anchor="token-revocation">
      <name>Token Revocation</name>
      <t>A revocation request is a POST request to the Global Token Revocation endpoint, which starts the process of revoking all tokens for the identified subject.</t>
      <section anchor="revocation-endpoint">
        <name>Revocation Endpoint</name>
        <t>The Global Token Revocation endpoint is a URL at the authorization server which accepts HTTP POST requests with parameters in the HTTP request message body using the <tt>application/json</tt> format. The Global Token Revocation endpoint URL <bcp14>MUST</bcp14> use the <tt>https</tt> scheme.</t>
        <t>If the authorization server supports OAuth Server Metadata (<xref target="RFC8414"/>), the authorization server <bcp14>SHOULD</bcp14> include the URL of their Global Token Revocation endpoint in their authorization server metadata document using the <tt>global_token_revocation_endpoint</tt> parameter as defined in <xref target="authorization-server-metadata"/>.</t>
        <t>The authorization server <bcp14>MAY</bcp14> alternatively register the endpoint with tools that will use it.</t>
      </section>
      <section anchor="revocation-request">
        <name>Revocation Request</name>
        <t>The request is a POST request with an <tt>application/json</tt> body containing a single property <tt>subject</tt>, the value of which is a Security Event Token Subject Identifier as defined in "Subject Identifiers for Security Event Tokens" <xref target="RFC9493"/>.</t>
        <t>In practice, this means the value of <tt>subject</tt> is a JSON object with a property <tt>format</tt>, and at least one additional property depending on the value of <tt>format</tt>.</t>
        <t>The request <bcp14>MUST</bcp14> also be authenticated, the particular authentication method and means by which the authentication is established is out of scope of this specification, but may include OAuth 2.0 Bearer Token <xref target="RFC6750"/> or a JWT <xref target="RFC7523"/>.</t>
        <t>The following example requests that all tokens for a user identified by an email address be revoked:</t>
        <artwork><![CDATA[
POST /global-token-revocation
Host: example.com
Content-Type: application/json
Authorization: Bearer f5641763544a7b24b08e4f74045

{
  "subject": {
    "format": "email",
    "email": "user@example.com"
  }
}
]]></artwork>
        <t>If the user identifier at the authorization server is known by the system making the revocation request, the request can use the "Opaque Identifer" format to provide the user identifier:</t>
        <artwork><![CDATA[
POST /global-token-revocation
Host: example.com
Content-Type: application/json
Authorization: Bearer f5641763544a7b24b08e4f74045

{
  "subject": {
    "format": "opaque",
    "id": "e193177dfdc52e3dd03f78c"
  }
}
]]></artwork>
        <t>If it is expected that the authorization server knows about the user identifier at the IdP, the request can use the "Issuer and Subject Identifier" format:</t>
        <artwork><![CDATA[
POST /global-token-revocation
Host: example.com
Content-Type: application/json
Authorization: Bearer f5641763544a7b24b08e4f74045

{
  "subject": {
    "format": "iss_sub",
    "iss": "https://issuer.example.com/",
    "sub": "af19c476f1dc4470fa3d0d9a25"
  }
}
]]></artwork>
      </section>
      <section anchor="revocation-expectations">
        <name>Revocation Expectations</name>
        <t>Upon receiving a revocation request, authorizing the request, and validating the identified user, the Authorization Server:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> revoke all active refresh tokens</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> invalidate all access tokens, although it is recognized that it might not be technically feasible to invalidate access tokens (see <xref target="access-tokens"/> below)</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> issue new access tokens or refresh tokens without re-authenticating the user</t>
          </li>
        </ul>
      </section>
      <section anchor="revocation-response">
        <name>Revocation Response</name>
        <t>This specification indicates success and error conditions by using HTTP response codes, and does not define the response body format or content.</t>
        <section anchor="successful-response">
          <name>Successful Response</name>
          <t>To indicate that the request was successful and revocation of the requested set of tokens has begun, the server returns an HTTP 204 response.</t>
        </section>
        <section anchor="error-response">
          <name>Error Response</name>
          <t>The following HTTP response codes can be used to indicate various error conditions:</t>
          <ul spacing="normal">
            <li>
              <t><strong>400 Bad Request</strong>: The request was malformed, e.g. an unrecognized or unsupported type of subject identifier.</t>
            </li>
            <li>
              <t><strong>401 Unauthorized</strong>: Authentication provided was invalid.</t>
            </li>
            <li>
              <t><strong>403 Forbidden</strong>: Insufficient authorization, e.g. missing scopes.</t>
            </li>
            <li>
              <t><strong>404 User Not Found</strong>: The user indicated by the subject identifier was not found.</t>
            </li>
            <li>
              <t><strong>422 Unable to Process Request</strong>: Unable to log out the user.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="access-tokens">
      <name>Revocation of Access Tokens</name>
      <t>OAuth 2.0 allows deployment flexibility with respect to the style of
access tokens.  The access tokens may be self-contained (e.g. <xref target="RFC9068"/>) so that a
resource server needs no further interaction with an authorization
server issuing these tokens to perform an authorization decision of
the client requesting access to a protected resource.  A system
design may, however, instead use access tokens that are handles (also known as "reference tokens")
referring to authorization data stored at the authorization server.</t>
      <t>While these are not the only options, they illustrate the
implications for revocation.  In the latter case of reference tokens, the authorization
server is able to revoke an access token by removing it from storage. In the former case, without storing tokens, it may be impossible to revoke tokens without taking additional measures.</t>
      <t>For this reason, revocation of access tokens is optional in this specification, since it may pose too significant of a burden for implementers. It is not required to revoke access tokens to be able to return a success code to the caller.</t>
    </section>
    <section anchor="authorization-server-metadata">
      <name>Authorization Server Metadata</name>
      <t>The following authorization server metadata parameters <xref target="RFC8414"/> are introduced to signal the server's capability and policy with respect to Global Token Revocation.</t>
      <dl>
        <dt>"global_token_revocation_endpoint":</dt>
        <dd>
          <t>The URL of the authorization server's global token revocation endpoint.</t>
        </dd>
        <dt>"global_token_revocation_endpoint_auth_methods_supported":</dt>
        <dd>
          <t><bcp14>OPTIONAL</bcp14>. JSON array containing a list of client authentication methods supported by this introspection endpoint.  The valid client authentication method values are those registered in the IANA "OAuth Token Endpoint Authentication Methods" registry <xref target="IANA.oauth-parameters"/> or those registered in the IANA "OAuth Access Token Types" registry <xref target="IANA.oauth-parameters"/>.  (These values are and will remain distinct, due to Section 7.2.)  If omitted, the set of supported authentication methods <bcp14>MUST</bcp14> be determined by other means.</t>
        </dd>
      </dl>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="enumeration-of-user-accounts">
        <name>Enumeration of User Accounts</name>
        <t>Typically, an API that accepts a user identifier and returns different statuses depending on whether the user exists would provide an attack vector allowing enumeration of user accounts. This specification does require a "User Not Found" response, so would normally fall under this category. However, requests to the endpoint defined by this specification are required to be authenticated, so this is not considered a public endpoint.</t>
        <t>If the tool making the request is compromised, and the attacker can impersonate the requests from this tool (either by coercing the tool to make the request, or by extracting the credentials), then the attacker would be able to enumerate user accounts. However, since the request is not just testing the presence of a user account, but actually revoking the tokens associated with the user if successful, this would likely be easily visible in any audit logs as many users tokens would be revoked in a short period of time.</t>
        <t>To mitigate some of the concerns of providing such a powerful API endpoint, the users that a particular client can request revocation for <bcp14>SHOULD</bcp14> be limited, and the authentication of the request <bcp14>SHOULD</bcp14> be used to scope the possible user revocation list to only users authorized to the client.</t>
        <t>For example, a multi-tenant identity provider that uses different signing keys for users assciated with different tenants, can also use the same signing keys to authenticate revocation requests, such as creating a JWT to use as client authentication as described in <xref target="RFC7523"/>. This enables the authorization server receiving the request to only accept revocation requests for users that are associated with the particular tenant at the identity provider.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="oauth-authorization-server-metadata">
        <name>OAuth Authorization Server Metadata</name>
        <t>IANA has (TBD) registered the following values in the IANA "OAuth Authorization Server Metadata" registry of <xref target="IANA.oauth-parameters"/> established by <xref target="RFC8414"/>.</t>
        <t><strong>Metadata Name</strong>: <tt>global_token_revocation_endpoint</tt></t>
        <t><strong>Metadata Description</strong>: URL of the authorization server's global token revocation endpoint.</t>
        <t><strong>Change Controller</strong>: IESG</t>
        <t><strong>Specification Document</strong>: Section X of [[ this specification ]]</t>
        <t><strong>Metadata Name</strong>: <tt>global_token_revocation_endpoint_auth_methods_supported</tt></t>
        <t><strong>Metadata Description</strong>: <bcp14>OPTIONAL</bcp14>. Indicates the list of client authentication methods supported by this endpoint.</t>
        <t><strong>Change Controller</strong>: IESG</t>
        <t><strong>Specification Document</strong>: Section X of [[ this specification ]]</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="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="RFC9493">
          <front>
            <title>Subject Identifiers for Security Event Tokens</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="M. Scurtescu" initials="M." surname="Scurtescu"/>
            <author fullname="P. Jain" initials="P." surname="Jain"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>Security events communicated within Security Event Tokens may support a variety of identifiers to identify subjects related to the event. This specification formalizes the notion of Subject Identifiers as structured information that describes a subject and named formats that define the syntax and semantics for encoding Subject Identifiers as JSON objects. It also establishes a registry for defining and allocating names for such formats as well as the JSON Web Token (JWT) "sub_id" Claim.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9493"/>
          <seriesInfo name="DOI" value="10.17487/RFC9493"/>
        </reference>
        <reference anchor="IANA.oauth-parameters" target="http://www.iana.org/assignments/oauth-parameters">
          <front>
            <title>OAuth Parameters</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </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="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="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="RFC7523">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a means for requesting an OAuth 2.0 access token as well as for client authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7523"/>
          <seriesInfo name="DOI" value="10.17487/RFC7523"/>
        </reference>
        <reference anchor="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="OpenID" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0</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="2014" month="November"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 281?>

<section anchor="relationship-to-related-specifications">
      <name>Relationship to Related Specifications</name>
      <section anchor="rfc7009-token-revocation">
        <name>RFC7009: Token Revocation</name>
        <t>OAuth 2.0 Token Revocation <xref target="RFC7009"/> defines an endpoint for authorization servers that an OAuth client can use to notify the authorization server that a previously-obtained access or refresh token is no longer needed.</t>
        <t>The request is made by the OAuth client. The input to the Token Revocation request is the token itself, as well as the client's own authentication credentials.</t>
        <t>This differs from the Global Token Revocation endpoint which does not take a token as an input, but instead takes a user identifier as input. It is not called by OAuth clients, but is instead called by an external party such as a security monitoring tool or an identity provider that the user used to authenticate at the authorization server.</t>
      </section>
      <section anchor="openid-connect-front-channel-logout">
        <name>OpenID Connect Front-Channel Logout</name>
        <t><eref target="https://openid.net/specs/openid-connect-frontchannel-1_0.html">OpenID Connect Front-Channel Logout</eref> provides a mechanism for an OpenID Provider to log users out of Relying Parties by redirecting the user agent.</t>
        <t>While the logout request is the same direction as this draft describes, this relies on the redirection of the user agent, so is only applicable when the user is actively interacting with the application in a web browser.</t>
        <t>The Global Token Revocation request works regardless of whether the user is actively using the application, and is also applicable to non-web based applications.</t>
      </section>
      <section anchor="openid-connect-back-channel-logout">
        <name>OpenID Connect Back-Channel Logout</name>
        <t><eref target="https://openid.net/specs/openid-connect-backchannel-1_0.html">OpenID Connect Back-Channel Logout</eref> provides a mechanism for an OpenID Provider to log users out of a Relying Party by making a back-channel POST request containing the user identifier of the user to log out.</t>
        <t>This is the most similar existing logout specification to Global Token Revocation. However, there are still a few key differences that make it insufficient for the use cases enabled by Global Token Revocation.</t>
        <t>OpenID Connect Back-Channel Logout requires Relying Parties to clear state of any sessions for the user, but doesn't mention anything about access tokens. It also says that refresh tokens issued with the <tt>offline_access</tt> scope "<bcp14>SHOULD NOT</bcp14> be revoked". This is a concretely different outcome than is described by Global Token Revocation, which requires the revocation of all refresh tokens for the user regardless of whether the refresh token was issued with the <tt>offline_access</tt> scope.</t>
        <t>Additionally, OpenID Connect Back-Channel Logout assumes that the Relying Party implements OpenID Connect, which creates implementation challenges to use it when the Relying Party actually integrates with the identity provider using other specifications such as SAML.</t>
        <t>Global Token Revocation works regardless of the protocol that the user uses to authenticate, so works equally well with OpenID Connect and SAML integrations.</t>
      </section>
      <section anchor="shared-signals-framework">
        <name>Shared Signals Framework</name>
        <t>The Shared Signals Framework at the OpenID Foundation provides two specifications that have functionality related to session and token revocation.</t>
        <t><eref target="https://openid.net/specs/openid-caep-specification-1_0.html">Continuous Access Evaluation Profile (CAEP)</eref> defines several event types that can be sent between cooperating parties. In particular, the "Session Revoked" event can be sent from an identity provider to an authorization server when the user's session at the identity provider was revoked. The main difference between this and the Global Token Revocation request is that teh CAEP event is a signal that may or may not be acted upon by the receiver, whereas the Global Token Revocation request is a command that has a defined list of expected outcomes.</t>
        <t><eref target="https://openid.net/specs/openid-risc-profile-specification-1_0.html">Risk Incident Sharing and Coordination (RISC)</eref> defines events that have somewhat stronger defined meanings compared to CAEP. In particular, the "Account Disabled" event has clear meaning and strongly implies that a receiver should also disable the specified account. However, RISC also has a mechanism for a user to opt out of sending events for their account, so it does not provide the same level of assurance as a Global Token Revocation request.</t>
        <t>Lastly, it is more complex to set up a receiver for CAEP and RISC events compared to a receiver for the Global Token Revocation request, so if the receiver is only interested in supporting the revocation use cases, it is much simpler to support the single POST request described in this draft.</t>
      </section>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>(( To be removed from the final specification ))</t>
      <t>-02</t>
      <ul spacing="normal">
        <li>
          <t>Added security consideration around enumeration of user accounts</t>
        </li>
        <li>
          <t>Added an appendix describing the differences between this and related logout specifications</t>
        </li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Clarified revocation expectations</t>
        </li>
        <li>
          <t>Better definition of endpoint</t>
        </li>
        <li>
          <t>Added section defining endpoint in Authorization Server Metadata</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial Draft</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the following people for their contributions and reviews of this specification: George Fletcher, Karl McGuinness, Mike Jones.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9U823LbSHbv+IoO52Ekl0hLsmzZqs3uytfRxLIcSa7JlmvK
bgJNskcgmkEDohmX/yXfki/LuTXQIEFJ2dpK1e7DmgL6cu53zHA4TCpb5eZE
Dd7lbqxzde1uTKEuza1LdWVdMUjgXzN15epE+SpLksylhZ7DjqzUk2q40KVJ
b+zQ6bqaDad0yLDCQ4Zlc8hw/zDx9XhuvYe/qtUCtp+9uX6bFPV8bMqTJIM7
TpLUFd4UvvYnqiprk9yeqCcJnK8BvCuT1qWtVoNk6cqbaenqBTz9zYzVKVzs
SvtfdJP6WLrKpS4fJDdmBUuzk0QNFUGHPwgy1UKGz3I3dXWV3JqiBiCUesjh
SjEWg98AGltM1TvchM/n2ubwnG78qzXVZOTKKb7QZTqDF7OqWviTx49xHT6y
t2YUlj3GB4/HpVt685hOeIw7p7aa1WPYq3XpisXN4y1kxrU5UNJX0T2yZ8SH
jKzbtvvx/4Gho1k1ByokmsiDJIarlZrUec7CcYq3qo98Fr0D9HQhhDxRFzeV
pseG6UVQ/lXuHqVuTi+B4yeqi0i0IilcOYfzbolrl29fPTs+eiE/nx8dHMnP
F0cvnuDPs9MPpyPGCk4BKCtT+pMkscVk45yn+/LzeH8/HHn89PBJOHL/2XP8
ebEwxdnrE4JV9IgfqVeuKExawb+lUQejfV6iy6mpWowcrLXZqDDVY78wqZcH
w5Q3w7+lGR582Sdq0wmkJ+qDuzWoN+r5njrcPziiVw0r6H9DZQtQow8jdaVv
7LwudffFryP1stRZblbd5+cj9asrjO8+fTlSmVHnJjO2dGvvXo3UuSsrOwdg
kyQZDodKj31V6rRKki1GRZlCj3PjFTCisvCvr9OZ0l5p5UXP4fDUZqaoQKEK
PTVz/Fk5l4MgKQ0nfAP2FXD2GS7CDaCct7CjhFVwSpHBYaX5zxq0AZ/Alq4u
X5nylhfbIrNo5FQ105WylfIzV+cZWYkbo3QOd07gpVG1N+XPHu62vkKlJ7UA
qIuMrrKlnBHWwtMh8gUhxBu8GpsJSgQYwhoPKMxSDhkJ7eY2A64kyU/qrKhK
l9UpmanktFAXiEA/FngenC7wWLRwfoHWlFBnWLRsxHu1SnMLUI3UKfFg1dIT
NiD4d1w21yu1tH7GtANWA4y0ZxuBI0IKhGOTu2LKJARgSAzSGuwhgbpHFF3A
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

-->

</rfc>
