<?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-01" 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-01"/>
    <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="24"/>
    <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, 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:
H4sIAAAAAAAAA+0963bbxpn/8RSzyjlrKSZpK3E2iZpNI+sSq7UtrywnzenF
AYEhORUIsBhAMjdun2WfZZ9sv8tcAZCiW+/u2XNWp40pEDPzzXe/zWg8HieN
agp5JPYuj9tmIU4KJctGXMm50k2dNqoqBfzvXNW6EW+0FHcK3nr96uL8/Gwv
ydJGzqt6fSRUOauSJK+yMl3CbHmdzprxTaq1LJZpOa5SmHysV2o2k+PHh4lu
p0ulNczerFfw/sXZ9bkQn4i00BXAospcriT8p2z2RmJP5qqpapUW+MvF8VP4
p6rh09X1+V5StsuprI+SHGA5SrKq1LLUrT4STd3K5PZIfJ6ktUyPxPHV2XFy
V9U387pqV7DKj3IqcNMw9b/zTl/VVVNlVbGX3Mg1vJofJWIscExRpTl+VgiT
atb4Oasl/ZYW9BthDj/VAfKSW1m2AJcQu6wqBKNj70dYUpVz8T0OwufLVBXw
nPD4nZLNbFLVc/wirbMFfLFompU+evQI38NH6lZO7GuP8MGjaV3dafmIZniE
I+dAyXYKY1/Bi7L+baofEQ+M0zIfWwoLUQBedRMs4V6f8AwTVfUGPhpkgLfM
AJNFs4TNJilhAVEMywgxa4uCucdAJH5rh+/RC7CVtDRIO0IevHpOz6VBzopG
fQeL1MUkq5Z7AzOfpnPxupRyPpfDs6p5qYCtw4nzdK5L+Z02X+HUSVJW9RLG
3AJt4d2r85N/+fLJ10f24xdfmI9ffnH45ZH4zevLlwIJ/1u51vaLzw7dO599
7j5+fXgEcsDC+NnksThdA+QqGxRMyzg89qsvH9OqTIEj2oERbn7ET9J6LoGc
lpqGhrCnR0wd+8+0qKbITuUj3QBh0zrXj3ieyTJ3y7y9OB1YaXxx+rEWg6mi
9X73xeOvoxXxwfj1Dx9jRTdVtOJvfryOFoTfP9J6dqZouadvXp4+HyKfeNqW
eSE/FmLfXtetbt6eVvjtW/juLc8PwHzyxKrqKT0az4jZPYznZ6dnV8fXF5cv
h+A8B7VotN/HgtVPybh6JlOAS+secewXY/giWn1WVQ7+8eXxm+tn45PnF2cv
r8f4OZqDhc9sxsgdPkJdn/X3hTMnaP86CuHrLx8/tgrhq0Ng2mQ8Hot0iuKb
NUlyvZBmqVkNygmtjFBapGBic1msBZjAolrLXKSRtVgZoRcWSaJZpI2QZTqF
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

-->

</rfc>
