<?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.6.36 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-parecki-oauth-first-party-native-apps-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="OAuth for First-Party Native Apps">OAuth 2.0 for First-Party Native Applications</title>
    <seriesInfo name="Internet-Draft" value="draft-parecki-oauth-first-party-native-apps-00"/>
    <author fullname="Aaron Parecki">
      <organization>Okta</organization>
      <address>
        <email>aaron@parecki.com</email>
      </address>
    </author>
    <author fullname="George Fletcher">
      <organization>Capital One Financial</organization>
      <address>
        <email>george.fletcher@capitalone.com</email>
      </address>
    </author>
    <author fullname="Pieter Kasselman">
      <organization>Microsoft</organization>
      <address>
        <email>pieter.kasselman@microsoft.com</email>
      </address>
    </author>
    <date year="2023" month="July" day="07"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>native apps</keyword>
    <keyword>oauth</keyword>
    <abstract>
      <?line 72?>

<t>This document defines the Authorization Challenge Endpoint, which supports
a first-party native client that wants to control the process of
obtaining authorization from the user using a native experience.</t>
      <t>In many cases, this can provide an entirely browserless OAuth 2.0 experience suited for native
applications, only delegating to the browser in unexpected, high risk, or error conditions.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://aaronpk.github.io/oauth-first-party-native-apps/draft-parecki-oauth-first-party-native-apps.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-parecki-oauth-first-party-native-apps/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Authorization Protocol Working Group mailing list (<eref target="mailto:oauth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/oauth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/aaronpk/oauth-first-party-native-apps"/>.</t>
    </note>
  </front>
  <middle>
    <?line 82?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document extends the OAuth 2.0 Authorization Framework <xref target="RFC6749"/> with
a new endpoint, <tt>authorization_challenge_endpoint</tt>, to support first-party native
applications that want to control the process of obtaining authorization from
the user using a native experience.</t>
      <t>The client collects any initial information from the user and POSTs that information
as well as information about the client's request to the Authorization Challenge Endpoint,
and receives either an authorization code or an error code in response. The error code
may indicate that the client can continue to prompt the user for more information,
or can indicate that the client needs to launch a browser to have the user complete
the flow in a browser.</t>
      <t>The Authorization Challenge Endpoint is used to initiate the OAuth flow in place of redirecting
or launching a browser to the authorization endpoint.</t>
      <t>While a fully-delegated approach using the redirect-based Authorization Code grant is generally
preferred, this draft provides a mechanism for the client to directly interact
with the user. This requires a high degree of trust between the authorization server
and the client, as there typically is for first-party applications.
It should only be considered when there are usability
concerns with a redirect-based approach, such as for native mobile or desktop applications.</t>
      <t>This draft also extends the token response (typically for use in response to a refresh token request) and resource server response to allow the authorization server or resource server to indicate that the client should re-request authorization from the user. This can include requesting step-up authentication by including parameters defined in <xref target="I-D.ietf-oauth-step-up-authn-challenge"/> as well.</t>
      <section anchor="usage-and-applicability">
        <name>Usage and Applicability</name>
        <t>This specification <bcp14>MUST</bcp14> only be used by first-party applications, which is when the authorization server and application are operated by the same entity and the user understands them both as the same entity.</t>
        <t>This specification <bcp14>MUST NOT</bcp14> be used by third party applications, and the authorization server <bcp14>SHOULD</bcp14> take measures to prevent use by third party applications. (e.g. only enable this grant for certain client IDs, and take measures to authenticate first-party apps when possible.)</t>
        <t>Using this specification in scenarios other than those described will lead to unintended security and privacy problems for users and service providers.</t>
        <t>This specification is designed to be used by native applications, which includes both mobile and desktop applications.</t>
        <t>If you provide multiple apps and expect users to use multiple apps on the same device, there may be better ways of sharing a user's login between the apps other than each app implementing this specification or using an SDK that implements this specification. For example, <xref target="OpenID.Native-SSO"/> provides a mechanism for one app to obtain new tokens by exchanging tokens from another app, without any user interaction. See <xref target="multiple-applications"/> for more details.</t>
      </section>
      <section anchor="limitations-of-this-specification">
        <name>Limitations of this specification</name>
        <t>The scope of this specification is limited to first-party native applications. Please review the entirety of <xref target="security-considerations"/>, and when more than one first-party native application is supported, <xref target="multiple-applications"/>.</t>
        <t>While this draft provides the framework for a native OAuth experience, each implementation
will need to define the specific behavior that it expects from OAuth clients interacting with the authorization server. While this lack of clearly defining the details would typically lead to less interoperability, it is acceptable in this case since we intend this specification to be deployed in a tightly coupled environment since it is only applicable to first-party applications.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="terminology">
        <name>Terminology</name>
        <t>This specification uses the terms "Access Token", "Authorization Code",
"Authorization Endpoint", "Authorization Server" (AS), "Client", "Client Authentication",
"Client Identifier", "Client Secret", "Grant Type", "Protected Resource",
"Redirection URI", "Refresh Token", "Resource Owner", "Resource Server" (RS)
and "Token Endpoint" defined by <xref target="RFC6749"/>.</t>
        <t>TODO: Replace RFC6749 references with OAuth 2.1</t>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>There are three primary ways this specification extends various parts of an OAuth system.</t>
      <section anchor="initial-authorization-request">
        <name>Initial Authorization Request</name>
        <artwork type="ascii-art"><![CDATA[
                                                +-------------------+
                                                |   Authorization   |
                          (B)Authorization      |      Server       |
             +----------+    Challenge Request  |+-----------------+|
(A)Client+---|  Native  |---------------------->||  Authorization  ||
   Starts|   |  Client  |                       ||   Challenge     ||
   Flow  +-->|          |<----------------------||    Endpoint     ||
             |          | (C)Authorization      ||                 ||
             |          |    Error Response     ||                 ||
             |          |         :             ||                 ||
             |          |         :             ||                 ||
             |          | (D)Authorization      ||                 ||
             |          |    Challenge Request  ||                 ||
             |          |---------------------->||                 ||
             |          |                       ||                 ||
             |          |<----------------------||                 ||
             |          | (E) Authorization     |+-----------------+|
             |          |     Code Response     |                   |
             |          |                       |                   |
             |          |                       |                   |
             |          |                       |                   |
             |          | (F) Token             |                   |
             |          |     Request           |+-----------------+|
             |          |---------------------->||      Token      ||
             |          |                       ||     Endpoint    ||
             |          |<----------------------||                 ||
             |          | (G) Access Token      |+-----------------+|
             |          |                       |                   |
             +----------+                       +-------------------+
]]></artwork>
        <t>Figure: Native Client Authorization Code Request</t>
        <ul spacing="normal">
          <li>(A) The native client starts the flow, by presenting the user with a "sign in" button, or collecting information from the user, such as their email address or username.</li>
          <li>(B) The client initiates the authorization request by making a POST request to the Authorization Challenge Endpoint, optionally with information collected from the user (e.g. email or username)</li>
          <li>(C) The authorization server determines whether the information provided to the Authorization Challenge Endpoint is sufficient to grant authorization, and either responds with an authorization code or responds with an error. In this example, it determines that additional information is needed and responds with an error. The error may contain additional information to guide the Client on what information to collect next. This pattern of collecting information, submitting it to the Authorization Challenge Endpoint and then receing an error or authorization code may repeat several times.</li>
          <li>(D) The client gathers additional information (e.g. passkey, or one-time code from email) and makes a POST request to the Authorization Challenge Endpoint.</li>
          <li>(E) The Authorization Challenge Endpoint returns an authorization code.</li>
          <li>(F) The native client sends the authorization code received in step (E) to obtain a token from the Token Endpoint.</li>
          <li>(G) The Authorization Server returns an Access Token from the Token Endpoint.</li>
        </ul>
      </section>
      <section anchor="refresh-token-request">
        <name>Refresh Token Request</name>
        <t>When the client uses a refresh token to obtain a new access token, the authorization server <bcp14>MAY</bcp14> respond with an error to indicate that re-authorization of the user is required.</t>
      </section>
      <section anchor="resource-request">
        <name>Resource Request</name>
        <t>When making a resource request to a resource server, the resource server <bcp14>MAY</bcp14> respond with an error according to OAuth 2.0 Step-Up Authentication Challenge Protocol <xref target="I-D.ietf-oauth-step-up-authn-challenge"/>, indicating that re-authorization of the user is required.</t>
      </section>
    </section>
    <section anchor="protocol-endpoints">
      <name>Protocol Endpoints</name>
      <section anchor="authorization-challenge-endpoint">
        <name>Authorization Challenge Endpoint</name>
        <t>The authorization challenge endpoint is a new endpoint defined by this specification which the native application uses to obtain an authorization code.</t>
        <t>The authorization challenge endpoint is an HTTP API at the authorization server that accepts HTTP POST requests with parameters in the HTTP request message body using the <tt>application/x-www-form-urlencoded</tt> format. This format has a character encoding of UTF-8, as described in Appendix B of <xref target="RFC6749"/>. The authorization challenge endpoint URL <bcp14>MUST</bcp14> use the "https" scheme.</t>
        <t>Authorization servers supporting this specification <bcp14>SHOULD</bcp14> include the URL of their authorization challenge endpoint in their authorization server metadata document <xref target="RFC8414"/> using the <tt>authorization_challenge_request_endpoint</tt> parameter as defined in <xref target="authorization-server-metadata"/>.</t>
        <t>The endpoint accepts the authorization request parameters defined in <xref target="RFC6749"/> for the authorization endpoint as well
as all applicable extensions defined for the authorization endpoint. Some examples of such extensions include Proof
Key for Code Exchange (PKCE) <xref target="RFC7636"/>, Resource Indicators <xref target="RFC8707"/>, and OpenID Connect <xref target="OpenID"/>. It is
important to note that some extension parameters have meaning in a web context but don't have meaning in a native
mechanism (e.g. <tt>response_mode=query</tt>). It is out of scope as to what the AS does in the case that an extension
defines a parameter that is has no meaning in this use case.</t>
        <t>The client initiates the authorization flow with or without information collected from the user (e.g. a passkey or MFA code).</t>
        <t>The authorization challenge endpoint response is either an authorization code or an error code, and may also contain a <tt>device_session</tt> which the client uses on subsequent requests to the authorization challenge endpoint.</t>
      </section>
      <section anchor="token-endpoint">
        <name>Token endpoint</name>
        <t>The token endpoint is used by the client to obtain an access token by
presenting its authorization grant or refresh token, as described in
Section 3.2 of OAuth 2.0 <xref target="RFC6749"/>.</t>
        <t>This specification extends the token endpoint response to allow the authorization
server to indicate that further authentication of the user is required.</t>
      </section>
    </section>
    <section anchor="authorization-initiation">
      <name>Authorization Initiation</name>
      <t>A client may wish to initiate an authorization flow by first prompting the user for their user identifier or other account information. The authorization challenge endpoint is a new endpoint to collect this login hint and direct the client with the next steps, whether that is to do an MFA flow, or perform an OAuth redirect-based flow.</t>
      <section anchor="challenge-request">
        <name>Authorization Challenge Request</name>
        <t>The client makes a request to the authorization challenge endpoint by adding the
following parameters, as well as parameters from any extensions, using the <tt>application/x-www-form-urlencoded</tt>
format with a character encoding of UTF-8 in the HTTP request body:</t>
        <dl>
          <dt>"client_id":</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> if the client is not authenticating with the
authorization server and if no <tt>device_session</tt> is included.</t>
          </dd>
          <dt>"scope":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. The OAuth scope defined in <xref target="RFC6749"/>.</t>
          </dd>
          <dt>"acr_values":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. The acr_values requested by the client.</t>
          </dd>
          <dt>"device_session":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. If the client has previously obtained a device session, described in <xref target="device-session"/>.</t>
          </dd>
        </dl>
        <t>Specific implementations as well as extensions to this specification <bcp14>MAY</bcp14> define additional parameters to be used at this endpoint.</t>
        <t>For example, the client makes the following request to initiate a flow
given the user's phone number, line breaks shown for illustration purposes only:</t>
        <artwork><![CDATA[
POST /authorize HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

login_hint=%2B1-310-123-4567&scope=profile
&client_id=bb16c14c73415
]]></artwork>
      </section>
      <section anchor="challenge-response">
        <name>Authorization Challenge Response</name>
        <t>The authorization server determines whether the information provided up to this point is sufficient to issue an authorization code, and responds with an authorization code or an error message.</t>
        <section anchor="authorization-code-response">
          <name>Authorization Code Response</name>
          <t>The authorization server issues an authorization code
by creating an HTTP response content using the <tt>application/json</tt>
media type as defined by <xref target="RFC8259"/> with the following parameters
and an HTTP 200 (OK) status code:</t>
          <dl>
            <dt>"authorization_code":</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The authorization code issued by the authorization server.</t>
            </dd>
          </dl>
          <t>For example,</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store

{
  "authorization_code": "uY29tL2F1dGhlbnRpY"
}
]]></artwork>
        </section>
        <section anchor="challenge-error-response">
          <name>Error Response</name>
          <t>If the request contains invalid parameters or incorrect data,
the authorization server responds with an HTTP 400 (Bad Request)
status code (unless specified otherwise) and includes the following
parameters with the response:</t>
          <dl>
            <dt>"error":</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>.  A single ASCII <xref target="USASCII"/> error code from the following:
</t>
              <dl>
                <dt>"invalid_request":</dt>
                <dd>
                  <t>The request is missing a required parameter, includes an
unsupported parameter value,
repeats a parameter, includes multiple credentials,
utilizes more than one mechanism for authenticating the
client, or is otherwise malformed.</t>
                </dd>
                <dt>"invalid_client":</dt>
                <dd>
                  <t>Client authentication failed (e.g., unknown client, no
client authentication included, or unsupported
authentication method).  The authorization server <bcp14>MAY</bcp14>
return an HTTP 401 (Unauthorized) status code to indicate
which HTTP authentication schemes are supported.  If the
client attempted to authenticate via the <tt>Authorization</tt>
request header field, the authorization server <bcp14>MUST</bcp14>
respond with an HTTP 401 (Unauthorized) status code and
include the <tt>WWW-Authenticate</tt> response header field
matching the authentication scheme used by the client.</t>
                </dd>
                <dt>"unauthorized_client":</dt>
                <dd>
                  <t>The authenticated client is not authorized to use this
authorization grant type.</t>
                </dd>
                <dt>"invalid_scope":</dt>
                <dd>
                  <t>The requested scope is invalid, unknown, malformed, or
exceeds the scope granted by the resource owner.</t>
                </dd>
              </dl>
              <t>Values for the <tt>error</tt> parameter <bcp14>MUST NOT</bcp14> include characters
outside the set %x20-21 / %x23-5B / %x5D-7E.</t>
              <t>The authorization server <bcp14>MAY</bcp14> extend these error codes with custom
messages based on the requirements of the authorization server.</t>
            </dd>
            <dt>"error_description":</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>.  Human-readable ASCII <xref target="USASCII"/> text providing
additional information, used to assist the client developer in
understanding the error that occurred.
Values for the <tt>error_description</tt> parameter <bcp14>MUST NOT</bcp14> include
characters outside the set %x20-21 / %x23-5B / %x5D-7E.</t>
            </dd>
            <dt>"error_uri":</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>.  A URI identifying a human-readable web page with
information about the error, used to provide the client
developer with additional information about the error.
Values for the <tt>error_uri</tt> parameter <bcp14>MUST</bcp14> conform to the
URI-reference syntax and thus <bcp14>MUST NOT</bcp14> include characters
outside the set %x21 / %x23-5B / %x5D-7E.</t>
            </dd>
            <dt>"device_session":</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>.  The device session allows the authorization server to
associate subsequent requests by this client with an ongoing
authorization request sequence. The client <bcp14>MUST</bcp14> include
the <tt>device_session</tt> in follow-up requests to the challenge
endpoint if it receives one along with the error response.</t>
            </dd>
          </dl>
          <t>The parameters are included in the content of the HTTP response
using the <tt>application/json</tt> media type as defined by <xref target="RFC7159"/>.  The
parameters are serialized into a JSON structure by adding each
parameter at the highest structure level.  Parameter names and string
values are included as JSON strings.  Numerical values are included
as JSON numbers.  The order of parameters does not matter and can
vary.</t>
          <t>The authorization server <bcp14>MAY</bcp14> define additional parameters in the response
depending on the implmentation.</t>
        </section>
      </section>
      <section anchor="device-session">
        <name>Device Session</name>
        <t>The device session is completely opaque to the client, and as such the AS <bcp14>MUST</bcp14> adequately protect the value from inspection by the client, for example by using a JWE if the AS is not maintaining state on the backend.</t>
        <t>The client <bcp14>MUST</bcp14> include the device session in future requests to the authorization challenge endpoint for the particular authorization request.</t>
      </section>
    </section>
    <section anchor="token-request">
      <name>Token Request</name>
      <t>The client makes a request to the token endpoint using the authorization code it obtained from the authorization challenge endpoint.</t>
      <t>This specification does not define any additional parameters beyond the token request parameters defined in  Section 4.1.3 of <xref target="RFC6749"/>. However, notably the <tt>redirect_uri</tt> parameter will not be included in this request, because no <tt>redirect_uri</tt> parameter was included in the authorization request.</t>
      <section anchor="token-endpoint-error-response">
        <name>Token Endpoint Error Response</name>
        <t>Upon any request to the token endpoint, including a request with a valid refresh token,
the authorization server can respond with an authorization challenge instead of a successful access token response.</t>
        <t>An authorization challenge error response is a particular type of
error response as defined in Section 5.2 of OAuth 2.0 <xref target="RFC6749"/> where
the error code is set to the following value:</t>
        <dl>
          <dt>"error": "authorization_required":</dt>
          <dd>
            <t>The authorization grant is insufficiently authorized, but another
access token request may succeed if an additional authorization
grant is presented.</t>
          </dd>
          <dt>"device_session":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>.  The optional device session value allows the authorization server to
associate subsequent requests by this client with an ongoing
authorization request sequence. The client <bcp14>MUST</bcp14> include
the <tt>device_session</tt> in follow-up requests to the challenge
endpoint if it receives one along with the error response.</t>
          </dd>
        </dl>
        <t>For example:</t>
        <artwork><![CDATA[
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store

{
  "error": "authorization_required",
  "device_session": "uY29tL2F1dGhlbnRpY"
}
]]></artwork>
      </section>
    </section>
    <section anchor="resource-server-error-response">
      <name>Resource Server Error Response</name>
      <t>Step-Up Authentication <xref target="I-D.ietf-oauth-step-up-authn-challenge"/> defines a mechanism for resource servers to tell the client to start a new authorization request, including <tt>acr_values</tt> and <tt>max_age</tt>, and <tt>scope</tt> from RFC6750. Upon receiving this request, the client starts a new authorization request according to this specification, and includes the <tt>acr_values</tt>, <tt>max_age</tt> and <tt>scope</tt> returned in the error response.</t>
      <t>This specification does not define any new parameters for the resource server error response beyond those defined in <xref target="I-D.ietf-oauth-step-up-authn-challenge"/>.</t>
    </section>
    <section anchor="authorization-server-metadata">
      <name>Authorization Server Metadata</name>
      <t>The following authorization server metadata parameters <xref target="RFC8414"/> are introduced to signal the server's capability and policy with respect to 1st Party Native Applications.</t>
      <dl>
        <dt>"authorization_challenge_endpoint":</dt>
        <dd>
          <t>The URL of the authorization challenge endpoint at which a client can initiate
an authorization request and eventually obtain an authorization code.</t>
        </dd>
      </dl>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="first-party-applications">
        <name>First-Party Applications</name>
        <t>Because this specification enables a client application to interact directly with the end user, and the application handles sending any information collected from the user to the authorization server, it is expected to be used only for first-party applications when the authorization server also has a high degree of trust of the client.</t>
        <t>First-party applications are applications that the user recognizes as belonging to the same brand as the authorization server. For example, a bank publishing their own mobile application.</t>
      </section>
      <section anchor="phishing">
        <name>Phishing</name>
        <t>There are two ways using this specification increases the risk of phishing.</t>
        <t>With this specification, the client interacts directly with the end user, collecting information provided by the user and sending it to the authorization server. If an attacker impersonates the client and successfully tricks a user into using it, they may not realize they are giving their credentials to the malicious application.</t>
        <t>In a traditional OAuth deployment using the redirect-based authorization code flow, the user will only ever enter their credentials at the authorization server, and it is straightforward to explain to avoid entering credentials in other "fake" websites. By introducing a new place the user is expected to enter their credentials using this specification, it is more complicated to teach users how to recognize other fake login prompts that might be attempting to steal their credentials.</t>
        <t>Because of these risks, the authorization server <bcp14>MAY</bcp14> decide to require that the user go through a redirect-based flow at any stage of the process based on its own risk assessment.</t>
      </section>
      <section anchor="client-authentication">
        <name>Client Authentication</name>
        <t>Typically, mobile and desktop applications are considered "public clients" in OAuth, since they cannot be shipped with a statically configured set of client credentials <xref target="RFC8252"/>. Because of this, client impersonation should be a concern of anyone deploying this pattern. Without client authentication, a malicious user or attacker can mimick the requests the application makes to the authorization server, pretending to be the legitimate client.</t>
        <t>Because this specification is intended for first-party applications, it is likely that the intent is to also avoid prompting the user with a consent screen as recommended by <xref target="RFC6749"/>.</t>
        <t>Implementers <bcp14>SHOULD</bcp14> consider additional measures to limit the risk of client impersonation, such as using attestation APIs available from the operating system.</t>
      </section>
      <section anchor="sender-constrained-tokens">
        <name>Sender Constrained Tokens</name>
        <t>Tokens issued to native apps <bcp14>SHOULD</bcp14> be sender constrained to mitigate the risk of token theft and replay.</t>
        <t>Proof-of-Possession techniques constrain tokens by binding them to a cryptographic key. Whenever the token is presented, it should be accompanied by a proof that the client presenting the token also controls the cryptographic key bound to the token. If a proof-of-possession sender constrained token is presented without valid proof of possession of the cryptographic key, it <bcp14>MUST</bcp14> be rejected.</t>
        <section anchor="demonstrating-proof-of-possession">
          <name>Demonstrating Proof-of-Possession</name>
          <t>DPoP is an application-level mechanism for sender-constraining OAuth <xref target="RFC6749"/> access and refresh tokens <xref target="I-D.ietf-oauth-dpop"/>. If DPoP is used to sender constrain tokens, the native client <bcp14>SHOULD</bcp14> use DPoP for every token request to the authorization Server and interaction with the Resource Server.</t>
          <t>DPoP includes an optional capability to bind the authorization code to the DPoP key to enable end-to-end binding of the entire authorization flow. If an attacker can access the Authorization Code and PKCE code verifier as described in Section 11.9 of <xref target="I-D.ietf-oauth-dpop"/>, Authorization Code binding <bcp14>SHOULD</bcp14> be used.</t>
          <t>To bind the authorization code using the Authorization Challenge Endpoint, the JWK Thumbprint of the DPoP key <bcp14>MUST</bcp14> be communicated to the Authorization Server by including the <tt>dpop_jkt</tt> parameter defined in section 10 of <xref target="I-D.ietf-oauth-dpop"/> alongside other authorization request parameters in the POST body of the first Authorization Challenge Request. If it is included in subsequent Authorization Challenge Requests, the value of this parameter must be the same as in the initial request. If the JWK Thumbprint in the <tt>dpop_jkt</tt> differ at any point, the Authorization Server <bcp14>MUST</bcp14> reject the request. If the <tt>dpop_jkt</tt> parameter is not included in the first request, but added in subsequent requests, the Authorization Server <bcp14>MUST</bcp14> reject the request (do we need to define a specific error code for that?).</t>
        </section>
        <section anchor="other-proof-of-possession-mechanisms">
          <name>Other Proof of Possession Mechanisms</name>
          <t>It may be possible to use other proof of possession mechanisms to sender constrain access and refresh tokens. Defining these mechanisms are out of scope for this specification.</t>
        </section>
        <section anchor="device-session-1">
          <name>Device Session</name>
          <ul spacing="normal">
            <li>PoP binding of device session parameter</li>
          </ul>
        </section>
      </section>
      <section anchor="multiple-applications">
        <name>Multiple Applications</name>
        <t>When there there is more than one 1st-party native applications supported by the AS, then it is important to consider a number of additional risks. These risks fall into two main categories: Experience Risk and Technical Risk which are described below.</t>
        <section anchor="experience-risk">
          <name>Experience Risk</name>
          <t>Any time a user is asked to provide the authentication credentials in user experiences that differ, it has the effect of increasing the likelihood that the user will fall prey to a phishing attack because they are used to entering credentials in different looking experiences. When multiple native applications are support, the implementation <bcp14>MUST</bcp14> ensure the native experience is identical across all the 1st party native applications.</t>
          <t>Another experience risk is user confusion caused by different looking experiences and behaviors. This can increase the likelihood the user will not complete the authentication experience for the 1st party native application.</t>
        </section>
        <section anchor="technical-risk">
          <name>Technical Risk</name>
          <t>In addition to the experience risks, multiple implementations in 1st party native applications increases the risk of an incorrect implementation as well as increasing the attack surface as each implementation may expose it's own weaknesses.</t>
        </section>
        <section anchor="mitigation">
          <name>Mitigation</name>
          <t>To address these risk, when multiple 1st party native applications must be supported, and other methods such as <xref target="OpenID.Native-SSO"/> are not applicable, it is <bcp14>RECOMMENDED</bcp14> that a client-side SDK be used to ensure the implementation is consistent across the different native apps and to ensure the user experience is identical for all 1st party apps.</t>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has (TBD) registered the following values in the IANA "OAuth Authorization Server Metadata" registry of <xref target="IANA.OAuth.Parameters"/> established by <xref target="RFC8414"/>.</t>
      <t><strong>Metadata Name</strong>: authorization_challenge_endpoint</t>
      <t><strong>Metadata Description</strong>: URL of the authorization server's authorization challenge endpoint.</t>
      <t><strong>Change Controller</strong>: IESG</t>
      <t><strong>Specification Document</strong>: Section 4.1 of [[ this specification ]]</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <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="RFC7159">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2014"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7159"/>
          <seriesInfo name="DOI" value="10.17487/RFC7159"/>
        </reference>
        <reference anchor="RFC7636">
          <front>
            <title>Proof Key for Code Exchange by OAuth Public Clients</title>
            <author fullname="N. Sakimura" initials="N." role="editor" surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Agarwal" initials="N." surname="Agarwal"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>OAuth 2.0 public clients utilizing the Authorization Code Grant are susceptible to the authorization code interception attack. This specification describes the attack as well as a technique to mitigate against the threat through the use of Proof Key for Code Exchange (PKCE, pronounced "pixy").</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7636"/>
          <seriesInfo name="DOI" value="10.17487/RFC7636"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC8707">
          <front>
            <title>Resource Indicators for OAuth 2.0</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document specifies an extension to the OAuth 2.0 Authorization Framework defining request parameters that enable a client to explicitly signal to an authorization server about the identity of the protected resource(s) to which it is requesting access.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8707"/>
          <seriesInfo name="DOI" value="10.17487/RFC8707"/>
        </reference>
        <reference anchor="I-D.ietf-oauth-step-up-authn-challenge">
          <front>
            <title>OAuth 2.0 Step-up Authentication Challenge Protocol</title>
            <author fullname="Vittorio Bertocci" initials="V." surname="Bertocci">
              <organization>Auth0/Okta</organization>
            </author>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <date day="26" month="June" year="2023"/>
            <abstract>
              <t>   It is not uncommon for resource servers to require different
   authentication strengths or recentness according to the
   characteristics of a request.  This document introduces a mechanism
   for a resource server to signal to a client that the authentication
   event associated with the access token of the current request does
   not meet its authentication requirements and specify how to meet
   them.  This document also codifies a mechanism for a client to
   request that an authorization server achieve a specific
   authentication strength or recentness when processing an
   authorization request.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-step-up-authn-challenge-17"/>
        </reference>
        <reference anchor="I-D.ietf-oauth-dpop">
          <front>
            <title>OAuth 2.0 Demonstrating Proof-of-Possession at the Application Layer (DPoP)</title>
            <author fullname="Daniel Fett" initials="D." surname="Fett">
              <organization>Authlete</organization>
            </author>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <author fullname="John Bradley" initials="J." surname="Bradley">
              <organization>Yubico</organization>
            </author>
            <author fullname="Torsten Lodderstedt" initials="T." surname="Lodderstedt">
              <organization>yes.com</organization>
            </author>
            <author fullname="Michael B. Jones" initials="M. B." surname="Jones">
              <organization>independent</organization>
            </author>
            <author fullname="David Waite" initials="D." surname="Waite">
              <organization>Ping Identity</organization>
            </author>
            <date day="13" month="April" 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="Internet-Draft" value="draft-ietf-oauth-dpop-16"/>
        </reference>
        <reference anchor="OpenID.Native-SSO" target="https://openid.net/specs/openid-connect-native-sso-1_0.html">
          <front>
            <title>OpenID Connect Native SSO for Mobile Apps</title>
            <author initials="G." surname="Fletcher">
              <organization/>
            </author>
            <date year="2022" month="November"/>
          </front>
        </reference>
        <reference anchor="OpenID" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0</title>
            <author initials="N." surname="Sakimura">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="M." surname="Jones">
              <organization/>
            </author>
            <author initials="B." surname="de Medeiros">
              <organization/>
            </author>
            <author initials="C." surname="Mortimore">
              <organization/>
            </author>
            <date year="2014" month="November"/>
          </front>
        </reference>
        <reference anchor="IANA.OAuth.Parameters">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="USASCII">
          <front>
            <title>Coded Character Set -- 7-bit American Standard Code for Information Interchange, ANSI X3.4</title>
            <author initials="A. N. S." surname="Institute" fullname="American National Standards Institute">
              <organization/>
            </author>
            <date year="1986"/>
          </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>
        <name>Informative References</name>
        <reference anchor="RFC8252">
          <front>
            <title>OAuth 2.0 for Native Apps</title>
            <author fullname="W. Denniss" initials="W." surname="Denniss"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>OAuth 2.0 authorization requests from native apps should only be made through external user-agents, primarily the user's browser. This specification details the security and usability reasons why this is the case and how native apps and authorization servers can implement this best practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="212"/>
          <seriesInfo name="RFC" value="8252"/>
          <seriesInfo name="DOI" value="10.17487/RFC8252"/>
        </reference>
      </references>
    </references>
    <?line 522?>

<section anchor="example-user-experiences">
      <name>Example User Experiences</name>
      <t>This section provides non-normative examples of how this specification may be used to support specific use cases.</t>
      <section anchor="passwordless-one-time-passwork-otp">
        <name>Passwordless One-Time Passwork (OTP)</name>
        <t>In a passwordless One-Time Password (OTP) scheme, the user is in possession of a one-time password generator. This generator may be a hardware device, or implemented as an app on a mobile phone. The user provides a user identifier and one-time password, which is verified by the Authorization Server before it issues an Authorization Code, which can be exchanged for an Access and Refresh Token.</t>
        <ul spacing="normal">
          <li>The Client collects username and OTP from user.</li>
          <li>The Client sends an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>) including the username and OTP.</li>
          <li>The Authorization Server verifies the username and OTP and returns an Authorization Code.</li>
          <li>The Client requests an Access Token and Refresh Token by issuing a Token Request (<xref target="token-request"/>) to the Token Endpoint.</li>
          <li>The Authorization Server verifies the Authorization Code and issues the requested tokens.</li>
        </ul>
      </section>
      <section anchor="e-mail-confirmation-code">
        <name>E-Mail Confirmation Code</name>
        <t>A user may be required to provide an e-mail confirmation code as part of an authentication ceremony to prove they control an e-mail address. The user provides an e-mail address and is then requried to enter a verification code sent to the e-mail address. If the correct verification code is returned to the Authorization Server, it issues Access and Refresh Tokens.</t>
        <ul spacing="normal">
          <li>The Client collects an e-mail address from the user.</li>
          <li>The Client sends the e-mail address in an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>).</li>
          <li>The Authorization Server sends a verification code to the e-mail address and returns an Error Response (<xref target="challenge-error-response"/>) including <tt>"error": "authorization_required"</tt>, <tt>"device_session"</tt> and a custom error code indicating that an e-mail verification code must be entered.</li>
          <li>The Client presents a user experience guiding the user to copy the e-mail verification code to the Client. Once the e-mail verification code is entered, the Client sends an Authorization Challenge Request to the Authorization Challenge Endpoint, including the e-mail verification code as well as the <tt>device_session</tt> parameter returned in the previous Error Response.</li>
          <li>The Authorization Server uses the <tt>device_session</tt> to maintain the session and verifies the e-mail verification code before issuing an Authorization Code to the Client.</li>
          <li>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</li>
          <li>The Authorization Server verifies the Authorization Code and issues the Access Token and Refresh Token.</li>
        </ul>
      </section>
      <section anchor="sms-confirmation-code">
        <name>SMS Confirmation Code</name>
        <t>A user may be required to provide an SMS confirmation code as part of an authentication ceremony to prove they control a mobile phone number. The user provides a phone number and is then requried to enter a SMS confirmation code sent to the phone. If the correct confirmation code is returned to the Authorization Server, it issues Access and Refresh Tokens.</t>
        <ul spacing="normal">
          <li>The Client collects a mobile phone number from the user.</li>
          <li>The Client sends the phone number in an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>).</li>
          <li>The Authorization Server sends a confirmation code to the phone number and returns an Error Response (<xref target="challenge-error-response"/>) including <tt>"error": "authorization_required"</tt>, <tt>"device_session"</tt> and a custom error code indicating that a SMS confirmation code must be entered.</li>
          <li>The Client presents a user experience guiding the user to enter the SMS confirmation code. Once the SMS verification code is entered, the Client sends an Authorization Challenge Request to the Authorization Challenge Endpoint, including the confirmation code as well as the <tt>device_session</tt> parameter returned in the previous Error Response.</li>
          <li>The Authorization Server uses the <tt>device_session</tt> to maintain the session context and verifies the SMS code before issuing an Authorization Code to the Client.</li>
          <li>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</li>
          <li>The Authorization Server verifies the Authorization Code and issues the Access Token and Refresh Token.</li>
        </ul>
      </section>
      <section anchor="re-authenticating-to-an-app-a-week-later-using-otp">
        <name>Re-authenticating to an app a week later using OTP</name>
        <t>A client may be in possession of an Access and Refresh Token as the result of a previous succesful user authentication. The user returns to the app a week later and accesses the app. The Client presents the Access Token, but receives an error indicating the Access Token is no longer valid. The Client presents a Refresh Token to the Authorization Server to obtain a new Access Token. If the Authorization Server requires user interaction for reasons based on its own policies, it rejects the Refresh Token and the Client re-starts the user authentication flow to obtain new Access and Refresh Tokens.</t>
        <ul spacing="normal">
          <li>The Client has a short-lived access token and long-lived refresh token following a previous completion of an Authorization Grant Flow which included user authentication.</li>
          <li>A week later, the user launches the app and tries to access a protected resource at the Resource Server.</li>
          <li>The Resource Server responds with an error code indicating an invalid access token since it has expired.</li>
          <li>The Client presents the refresh token to the Authorization Server to obtain a new access token (section 6 <xref target="RFC6749"/>)</li>
          <li>The Authorization Server responds with an error code indicating that an OTP from the user is required, as well as a <tt>device_session</tt>.</li>
          <li>The Client prompts the user to enter an OTP.</li>
          <li>The Client sends the OTP and <tt>device_session</tt> in an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>).</li>
          <li>The Authorization Server verifies the <tt>device_session</tt> and OTP, and returns an Authorization Code.</li>
          <li>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</li>
          <li>The Authorization Server verifies the Authorization Code and issues the requested tokens.</li>
          <li>The Client presents the new Access Token to the Resource Server in order to access the protected resource.</li>
        </ul>
      </section>
      <section anchor="step-up-authentication-using-confirmation-sms">
        <name>Step-up Authentication using Confirmation SMS</name>
        <t>A Client previously obtained an Access and Refresh Token after the user authenticated with an OTP. When the user attempts to access a protected resource, the Resource Server determines that it needs an additional level of authentication and triggers a step-up authentication, indicating the desired level of authentication using <tt>acr_values</tt> and <tt>max_age</tt> as defined in the Step-up Authentication specification. The Client initiates an authorization request with the Authorization Server indicating the <tt>acr_values</tt> and <tt>max_age</tt> parameters. The Authorization Server responds with error messages promptng for additional authentication until the <tt>acr_values</tt> and <tt>max_age</tt> values are satisfied before issuing fresh Access and Refresh Tokens.</t>
        <ul spacing="normal">
          <li>The Client has a short-lived access token and long-lived refresh token following the completion of an Authorization Grant Flow which included user authentication.</li>
          <li>When the Client presents the Access token to the Resource Server, the Resource Server determines that the <tt>acr</tt> claim in the Access Token is insufficient given the resource the user wants to access and responds with an <tt>insufficient_user_authentication</tt> error code, along with the desired <tt>acr_values</tt> and desired <tt>max_age</tt>.</li>
          <li>The Client sends an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>) including the <tt>device_session</tt>, <tt>acr_values</tt> and <tt>max_age</tt> parameters.</li>
          <li>The Authorization Server verifies the <tt>device_session</tt> and determines which authentication methods must be satisfied based on the <tt>acr_values</tt>, and responds with an Error Response (<xref target="challenge-error-response"/>) including <tt>"error": "authorization_required"</tt> and a custom error code indicating that an OTP must be entered.</li>
          <li>The Client prompts the user for an OTP, which the user obtains and enters.</li>
          <li>The Client sends an Authorization Challenge Request to the Authorization Challenge Endpoint including the <tt>device_session</tt> and OTP.</li>
          <li>The Authorization Server verifies the OTP and returns an Authorization Code.</li>
          <li>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</li>
          <li>The Authorization Server verifies the Authorization Code and issues an Access Token with the updated <tt>acr</tt> value along with the Refresh Token.</li>
          <li>The Client presents the Access Token to the Resources Server, which verifies that the <tt>acr</tt> value meets its requirements before granting access to the prtoected resource.</li>
        </ul>
      </section>
      <section anchor="registration">
        <name>Registration</name>
        <t>This example describes how to use the mechanisms defined in this draft to create a complete user registration flow starting with an email address. In this example, it is the Authorization Server's policy to allow these challenges to be sent to email and phone number that were previously unrecognized, and creating the user account on the fly.</t>
        <ul spacing="normal">
          <li>The Client collects a username from the user.</li>
          <li>The Client sends an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>) including the username.</li>
          <li>The Authorization Server returns an Error Response (<xref target="challenge-error-response"/>) including <tt>"error": "authorization_required"</tt>, <tt>"device_session"</tt>, and a custom error code indicating that an e-mail address must be collected.</li>
          <li>The Client collects an e-mail address from the user.</li>
          <li>The Client sends the e-mail address as part of a second Authorization Challenge Request to the Authorization Challenge Endpoint, along with the <tt>device_session</tt> parameter.</li>
          <li>The Authorization Server sends a verification code to the e-mail address and returns an Error Response including <tt>"error": "authorization_required"</tt>, <tt>"device_session"</tt> and a custom error code indicating that an e-mail verification code must be entered.</li>
          <li>The Client presents a user experience guiding the user to copy the e-mail verification code to the Client. Once the e-mail verification code is entered, the Client sends an Authorization Challenge Request to the Authorization Challenge Endpoint, including the e-mail verification code as well as the <tt>device_session</tt> parameter returned in the previous Error Response.</li>
          <li>The Authorization Server uses the <tt>device_session</tt> to maintain the session context, and verifies the e-mail verification code. It determines that it also needs a phone number for account recovery purposes and returns an Error Response including <tt>"error": "authorization_required"</tt>, <tt>"device_session"</tt> and a custom error code indicating that a phone number must be collected.</li>
          <li>The Client collects a mobile phone number from the user.</li>
          <li>The Client sends the phone number in an Authorization Challenge Request to the Authorization Challenge Endpoint, along with the <tt>device_session</tt>.</li>
          <li>The Authorization Server uses the <tt>device_session</tt> parameter to link the previous requests. It sends a confirmation code to the phone number and returns an Error Response including <tt>"error": "authorization_required"</tt>, <tt>"device_session"</tt> and a custom error code indicating that a SMS confirmation code must be entered.</li>
          <li>The Client presents a user experience guiding the user to enter the SMS confirmation code. Once the SMS verification code is entered, the Client sends an Authorization Challenge Request to the Authorization Challenge Endpoint, including the confirmation code as well as the <tt>device_session</tt> parameter returned in the previous Error Response.</li>
          <li>The Authorization Server uses the <tt>device_session</tt> to maintain the session context, and verifies the SMS verification code before issuing an Authorization Code to the Client.</li>
          <li>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</li>
          <li>The Authorization Server verifies the Authorization Code and issues the requested tokens.</li>
        </ul>
      </section>
    </section>
    <section anchor="example-implementation">
      <name>Example Implementation</name>
      <t>In order to successfully implement this specification, the Authorization Server will need to define its own specific requirements for what values clients are expected to send in the Authorization Challenge Request (<xref target="challenge-request"/>), as well as its own specific error codes in the Authorization Challenge Response (<xref target="challenge-response"/>).</t>
      <t>Below is an example of parameters required for a complete implementation that enables the user to log in with a username and OTP.</t>
      <section anchor="authorization-challenge-request-parameters">
        <name>Authorization Challenge Request Parameters</name>
        <t>In addition to the request parameters defined in <xref target="challenge-request"/>, the authorization server defines the additional parameters below.</t>
        <dl>
          <dt>"username":</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14> for the initial Authorization Challenge Request.</t>
          </dd>
          <dt>"otp":</dt>
          <dd>
            <t>The OTP collected from the user. <bcp14>REQUIRED</bcp14> when re-trying an Authorization Challenge Request in response to the <tt>otp_required</tt> error defined below.</t>
          </dd>
        </dl>
      </section>
      <section anchor="authorization-challenge-response-parameters">
        <name>Authorization Challenge Response Parameters</name>
        <t>In addition to the response parameters defined in <xref target="challenge-response"/>, the authorization server defines the additional value for the <tt>error</tt> response below.</t>
        <dl>
          <dt>"otp_required":</dt>
          <dd>
            <t>The client should collect an OTP from the user and send the OTP in
a second request to the Authorization Challenge Endpoint. The HTTP
response code to use with this error value is <tt>401 Unauthorized</tt>.</t>
          </dd>
        </dl>
      </section>
      <section anchor="example-sequence">
        <name>Example Sequence</name>
        <t>The client prompts the user to enter their username, and sends the username in an initial Authorization Challenge Request.</t>
        <artwork><![CDATA[
POST /authorize HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

username=alice
&scope=photos
&client_id=bb16c14c73415
]]></artwork>
        <t>The Authorization Server sends an error response indicating that an OTP is required.</t>
        <artwork><![CDATA[
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Cache-Control: no-store

{
  "error": "otp_required",
  "device_session": "ce6772f5e07bc8361572f"
}
]]></artwork>
        <t>The client prompts the user for an OTP, and sends a new Authorization Challenge Request.</t>
        <artwork><![CDATA[
POST /authorize HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

device_session=ce6772f5e07bc8361572f
&otp=555121
]]></artwork>
        <t>The Authorization Server validates the <tt>device_session</tt> to find the expected user, then validates the OTP for that user, and responds with an authorization code.</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "authorization_code": "uY29tL2F1dGhlbnRpY"
}
]]></artwork>
        <t>The client sends the authorization code to the token endpoint.</t>
        <artwork><![CDATA[
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=bb16c14c73415
&code=uY29tL2F1dGhlbnRpY
]]></artwork>
        <t>The Authorization Server responds with an access token and refresh token.</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "token_type": "Bearer",
  "expires_in": 3600,
  "access_token": "d41c0692f1187fd9b326c63d",
  "refresh_token": "e090366ac1c448b8aed84cbc07"
}
]]></artwork>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
j/8Hv3eewxCuAAA=

-->

</rfc>
