<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-emelia-oauth-as-metadata-dpop-required-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="AS Metadata for requiring DPoP">OAuth Authorization Server Metadata Parameter for Requiring DPoP</title>
    <seriesInfo name="Internet-Draft" value="draft-emelia-oauth-as-metadata-dpop-required-00"/>
    <author fullname="Emelia Smith">
      <organization/>
      <address>
        <email>emelia@brandedcode.com</email>
        <uri>https://thisismissem.social</uri>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>oauth</keyword>
    <abstract>
      <?line 40?>

<t>This specification defines a new OAuth 2.0 Authorization Server Metadata parameter, <tt>dpop_bound_access_tokens_required</tt>, which allows an authorization server to indicate that it always issues DPoP-bound access tokens and requires DPoP for all requests made to it to obtain access tokens, including pushed authorization requests.</t>
      <t>This complements the metadata parameter of the same name defined in OAuth 2.0 Protected Resource Metadata.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://drafts.thisismissem.social/draft-emelia-oauth-as-metadata-dpop-required/draft-emelia-oauth-as-metadata-dpop-required.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-emelia-oauth-as-metadata-dpop-required/"/>.
      </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/ThisIsMissEm/draft-emelia-oauth-as-metadata-dpop-required"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>An OAuth 2.0 <xref target="RFC6749"/> client can determine from the <tt>dpop_signing_alg_values_supported</tt> authorization server metadata parameter (<xref section="5.1" sectionFormat="of" target="RFC9449"/>) whether an authorization server supports DPoP, but not whether the authorization server requires it.</t>
      <t>Without this information, a client can only discover that DPoP is required by sending a request without DPoP, receiving an error, and retrying the request with DPoP. <xref target="RFC9449"/> does not define a specific error for a request that is missing a required DPoP proof, so the client cannot reliably distinguish this case from other failures. Additionally, a client that does not support DPoP has no way to determine in advance that it cannot complete an authorization flow with the authorization server, and may only discover this after the user has completed the authorization request.</t>
      <t>OAuth 2.0 Protected Resource Metadata <xref target="RFC9728"/> registered a <tt>dpop_bound_access_tokens_required</tt> parameter in the IANA "OAuth Protected Resource Metadata" registry established by that specification; however, no similar parameter was added to the "OAuth Authorization Server Metadata" registry established by OAuth 2.0 Authorization Server Metadata <xref target="RFC8414"/>. This specification defines that metadata parameter for authorization servers.</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="authorization-server-metadata">
      <name>Authorization Server Metadata</name>
      <t>The metadata parameter <tt>dpop_bound_access_tokens_required</tt> is an optional Boolean value specifying whether the authorization server always issues DPoP-bound access tokens <xref target="RFC9449"/>, and requires DPoP for all requests made to it to obtain access tokens. The default value is <tt>false</tt>.</t>
      <t>If the metadata parameter <tt>dpop_bound_access_tokens_required</tt> is <tt>true</tt>:</t>
      <ul spacing="normal">
        <li>
          <t>the authorization server <bcp14>MUST NOT</bcp14> issue access tokens that are not DPoP-bound, and <bcp14>MUST</bcp14> reject token requests that do not include a DPoP proof (<xref section="5" sectionFormat="of" target="RFC9449"/>).</t>
        </li>
        <li>
          <t>the authorization server <bcp14>MUST</bcp14> also publish the <tt>dpop_signing_alg_values_supported</tt> metadata parameter (<xref section="5.1" sectionFormat="of" target="RFC9449"/>).</t>
        </li>
        <li>
          <t>the client <bcp14>MUST</bcp14> include a DPoP proof in token requests (<xref section="5" sectionFormat="of" target="RFC9449"/>).</t>
        </li>
        <li>
          <t>if the client uses pushed authorization requests <xref target="RFC9126"/>, including when the authorization server requires them (<tt>require_pushed_authorization_requests</tt>, <xref section="5" sectionFormat="of" target="RFC9126"/>), the client <bcp14>MUST</bcp14> bind them to a DPoP key (<xref section="10.1" sectionFormat="of" target="RFC9449"/>), and the authorization server <bcp14>MUST</bcp14> reject pushed authorization requests that are not bound to a DPoP key.</t>
        </li>
      </ul>
      <t>A client that does not support DPoP <bcp14>SHOULD NOT</bcp14> initiate an authorization request with an authorization server that advertises a value of <tt>true</tt>.</t>
      <t>This metadata parameter applies to all clients of the authorization server. A requirement that a specific client always uses DPoP is instead expressed using the <tt>dpop_bound_access_tokens</tt> client metadata parameter (<xref section="5.2" sectionFormat="of" target="RFC9449"/>).</t>
      <t>Unlike the metadata parameter of the same name for protected resources <xref target="RFC9728"/>, which indicates that a protected resource only accepts DPoP-bound access tokens, this metadata parameter also covers the requests a client makes to the authorization server to obtain access tokens.</t>
      <t>Since access tokens issued by such an authorization server are DPoP-bound, clients present them using the DPoP authentication scheme (<xref section="7" sectionFormat="of" target="RFC9449"/>). As a result, these access tokens can only be used with resource servers that support DPoP; a resource server that does not support DPoP will reject such requests.</t>
      <section anchor="example">
        <name>Example</name>
        <t>The following is a non-normative example of authorization server metadata that includes the <tt>dpop_bound_access_tokens_required</tt> metadata parameter:</t>
        <sourcecode type="json"><![CDATA[
{
  "issuer": "https://as.example.com",
  "authorization_endpoint": "https://as.example.com/authorize",
  "token_endpoint": "https://as.example.com/token",
  "pushed_authorization_request_endpoint": "https://as.example.com/par",
  "dpop_signing_alg_values_supported": ["ES256", "EdDSA"],
  "dpop_bound_access_tokens_required": true
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations of <xref target="RFC9449"/> apply to this specification.</t>
      <t>The <tt>dpop_bound_access_tokens_required</tt> parameter informs clients of the authorization server's requirements; it does not enforce them. Requests from clients that ignore or do not retrieve the authorization server metadata are rejected by the authorization server, as described in <xref target="authorization-server-metadata"/>.</t>
      <t>A DPoP-bound access token only provides protection against token replay if the resource server verifies the binding. An attacker that obtains a DPoP-bound access token may attempt to present it using the Bearer authentication scheme to a resource server that does not verify the <tt>cnf</tt> claim of the access token. Resource servers that support both the Bearer and DPoP authentication schemes need to reject DPoP-bound access tokens presented using the Bearer authentication scheme, as described in Section 7.2 of <xref target="RFC9449"/>. This specification does not change those requirements.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="oauth-authorization-server-metadata-registry">
        <name>OAuth Authorization Server Metadata Registry</name>
        <t>The following authorization server metadata value is defined by this specification and registered in the IANA "OAuth Authorization Server Metadata" registry established in OAuth 2.0 Authorization Server Metadata <xref target="RFC8414"/>.</t>
        <ul spacing="normal">
          <li>
            <t>Metadata Name: dpop_bound_access_tokens_required</t>
          </li>
          <li>
            <t>Metadata Description: Boolean value specifying whether the authorization server always issues DPoP-bound access tokens and requires DPoP for all requests to its pushed authorization request endpoint and token endpoint</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Specification Document: This document</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC9126">
          <front>
            <title>OAuth 2.0 Pushed Authorization Requests</title>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="D. Tonge" initials="D." surname="Tonge"/>
            <author fullname="F. Skokan" initials="F." surname="Skokan"/>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document defines the pushed authorization request (PAR) endpoint, which allows clients to push the payload of an OAuth 2.0 authorization request to the authorization server via a direct request and provides them with a request URI that is used as reference to the data in a subsequent call to the authorization endpoint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9126"/>
          <seriesInfo name="DOI" value="10.17487/RFC9126"/>
        </reference>
        <reference anchor="RFC9449">
          <front>
            <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Waite" initials="D." surname="Waite"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows for the detection of replay attacks with access and refresh tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9449"/>
          <seriesInfo name="DOI" value="10.17487/RFC9449"/>
        </reference>
        <reference anchor="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="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="RFC9728">
          <front>
            <title>OAuth 2.0 Protected Resource Metadata</title>
            <author fullname="M.B. Jones" initials="M.B." surname="Jones"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <author fullname="A. Parecki" initials="A." surname="Parecki"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client or authorization server can use to obtain the information needed to interact with an OAuth 2.0 protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9728"/>
          <seriesInfo name="DOI" value="10.17487/RFC9728"/>
        </reference>
      </references>
    </references>
    <?line 131?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank Max Gerber (Twilio) for identifying the gap in OAuth Authorization Server Metadata that this document addresses.</t>
    </section>
    <section numbered="false" anchor="document-history">
      <name>Document History</name>
      <t>(This appendix to be deleted by the RFC editor in the final specification.)</t>
      <section numbered="false" anchor="section">
        <name>-00</name>
        <t>Initial draft</t>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
