<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kasselman-oauth-spiffe-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>OAuth Client Registration on First Use with SPIFFE</title>
    <seriesInfo name="Internet-Draft" value="draft-kasselman-oauth-spiffe-00"/>
    <author fullname="Pieter Kasselman">
      <organization>SPIRL</organization>
      <address>
        <email>pieter@spirl.com</email>
      </address>
    </author>
    <author fullname="Dag Sneeggen">
      <organization>Signicat</organization>
      <address>
        <email>dagsne@signicat.com</email>
      </address>
    </author>
    <date year="2025" month="June" day="20"/>
    <area>AREA</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>workload</keyword>
    <keyword>identity</keyword>
    <keyword>credential</keyword>
    <keyword>client</keyword>
    <keyword>registration</keyword>
    <abstract>
      <?line 76?>

<t>The OAuth framework is a widely deployed authorization protocol standard that enables applications to obtain limited access to user resources. OAuth clients must be registered with the OAuth authorization server, which poses significant operational challenges in dynamically scaling environments. The Secure Production Identity Framework For Everyone (SPIFFE) is a graduated Cloud Native Compute Foundation project designed to dynamically attest and verify workload identity. This draft describes how workloads with SPIFFE credentials can be used with OAuth to lessen the operational burden of client registration through a "register on first use" principle.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://PieterKas.github.io/OAuth-and-SPIFFE/draft-kasselman-oauth_spiffe.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kasselman-oauth-spiffe/"/>.
      </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/PieterKas/OAuth-and-SPIFFE"/>.</t>
    </note>
  </front>
  <middle>
    <?line 80?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The OAuth framework <xref target="RFC6749"/> is popular and broadly deployed. It defines separate roles for the authorization server, resource server, resource owner and the client. In OAuth, the client requests access to resources controlled by the resource owner and hosted by the resource server, and is issued a different set of credentials than those of the resource owner <xref target="RFC6749"/>. The OAuth client is identified with a client identifier and supports multiple authentication methods, such as the commonly-used client secret. The management of client identifiers and client secrets represents operational challenges, including manual registrations, lifecycle management and the increasing burden of managing client secrets used for authenticating OAuth clients. Modern cloud-native architectural patterns, like micro-services and other ephemeral compute concepts, allows for on-demand scaling of OAuth clients, which in turn increases the burden on managing the lifecycle of the client and client secrets.</t>
      <t>The Secure Production Identity Production Framework (SPIFFE) is a graduated project in the Cloud Native Compute Foundation (CNCF) that defines a standard for managing the identity lifecycle of workloads in modern cloud-native compute environments. It is designed to dynamically attest and verify a workloads, assign identifiers, issue credentials and manage the lifecycle of those credentials in dynamically scaled environments without manual intervention. The identifier is an URI, while the credentials include profiles of JWT and X.509 certificates, known as JWT-SVID and X.509-SVIDs. These credentials are used by workloads to authenticate to each other or to services that they need to access. SPIFFE is commonly used to secure workload identities in large-scale production systems that need to scale dynamically.</t>
      <t>Workloads provisioned with SPIFFE identifiers and credentials often need to access OAuth-protected resources. When they interact with OAuth-protected resources, they assume the role of an OAuth client and need to be registered with the OAuth authorization server. This requries an additional manual step, or an additional registration flow (e.g. Dynamic Client Registration <xref target="RFC7591"/> ). The registration step results in the provisioning of an addditional identifier (the client identifier), and frequently an additional secret (the Client Secret) used for client authentication and must be secured. The additional secrets add to the overall challenge of secrets sprawl in large-scale environments, and degrade the risk profile for an environment.</t>
      <t>OAuth deployments in which SPIFFE is already deployed can leverage the SPIFFE identifiers and credentials already issued to workloads by establishing a trust relationship with the SPIFFE issuer. When a workload acts as an OAuth client, it presents a SPIFFE credential to authenticate itself to the OAuth server. The OAuth authorization server verifies the JWT or X.509 certificate, ensuring it was issued by a trusted issuer. The authorization server registers the SPIFFE ID as a client identifier, along with additional metadata, if needed, before issuing an Access Token.</t>
      <t>This "register on first use" pattern removes the need for manual pre-registration or additional roundtrips and credential registration. It leverages existing credentials that were issued dynamically and reduces the dependence on static secrets which are at higher risk of compromise than ephemeral dynamic credentials.</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="client-registration-on-first-use">
      <name>Client Registration On First Use</name>
      <t>The SPIFFE deployment is responsible for bootstrapping the identifiers and credentials used by workloads in an environment. The SPIFFE deployment dynamically attests workloads, issues identifiers, provisions ephemeral credentials, and rotates those credentials. The attestation techniques used by a SPIFFE issuer is deployment-specific. SPIFFE supports multiple credential formats, including JWT-SVID <xref target="SPIFFE_JWT"/> and JWT-X.509 <xref target="SPIFFE_X509"/>. Workloads can use these credentials with any protocol that is compatible with these credential types to authenticate themselves. The use of SPIFFE credentials to authenticate to an OAuth authorization server is described in <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/>.</t>
      <t>An OAuth deployment leverages the SPIFFE identifiers and credentials already issued to workloads by establishing a trust relationship with the SPIFFE issuer. As a result, the OAuth authorization server is able to verify any credential issued for a specific SPIFFE trust domain when it is presented to the OAuth authorization server. This assures the OAuth authorization server that the workload was attested and verified in acccordance with the SPIFFE issuer's policies. In addition, it is assured that the identifier was correctly assigned to the workload, and that the lifecycle of the credentials and the underlying keys are managed in accordance with the SPIFFE issuer's policies.</t>
      <t>The OAuth authorization server avoids operational overheads of registering the client and client secrets by accepting SPIFFE credentials from a workload acting as an OAuth client. The credentials must be signed by a trusted issuer. If this is the first time the authorization server verifies a credential with a specific SPIFFE ID, it registers a new client, removing the need for an out-of-band registration flow. The OAuth authorization server may derive a unique client identifier from the SPIFFE ID, or it may use the SPIFFE ID as the client identifier. Since the workload is already in possession of a credential that is cryptographically bound to its identifier, no addditional client secret is needed, removing the operational overhead and security risks of managing long-lived secrets in large-scale deployments that already have SPIFFE credentials. The OAuth authorization server may register additional metadata if needed. The authorization server may use a number of mechanissms for obtaining additional metadata. Metadata may be preconfigured, automatically created, retrieved from a configuration management system, or retrieved from the JWT-SVID, if it was included as additional claims, similar to how Dynamic Client Registration (<xref target="RFC7591"/>) describes how a software statement may be used to convey metadata.</t>
      <t>"Register on first use" varies depending whether or not the OAuth flows includes redirection. In non-redirecting flows (such as Client Credentials or Resource Owner Password Credentials), the OAuth client authenticates and requests tokens directly from the authorization server without the need for user redirection. Flows with redirection (like Authorization Code Flow) temporarily send users to an external identity provider before returning them to the application with a token or authorization code, which is then used by the OAuth client. These redirect-based flows rely on the user agent (typically a web browser) to maintain the authentication context and handle the navigation between the application and the identity provider. These differences require distinct implementation considerations when implementing client registration on first use. Redirecting flows need state management to reconnect returning users with their original session after authentication, while non-redirecting flows can create a client identifier inline within the same request context. Properly handling both OAuth patterns ensures a smooth registration experience regardless of the authentication method selected.</t>
      <section anchor="client-registration-on-first-use-for-non-redirecting-oauth-flows">
        <name>Client Registration On First Use for Non-Redirecting OAuth Flows</name>
        <t>In OAuth flows where there is no redirection, the client initiates interaction with the authorization server and accesses the token endpoint directly without any preceding redirects. Examples include the Client Credentials (see Section 4.4 of <xref target="RFC6749"/>) and Resource Owner Password Credentials (see Section 4.3 of <xref target="RFC6749"/>).</t>
        <t>The diagram below shows the process for "register on first use" in the Client Credential flow.</t>
        <figure>
          <name>Client Registration on First Use: Client Credentials Grant</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="368" width="456" viewBox="0 0 456 368" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
                <path d="M 8,160 L 8,240" fill="none" stroke="black"/>
                <path d="M 64,88 L 64,152" fill="none" stroke="black"/>
                <path d="M 64,240 L 64,320" fill="none" stroke="black"/>
                <path d="M 120,32 L 120,80" fill="none" stroke="black"/>
                <path d="M 120,160 L 120,240" fill="none" stroke="black"/>
                <path d="M 336,160 L 336,240" fill="none" stroke="black"/>
                <path d="M 336,288 L 336,352" fill="none" stroke="black"/>
                <path d="M 384,64 L 384,152" fill="none" stroke="black"/>
                <path d="M 448,160 L 448,240" fill="none" stroke="black"/>
                <path d="M 448,288 L 448,352" fill="none" stroke="black"/>
                <path d="M 8,32 L 120,32" fill="none" stroke="black"/>
                <path d="M 128,64 L 384,64" fill="none" stroke="black"/>
                <path d="M 8,80 L 120,80" fill="none" stroke="black"/>
                <path d="M 8,160 L 120,160" fill="none" stroke="black"/>
                <path d="M 336,160 L 448,160" fill="none" stroke="black"/>
                <path d="M 120,176 L 328,176" fill="none" stroke="black"/>
                <path d="M 128,224 L 336,224" fill="none" stroke="black"/>
                <path d="M 8,240 L 120,240" fill="none" stroke="black"/>
                <path d="M 336,240 L 448,240" fill="none" stroke="black"/>
                <path d="M 336,288 L 448,288" fill="none" stroke="black"/>
                <path d="M 64,320 L 328,320" fill="none" stroke="black"/>
                <path d="M 336,352 L 448,352" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,152 380,146.4 380,157.6" fill="black" transform="rotate(90,384,152)"/>
                <polygon class="arrowhead" points="336,320 324,314.4 324,325.6" fill="black" transform="rotate(0,328,320)"/>
                <polygon class="arrowhead" points="336,176 324,170.4 324,181.6" fill="black" transform="rotate(0,328,176)"/>
                <polygon class="arrowhead" points="136,224 124,218.4 124,229.6" fill="black" transform="rotate(180,128,224)"/>
                <polygon class="arrowhead" points="136,64 124,58.4 124,69.6" fill="black" transform="rotate(180,128,64)"/>
                <polygon class="arrowhead" points="72,152 60,146.4 60,157.6" fill="black" transform="rotate(90,64,152)"/>
                <polygon class="arrowhead" points="72,88 60,82.4 60,93.6" fill="black" transform="rotate(270,64,88)"/>
                <g class="text">
                  <text x="144" y="36">(A)</text>
                  <text x="216" y="36">Authorization</text>
                  <text x="300" y="36">Server</text>
                  <text x="376" y="36">Establishes</text>
                  <text x="60" y="52">SPIFFE</text>
                  <text x="184" y="52">Trust</text>
                  <text x="228" y="52">with</text>
                  <text x="276" y="52">SPIFFE</text>
                  <text x="332" y="52">Issuer</text>
                  <text x="60" y="68">Issuer</text>
                  <text x="88" y="116">(B)</text>
                  <text x="132" y="116">SPIFFE</text>
                  <text x="188" y="116">Issuer</text>
                  <text x="248" y="116">Attests</text>
                  <text x="316" y="116">Workload</text>
                  <text x="120" y="132">and</text>
                  <text x="180" y="132">Provisions</text>
                  <text x="272" y="132">Credentials</text>
                  <text x="60" y="180">Workload</text>
                  <text x="52" y="196">acting</text>
                  <text x="92" y="196">as</text>
                  <text x="144" y="196">(C)</text>
                  <text x="216" y="196">Authorization</text>
                  <text x="392" y="196">Authorization</text>
                  <text x="56" y="212">OAuth</text>
                  <text x="192" y="212">Request</text>
                  <text x="388" y="212">Server</text>
                  <text x="60" y="228">Client</text>
                  <text x="144" y="244">(D)</text>
                  <text x="216" y="244">Authorization</text>
                  <text x="196" y="260">Response</text>
                  <text x="388" y="308">Resource</text>
                  <text x="388" y="324">Server</text>
                  <text x="80" y="340">(E)</text>
                  <text x="124" y="340">Access</text>
                  <text x="188" y="340">Resource</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------------+ (A) Authorization Server Establishes
|   SPIFFE    |     Trust with SPIFFE Issuer
|   Issuer    |<-------------------------------+
+-------------+                                |
       ^                                       |
       | (B) SPIFFE Issuer Attests Workload    |
       |     and Provisions Credentials        |
       V                                       V
+-------------+                          +-------------+
|  Workload   +------------------------->|             |
|  acting as  | (C) Authorization        |Authorization|
|   OAuth     |     Request              |   Server    |
|   Client    |<-------------------------+             |
+------+------+ (D) Authorization        +-------------+
       |            Response
       |
       |                                 +-------------+
       |                                 |  Resource   |
       +-------------------------------->|   Server    |
        (E) Access Resource              |             |
                                         +-------------+
]]></artwork>
          </artset>
        </figure>
        <ul spacing="normal">
          <li>
            <t>(A) The OAuth authorization server establishes a trust relationship with the SPIFFE Issuer. Once trust is established, the OAuth authorization server accepts credentials issued by the SPIFFE Issuer.</t>
          </li>
          <li>
            <t>(B) The workload is attested and credentialed by the SPIFFE Issuer <xref target="SPIFFE"/>. The SPIFFE Issuer assigns a SPIFFE ID <xref target="SPIFFE_ID"/> as an identifier for the workload, along with SPIFFE credentials (e.g. JWT-SVID <xref target="SPIFFE_JWT"/>, X.509-SVID <xref target="SPIFFE_X509"/> or other SPIFFE credential types).</t>
          </li>
          <li>
            <t>(C) The workload, acting as an OAuth client, makes a request to the authorization server's token endpoint as specified in Section 4.4 of <xref target="RFC6749"/>. It authenticates itself using either a JWT-SVID or X.509-SVID as defined in <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/></t>
          </li>
          <li>
            <t>(D) The OAuth authorization server authenticates the workload acting as an OAuth client by verifying the credentials it presented (see <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/>). If the authentication is successful, the authorization server accepts the SPIFFE ID as a valid client identifier and checks if it has been registered previously. If it has not been registered, it registers the new SPIFFE ID as a valid client. The authorization server adds additional metadata if needed, before completing the request and returning an access token.</t>
          </li>
          <li>
            <t>(E) The Oauth client use the access token it retrieved in the previous step and use it to acccess the resource server.</t>
          </li>
        </ul>
      </section>
      <section anchor="client-registration-on-first-use-for-redirecting-oauth-flows">
        <name>Client Registration On First Use for Redirecting OAuth Flows</name>
        <t>In OAuth flows that rely on redirection, the initial interaction with the authorization server is not performed by the client, but is instead performed by another component, such as the user agent. These flows typically include interaction with the Resource Owner in order to perform user authentication and grant authorization. Once the Resource Owner authenticated and granted authorization, the flow is redirected back to the client. The client then interacts with the authorization server token endpoint to complete the flow and obtain tokens. Examples include the Authorization Grant Flow (see Section 4.1 of <xref target="RFC6749"/>).</t>
        <figure>
          <name>Client Registration on First Use: Authorization Code Grant</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="576" width="544" viewBox="0 0 544 576" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 16,64 L 16,96" fill="none" stroke="black"/>
                <path d="M 16,128 L 16,512" fill="none" stroke="black"/>
                <path d="M 48,32 L 48,80" fill="none" stroke="black"/>
                <path d="M 48,160 L 48,224" fill="none" stroke="black"/>
                <path d="M 48,288 L 48,384" fill="none" stroke="black"/>
                <path d="M 48,464 L 48,544" fill="none" stroke="black"/>
                <path d="M 64,392 L 64,416" fill="none" stroke="black"/>
                <path d="M 88,232 L 88,256" fill="none" stroke="black"/>
                <path d="M 104,384 L 104,400" fill="none" stroke="black"/>
                <path d="M 104,432 L 104,456" fill="none" stroke="black"/>
                <path d="M 128,464 L 128,544" fill="none" stroke="black"/>
                <path d="M 136,160 L 136,224" fill="none" stroke="black"/>
                <path d="M 136,288 L 136,384" fill="none" stroke="black"/>
                <path d="M 160,32 L 160,80" fill="none" stroke="black"/>
                <path d="M 408,288 L 408,384" fill="none" stroke="black"/>
                <path d="M 440,392 L 440,480" fill="none" stroke="black"/>
                <path d="M 472,64 L 472,280" fill="none" stroke="black"/>
                <path d="M 472,392 L 472,528" fill="none" stroke="black"/>
                <path d="M 536,288 L 536,384" fill="none" stroke="black"/>
                <path d="M 48,32 L 160,32" fill="none" stroke="black"/>
                <path d="M 16,64 L 40,64" fill="none" stroke="black"/>
                <path d="M 168,64 L 472,64" fill="none" stroke="black"/>
                <path d="M 48,80 L 160,80" fill="none" stroke="black"/>
                <path d="M 48,160 L 136,160" fill="none" stroke="black"/>
                <path d="M 48,224 L 136,224" fill="none" stroke="black"/>
                <path d="M 48,288 L 136,288" fill="none" stroke="black"/>
                <path d="M 408,288 L 536,288" fill="none" stroke="black"/>
                <path d="M 136,304 L 176,304" fill="none" stroke="black"/>
                <path d="M 192,304 L 208,304" fill="none" stroke="black"/>
                <path d="M 368,304 L 400,304" fill="none" stroke="black"/>
                <path d="M 136,336 L 176,336" fill="none" stroke="black"/>
                <path d="M 192,336 L 208,336" fill="none" stroke="black"/>
                <path d="M 376,336 L 400,336" fill="none" stroke="black"/>
                <path d="M 144,368 L 184,368" fill="none" stroke="black"/>
                <path d="M 200,368 L 216,368" fill="none" stroke="black"/>
                <path d="M 384,368 L 408,368" fill="none" stroke="black"/>
                <path d="M 48,384 L 136,384" fill="none" stroke="black"/>
                <path d="M 408,384 L 536,384" fill="none" stroke="black"/>
                <path d="M 48,464 L 128,464" fill="none" stroke="black"/>
                <path d="M 136,480 L 168,480" fill="none" stroke="black"/>
                <path d="M 184,480 L 200,480" fill="none" stroke="black"/>
                <path d="M 368,480 L 440,480" fill="none" stroke="black"/>
                <path d="M 16,512 L 40,512" fill="none" stroke="black"/>
                <path d="M 136,528 L 168,528" fill="none" stroke="black"/>
                <path d="M 184,528 L 224,528" fill="none" stroke="black"/>
                <path d="M 344,528 L 472,528" fill="none" stroke="black"/>
                <path d="M 48,544 L 128,544" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="480,280 468,274.4 468,285.6" fill="black" transform="rotate(90,472,280)"/>
                <polygon class="arrowhead" points="448,392 436,386.4 436,397.6" fill="black" transform="rotate(270,440,392)"/>
                <polygon class="arrowhead" points="408,336 396,330.4 396,341.6" fill="black" transform="rotate(0,400,336)"/>
                <polygon class="arrowhead" points="408,304 396,298.4 396,309.6" fill="black" transform="rotate(0,400,304)"/>
                <polygon class="arrowhead" points="176,64 164,58.4 164,69.6" fill="black" transform="rotate(180,168,64)"/>
                <polygon class="arrowhead" points="152,368 140,362.4 140,373.6" fill="black" transform="rotate(180,144,368)"/>
                <polygon class="arrowhead" points="144,528 132,522.4 132,533.6" fill="black" transform="rotate(180,136,528)"/>
                <polygon class="arrowhead" points="112,456 100,450.4 100,461.6" fill="black" transform="rotate(90,104,456)"/>
                <polygon class="arrowhead" points="96,232 84,226.4 84,237.6" fill="black" transform="rotate(270,88,232)"/>
                <polygon class="arrowhead" points="72,392 60,386.4 60,397.6" fill="black" transform="rotate(270,64,392)"/>
                <polygon class="arrowhead" points="48,512 36,506.4 36,517.6" fill="black" transform="rotate(0,40,512)"/>
                <polygon class="arrowhead" points="48,64 36,58.4 36,69.6" fill="black" transform="rotate(0,40,64)"/>
                <g class="text">
                  <text x="184" y="36">(A)</text>
                  <text x="256" y="36">Authorization</text>
                  <text x="340" y="36">Server</text>
                  <text x="416" y="36">Establishes</text>
                  <text x="100" y="52">SPIFFE</text>
                  <text x="224" y="52">Trust</text>
                  <text x="268" y="52">with</text>
                  <text x="316" y="52">SPIFFE</text>
                  <text x="372" y="52">Issuer</text>
                  <text x="100" y="68">Issuer</text>
                  <text x="16" y="116">(B)</text>
                  <text x="60" y="116">SPIFFE</text>
                  <text x="116" y="116">Issuer</text>
                  <text x="176" y="116">Attests</text>
                  <text x="244" y="116">Workload</text>
                  <text x="56" y="132">and</text>
                  <text x="116" y="132">Provisions</text>
                  <text x="208" y="132">Credentials</text>
                  <text x="92" y="180">Resource</text>
                  <text x="96" y="196">Owner</text>
                  <text x="88" y="276">(D)</text>
                  <text x="244" y="292">Client</text>
                  <text x="316" y="292">Identifier</text>
                  <text x="184" y="308">C</text>
                  <text x="224" y="308">&amp;</text>
                  <text x="280" y="308">Redirection</text>
                  <text x="344" y="308">URI</text>
                  <text x="84" y="324">User</text>
                  <text x="472" y="324">Authorization</text>
                  <text x="88" y="340">Agent</text>
                  <text x="184" y="340">D</text>
                  <text x="236" y="340">User</text>
                  <text x="312" y="340">authenticates</text>
                  <text x="476" y="340">Server</text>
                  <text x="192" y="372">E</text>
                  <text x="280" y="372">Authorization</text>
                  <text x="356" y="372">Code</text>
                  <text x="104" y="420">(D)</text>
                  <text x="64" y="436">(C)</text>
                  <text x="64" y="452">|</text>
                  <text x="176" y="484">F</text>
                  <text x="264" y="484">Authorization</text>
                  <text x="340" y="484">Code</text>
                  <text x="92" y="500">Client</text>
                  <text x="216" y="500">&amp;</text>
                  <text x="272" y="500">Redirection</text>
                  <text x="336" y="500">URI</text>
                  <text x="176" y="532">G</text>
                  <text x="260" y="532">Access</text>
                  <text x="312" y="532">Token</text>
                  <text x="200" y="548">(w/</text>
                  <text x="252" y="548">Optional</text>
                  <text x="320" y="548">Refresh</text>
                  <text x="380" y="548">Token)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
     +-------------+ (A) Authorization Server Establishes
     |   SPIFFE    |     Trust with SPIFFE Issuer
 +-->|   Issuer    |<-------------------------------------+
 |   +-------------+                                      |
 |                                                        |
(B) SPIFFE Issuer Attests Workload                        |
 |   and Provisions Credentials                           |
 |                                                        |
 |   +----------+                                         |
 |   | Resource |                                         |
 |   |   Owner  |                                         |
 |   |          |                                         |
 |   +----------+                                         |
 |        ^                                               |
 |        |                                               |
 |       (D)                                              V
 |   +----+-----+          Client Identifier      +---------------+
 |   |          +----(C)-- & Redirection URI ---->|               |
 |   |  User    |                                 | Authorization |
 |   |  Agent   +----(D)-- User authenticates --->|     Server    |
 |   |          |                                 |               |
 |   |          |<----(E)-- Authorization Code ---+               |
 |   +------+---+                                 +---+-----------+
 |     ^    |                                         ^   |
 |     |   (D)                                        |   |
 |    (C)   |                                         |   |
 |     |    v                                         |   |
 |   +---------+                                      |   |
 |   |         |----(F)-- Authorization Code ---------'   |
 |   |  Client |          & Redirection URI               |
 +-->|         |                                          |
     |         |<---(G)----- Access Token ----------------'
     +---------+       (w/ Optional Refresh Token)

]]></artwork>
          </artset>
        </figure>
        <ul spacing="normal">
          <li>
            <t>(A) The OAuth authorization server establishes a trust relationship with the SPIFFE Issuer. Once trust is established, the OAuth authorization server accepts credentials issued by the SPIFFE Issuer.</t>
          </li>
          <li>
            <t>(B) The workload is attested and credentialed by the SPIFFE Issuer <xref target="SPIFFE"/>. The SPIFFE Issuer assigns a SPIFFE ID <xref target="SPIFFE_ID"/> as an identifier for the workload, along with SPIFFE credentials (e.g. JWT-SVID <xref target="SPIFFE_JWT"/> and X.509-SVID <xref target="SPIFFE_X509"/>).</t>
          </li>
          <li>
            <t>(C) The client initiates the flow by directing the resource owner's user agent to the authorization endpoint. The client includes its client identifier, requested scope, local state, and a redirection URI to which the authorization server will send the user agent back once access is granted (or denied).</t>
          </li>
          <li>
            <t>(D) The authorization server authenticates the resource owner (via the user agent) and establishes whether the resource owner grants or denies the client's access request. If the client identifier (<tt>client_id</tt>) is a SPIFFE ID, it registers the SPIFFE ID as the client identifier and register additional metadata, including a redirection URI (<tt>redirect_uri</tt>). The additional metadata may be obtained from configuration servers or other out-of-band mechanisms that is trusted by the authorization server.</t>
          </li>
          <li>
            <t>(E)  Assuming the resource owner grants access, the authorization server redirects the user agent back to the client using the redirection URI provided earlier (in the request or during client registration).  The redirection URI includes an authorization code and any local state provided by the client earlier.</t>
          </li>
          <li>
            <t>(F)  The client requests an access token from the authorization server's token endpoint by including the authorization code received in the previous step.  When making the request, the client authenticates with the authorization server. It authenticates itself using either a JWT-SVID or X.509-SVID as defined in <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/>. The client includes the redirection URI used to obtain the authorization code for verification.</t>
          </li>
          <li>
            <t>(G)  The authorization server authenticates the client, validates the authorization code, and ensures that the redirection URI received matches the URI used to redirect the client in step (E). If valid, the authorization server responds back with an access token and, optionally, a refresh token.</t>
          </li>
        </ul>
      </section>
      <section anchor="client-registration-error-response">
        <name>Client Registration Error Response</name>
        <t>When the registration attempt has failed or been rejected, the authorization server <bcp14>MUST</bcp14> return an error response that conforms to the expected error response for the given OAuth 2.0 endpoint. Additional error information may or may not be included in the error response.</t>
        <t>TODO: Generally improve error section, inline with RFC 6749. Consider also how to return information which can aid the workload or workload owners to resolve failed registration or complete an incomplete registration.</t>
        <section anchor="authentication-failed">
          <name>Authentication Failed</name>
          <t>When a SPIFFE credential is missing, invalid, or for any reason rejected, the authorization server returns an error response with an HTTP 401 status code.</t>
        </section>
        <section anchor="failed-registration">
          <name>Failed Registration</name>
          <t>When a request to register a client fails due to disallowed metadata (e.g., http redirect URIs if only https is allowed, or an access token lifetime exceeding maximum allowed) or invalid metadata, the authorization server returns an error response with an HTTP 400 status code.</t>
        </section>
        <section anchor="incomplete-registration">
          <name>Incomplete Registration</name>
          <t>When additional post-registration setup is required, there can be cases where the client cannot be used. In such scenarios, the authorization server returns an error response with an HTTP 403 status code. This error could also be returned in cases where there is an asynchronous event or manual operation that is not yet completed.</t>
        </section>
      </section>
    </section>
    <section anchor="spiffe-and-oauth-trust-relationship">
      <name>SPIFFE and OAuth Trust Relationship</name>
      <t>SPIFFE makes provision for multiple Trust Domains, which are represented in the workload identifier. Trust Domains offers additional segmentation withing a SPIFFE deployment and each Trust Domain has its own keys for signing credentials. The OAuth authorization server may choose to trust one or more trust domains as defined in <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/>.</t>
      <section anchor="client-authentication">
        <name>Client Authentication</name>
        <t>The client <bcp14>MUST</bcp14> authenticate itself using either a JWT-SVID or X.509-SVID as defined in <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/>.</t>
      </section>
      <section anchor="authorization-server-processing">
        <name>Authorization Server Processing</name>
        <t>When presented with a SPIFFE ID that is used as a client identifier, the authorization server <bcp14>SHOULD</bcp14> register it as a valid client identifier. There are two cases:</t>
        <section anchor="non-redirect-flows">
          <name>Non-redirect flows</name>
          <t>In non-redirect flows, the client is intereacting directly with the token endpoint. The authorization server <bcp14>MUST</bcp14> authenticate the client as described in JWT-SVID or X.509-SVID as defined in <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/>. If the JWT-SVID or X.509-SVID used to authenticate the client was issued by a trusted SPIFFE issuer, and the authentication succeeds, the SPIFFE ID <bcp14>SHOULD</bcp14> be registered as the client identifier.</t>
        </section>
        <section anchor="redirect-flows">
          <name>Redirect flows</name>
          <t>Redirect flows typically require interaction with the Resource Owner to perform user authentication. In redirect flows, another component such as the user agent, interacts with the authorization server and relies on a redirection back to the client. Since the client does not interact directly with the authorization server in this initial interaction, it is not in a position to authenticate itself using a JWT-SVID or X.509-SVID. The user agent includes a client identifier (the SPIFFE ID) which the authorization server registers as a new client after obtaining additional metadata. The metadata may be derived from the SPIFFE ID, or it may be retrieved from a configuration server. Details of obtaining the additional metadata is implementation-specific and beyond the scope of this document. If one or more redirection URIs are obtained from another source, it <bcp14>MUST</bcp14> be the same as that presented by the user agent.</t>
          <t>Following the redirect back to the client, the client must authenticate to the authorization server as described in JWT-SVID or X.509-SVID as defined in <xref target="SPIFFE-OAUTH-CLIENT-AUTH"/>. If the authentication fails, or the SPIFFE ID in the JWT-SVID or X.509-SVID does not match the client identifier, the request should be denied and the authorization server <bcp14>MAY</bcp14> de-register the client identifier used. If the authentication succeeds, it confirms that the client was issued a credential by a trusted SPIFFE issuer and the authorization server issues the requested tokens.</t>
        </section>
      </section>
    </section>
    <section anchor="additional-metadata">
      <name>Additional metadata</name>
      <t>Additional metadata may be required when a new client is first registered. The OAuth 2.0 Dynamic Client Registration Protocol <xref target="RFC7591"/> defines client metadata that may be used. If required, client metadata <bcp14>SHOULD</bcp14> be added at the time of registration. Metadata may be dynamically generated or derived at the time of registration, or it may be retrieved from a system of record using the SPIFFE ID to locate the metadata in an enterprise environment.</t>
      <section anchor="metadata-as-claims-in-the-jwt-svid">
        <name>Metadata as claims in the JWT-SVID</name>
        <t>A SPIFFE issuer <bcp14>MAY</bcp14> include additional metadata as claims in the JWT-SVID, similar to how it may be included in a software statement as defined in the OAuth 2.0 Dynamic Registration Protocol <xref target="RFC7591"/>. If the additional metadata claims are used, the claims in the JWT-SVID should be processed in accordance with <xref target="RFC7591"/> as if they were included in a software statement.</t>
      </section>
      <section anchor="the-redirect-uri">
        <name>The redirect URI</name>
        <t>Flows that depend on redirection requires that a redirect URI is registered along with every client identifier. Another component, like a user agent, may contact the authorization server, before being redirected to the client. In order to avoid attacks such as cross-site request forgery, open redirector attacks and similar attacck described in OAuth 2.0 Threat Model and Security Considerations <xref target="RFC6819"/> and OAuth 2.0 Security Best Current Practice <xref target="RFC9700"/>, the <tt>redirect_uri</tt> <bcp14>MUST</bcp14> be provisioned from a trustworthy source if it is required.</t>
      </section>
      <section anchor="scopes">
        <name>Scopes</name>
        <t>An authorization server <bcp14>MAY</bcp14> register a client with a default set of scopes or retrieve client-specific scopes from a system of record, such as a configuration management system. Details of how to retrieve additional scope data is out of scope for this document.</t>
      </section>
      <section anchor="grant-types">
        <name>Grant Types</name>
        <t>Authorization servers <bcp14>MAY</bcp14> choose to limit the grant types for which the "register on first use" pattern is supported. This may be recorded as the "grant_type" metadata field.</t>
      </section>
    </section>
    <section anchor="post-registration-client-lifecycle-management">
      <name>Post-Registration Client Lifecycle Management</name>
      <t>After registration, there <bcp14>MUST</bcp14> be an initial client record with a direct link between the SPIFFE identifier in the SPIFFE credentials and the OAuth client identifier. However, additional steps <bcp14>MAY</bcp14> be required to make the client operational, such as missing configuration or entitlement information. This is particularly relevant for complex enterprise environments.</t>
      <section anchor="configuration">
        <name>Configuration</name>
        <t>After registration, a client <bcp14>MUST</bcp14> be configured with the necessary operational metadata to function correctly and securely. An authorization server may use a number of mechanisms for obtaining metadata. Metadata may be statically preconfigured, automatically or manually created, or retrieved from a configuration management system. This can happen instantaneously after registration or it can be asynchronous. If metadata is added asynchronously, the authorization server <bcp14>MUST</bcp14> return an "Incomplete Registration" error whenever the client interacts with the authorization server, until the additional metadata has been added.</t>
      </section>
      <section anchor="entitlement">
        <name>Entitlement</name>
        <t>Entitlement defines the specific permissions and/or access rights granted to the client. This is a critical stage that determines what the configured client is permitted to do and request. Entitlements can include; grant types, scopes, audience restrictions, or fine-grained permissions.</t>
        <t>In enterprise environments, the permissions and access rights granted to a client can be highly dynamic and complex. As such, there might be several out-of-band operations; creating a principal for the client, assigning permissions and roles to the client in a PRP system, assigning attributes to the workload, or any other mechanism used for making access rights evaluations.</t>
      </section>
      <section anchor="updates">
        <name>Updates</name>
        <t>Updates to client configuration or entitlement may occur using the same "register on first use" mechanism and can even be entirely opaque to the workload. However, special care must be taken to ensure this happens securely and in line with organizational policies.</t>
      </section>
      <section anchor="deregistration">
        <name>Deregistration</name>
        <t>An authorization server <bcp14>MAY</bcp14> automatically expire clients. This avoids a large number of unused clients identifiers from accumulating. If a client identifier is deleted, it can re-register using the "register-on-first-use" pattern described in this document.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO: Security. Consider discussing error responses (include enough info to be helpful, but not too much to aid attackers.)</t>
      <section anchor="entitlement-updates">
        <name>Entitlement Updates</name>
        <t>If entitlement updates, such as client permissions, can be updated dynamically, be aware that this can lead to potential privilege escalation if a workload is compromised. Similarly, adding new redirects to an existing client can also lead to potential issues. The implementer needs to make clear decisions on whether updates to clients are allowed and, if so, what types of updates are permitted. Risk analysis could also be introduced to determine what types of client updates are allowed.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC6755">
          <front>
            <title>An IETF URN Sub-Namespace for OAuth</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This document establishes an IETF URN Sub-namespace for use with OAuth-related specifications. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6755"/>
          <seriesInfo name="DOI" value="10.17487/RFC6755"/>
        </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="RFC7521">
          <front>
            <title>Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="Y. Goland" initials="Y." surname="Goland"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification provides a framework for the use of assertions with OAuth 2.0 in the form of a new client authentication mechanism and a new authorization grant type. Mechanisms are specified for transporting assertions during interactions with a token endpoint; general processing rules are also specified.</t>
              <t>The intent of this specification is to provide a common framework for OAuth 2.0 to interwork with other identity systems using assertions and to provide alternative client authentication mechanisms.</t>
              <t>Note that this specification only defines abstract message flows and processing rules. In order to be implementable, companion specifications are necessary to provide the corresponding concrete instantiations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7521"/>
          <seriesInfo name="DOI" value="10.17487/RFC7521"/>
        </reference>
        <reference anchor="RFC7523">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a means for requesting an OAuth 2.0 access token as well as for client authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7523"/>
          <seriesInfo name="DOI" value="10.17487/RFC7523"/>
        </reference>
        <reference anchor="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="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="SPIFFE" target="https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE.md">
          <front>
            <title>SPIFFE</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SPIFFE_ID" target="https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE-ID.md">
          <front>
            <title>SPIFFE-ID</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SPIFFE_X509" target="https://github.com/spiffe/spiffe/blob/main/standards/X509-SVID.md">
          <front>
            <title>X509-SVID</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SPIFFE_JWT" target="https://github.com/spiffe/spiffe/blob/main/standards/JWT-SVID.md">
          <front>
            <title>JWT-SVID</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SPIFFE_BUNDLE" target="https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE_Trust_Domain_and_Bundle.md#4-spiffe-bundle-format">
          <front>
            <title>SPIFFE Bundle</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SPIFFE_FEDERATION" target="https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE_Federation.md">
          <front>
            <title>SPIFFE Federation</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Headless_JWT" target="foo">
          <front>
            <title>Headless-JWT</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SPIFFE-OAUTH-CLIENT-AUTH" target="foo">
          <front>
            <title>OAuth SPIFFE Client Authentication</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </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="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="RFC6819">
          <front>
            <title>OAuth 2.0 Threat Model and Security Considerations</title>
            <author fullname="T. Lodderstedt" initials="T." role="editor" surname="Lodderstedt"/>
            <author fullname="M. McGloin" initials="M." surname="McGloin"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document gives additional security considerations for OAuth, beyond those in the OAuth 2.0 specification, based on a comprehensive threat model for the OAuth 2.0 protocol. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6819"/>
          <seriesInfo name="DOI" value="10.17487/RFC6819"/>
        </reference>
      </references>
    </references>
    <?line 286?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank Dmitry Telegin (Backbase), Dean Saxe (Beyond Identity), Arndt Schwenkschuster (SPIRL) and Marcel Levy (SPIRL) and others (please let us know, if you've been mistakenly omitted) for their valuable input, feedback and general support of this work.</t>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]
-latest
* Initial draft submitted to Datatracker</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
AA==

-->

</rfc>
