<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.5 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-parecki-oauth-first-party-apps-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.4 -->
  <front>
    <title abbrev="OAuth for First-Party Apps">OAuth 2.0 for First-Party Applications</title>
    <seriesInfo name="Internet-Draft" value="draft-parecki-oauth-first-party-apps-01"/>
    <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="2024" month="March" day="01"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>native apps</keyword>
    <keyword>first-party</keyword>
    <keyword>oauth</keyword>
    <abstract>
      <?line 87?>

<t>This document defines the Authorization Challenge Endpoint, which supports
a first-party 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-apps/draft-parecki-oauth-first-party-apps.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-parecki-oauth-first-party-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-apps"/>.</t>
    </note>
  </front>
  <middle>
    <?line 97?>

<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
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="RFC9470"/> 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 first-party 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 applications. Please review the entirety of <xref target="security-considerations"/>, and when more than one first-party 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 anchor="user-experience-considerations">
        <name>User Experience Considerations</name>
        <t>It is important to consider the user experience implications of different authentication challenges as well as the device with which the user is attempting to authorize.</t>
        <t>For example, requesting a user to enter a password on a limited-input device (e.g. TV) creates a lot of user friction while also exposing the user's password to anyone else in the room. On the other hand, using a challenge method that involves, for example, a fingerprint reader on the TV remote allowing for a FIDO2 passkey authentication would be a good experience.</t>
        <t>The Authorization Server <bcp14>SHOULD</bcp14> consider the user's device when presenting authentication challenges and developers <bcp14>SHOULD</bcp14> consider whether the device implementing this specification can provide a good experience for the user. If the combination of user device and authentication challenge methods creates a lot of friction or security risk, consider using a specification like OAuth 2.0 Device Authorization Grant <xref target="RFC8628"/>. If selecting OAuth 2.0 Device Authorization Grant <xref target="RFC8628"/> which uses a cross-device authorization mechanism, please incorporate the security best practices identified in Cross-Device Flows: Security Best Current Practice <xref target="I-D.ietf-oauth-cross-device-security"/>.</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+---|  First-  |---------------------->||  Authorization  ||
   Starts|   |  Party   |                       ||   Challenge     ||
   Flow  +-->|  Client  |<----------------------||    Endpoint     ||
             |          | (C)Authorization      ||                 ||
             |          |    Error Response     ||                 ||
             |          |         :             ||                 ||
             |          |         :             ||                 ||
             |          | (D)Authorization      ||                 ||
             |          |    Challenge Request  ||                 ||
             |          |---------------------->||                 ||
             |          |                       ||                 ||
             |          |<----------------------||                 ||
             |          | (E) Authorization     |+-----------------+|
             |          |     Code Response     |                   |
             |          |                       |                   |
             |          |                       |                   |
             |          |                       |                   |
             |          | (F) Token             |                   |
             |          |     Request           |+-----------------+|
             |          |---------------------->||      Token      ||
             |          |                       ||     Endpoint    ||
             |          |<----------------------||                 ||
             |          | (G) Access Token      |+-----------------+|
             |          |                       |                   |
             +----------+                       +-------------------+
]]></artwork>
        <t>Figure: First-Party Client Authorization Code Request</t>
        <ul spacing="normal">
          <li>
            <t>(A) The first-party 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.</t>
          </li>
          <li>
            <t>(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)</t>
          </li>
          <li>
            <t>(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.</t>
          </li>
          <li>
            <t>(D) The client gathers additional information (e.g. signed passkey challenge, or one-time code from email) and makes a POST request to the Authorization Challenge Endpoint.</t>
          </li>
          <li>
            <t>(E) The Authorization Challenge Endpoint returns an authorization code.</t>
          </li>
          <li>
            <t>(F) The client sends the authorization code received in step (E) to obtain a token from the Token Endpoint.</t>
          </li>
          <li>
            <t>(G) The Authorization Server returns an Access Token from the Token Endpoint.</t>
          </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="RFC9470"/>, 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 first-party 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>If the authorization server requires client authentication for this client on the Token Endpoint, then the authorization server <bcp14>MUST</bcp14> also require client authentication for this client on the Authorization Challenge Endpoint. See <xref target="client-authentication"/> for more details.</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_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 signed passkey challenge or MFA code).</t>
        <t>The authorization challenge endpoint response is either an authorization code or an error code, and may also contain an <tt>auth_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>
      <t>In order to preserve the security of this specification, the Authorization Server <bcp14>MUST</bcp14> verify the "first-partyness" of the client before continuing with the authentication flow. Please see <xref target="first-party-applications"/> for additional considerations.</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>auth_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>"auth_session":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. If the client has previously obtained an auth session, described in <xref target="auth-session"/>.</t>
          </dd>
          <dt>"code_challenge":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. The code challenge as defined by <xref target="RFC7636"/>.
See <xref target="redirect-to-web"/> for details.</t>
          </dd>
          <dt>"code_challenge_method":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. The code challenge method as defined by <xref target="RFC7636"/>.
See <xref target="redirect-to-web"/> for details.</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 if so responds with an authorization code. If the information is not sufficient for issuing an authorization code, then the authorization server <bcp14>MUST</bcp14> respond with an error response.</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
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,
or if the authorization server wishes to interact with the user directly,
the authorization server responds with an HTTP 400 (Bad Request)
status code (unless specified otherwise below) 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>"invalid_grant":</dt>
                <dd>
                  <t>The provided authorization grant or <tt>auth_session</tt> is
invalid, expired, revoked, or is otherwise invalid.</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>
                <dt>"insufficient_authorization":</dt>
                <dd>
                  <t>The presented authorization is insufficient, and the authorization
server is requesting the client take additional steps to
complete the authorization.</t>
                </dd>
                <dt>"redirect_to_web":</dt>
                <dd>
                  <t>The request is not able to be fulfilled with any further
direct interaction with the user. Instead, the client
should initiate a new authorization code flow so that the
user interacts with the authorization server in a web browser.</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>"auth_session":</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>.  The auth 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>auth_session</tt> in follow-up requests to the challenge
endpoint if it receives one along with the error response.</t>
            </dd>
            <dt>"request_uri":</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>.  A request URI as described by <xref target="RFC9126"/> Section 2.2.</t>
            </dd>
            <dt>"expires_in":</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>.  The lifetime of the <tt>request_uri</tt> in seconds, as
described by <xref target="RFC9126"/> Section 2.2.</t>
            </dd>
          </dl>
          <t>This specification requires the authorization server to define new
error codes that relate to the actions the client must take in order
to properly authenticate the user. These new error codes are specific
to the authorization server's implementation of this specification and are
intentionally left out of scope.</t>
          <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. The authorization server <bcp14>MAY</bcp14> also define
more specific content types for the error responses as long as the response
is JSON and conforms to <tt>application/&lt;AS-defined&gt;+json</tt>.</t>
          <section anchor="redirect-to-web">
            <name>Redirect to Web Error Response</name>
            <t>The authorization server may choose to interact directly with the user based on a risk
assesment, the introduction of a new authentication method not supported
in the application, or to handle an exception flow like account recovery.
To indicate this error to the client, the authorization server returns an
error response as defined above with the <tt>redirect_to_web</tt> error code.</t>
            <t>In this case, the client is expected to initiate a new OAuth
Authorization Code flow with PKCE according to <xref target="RFC6749"/> and <xref target="RFC7636"/>.</t>
            <t>If the client expects the frequency of this error response to be high,
the client <bcp14>MAY</bcp14> include a PKCE (<xref target="RFC7636"/>) <tt>code_challenge</tt> in the initial authorization
challenge request. This enables the authorization server to essentially treat
the authorization challenge request as a PAR <xref target="RFC9126"/> request, and
return the <tt>request_uri</tt> and <tt>expires_in</tt> as defined by <xref target="RFC9126"/> in the error response.
The client then uses the <tt>request_uri</tt> value to build an authorization request
as defined in <xref target="RFC9126"/> Section 4.</t>
          </section>
        </section>
      </section>
      <section anchor="intermediate-requests">
        <name>Intermediate Requests</name>
        <t>If the authorization server returns an <tt>insufficient_authorization</tt> error as described
above, this is an indication that there is further information the client
should request from the user, and continue to make requests to the authorization
server until the authorization request is fulfilled and an authorization code returned.</t>
        <t>These intermediate requests are out of scope of this specification, and are expected
to be defined by the authorization server. The format of these requests are not required
to conform to the format of the initial authorization challenge requests
(e.g. the request format may be <tt>application/json</tt> rather than <tt>application/x-www-form-urlencoded</tt>).</t>
        <section anchor="auth-session">
          <name>Auth Session</name>
          <t>The <tt>auth_session</tt> is a value that the authorization server issues in order to be able to associate subsequent requests from the same client. It is intended to be analagous to how a browser cookie associates multiple requests by the same browser to the authorization server.</t>
          <t>The <tt>auth_session</tt> value is completely opaque to the client, and as such the authorization server <bcp14>MUST</bcp14> adequately protect the value from inspection by the client, for example by using a random string or using a JWE if the authorization server is not maintaining state on the backend.</t>
          <t>If the client has an <tt>auth_session</tt>, the client <bcp14>MUST</bcp14> include it in future requests to the authorization challenge endpoint. The client <bcp14>MUST</bcp14> store the <tt>auth_session</tt> beyond the issuance of the authorization code to be able to use it in future requests.</t>
          <t>Every response defined by this specification may include a new <tt>auth_session</tt> value. Clients <bcp14>MUST NOT</bcp14> assume that <tt>auth_session</tt> values are static, and <bcp14>MUST</bcp14> be prepared to update the stored <tt>auth_session</tt> value if one is received in a response.</t>
          <t>To mitigate the risk of session hijacking, the 'auth_session' <bcp14>MUST</bcp14> be bound to the device, and the authorization server <bcp14>MUST</bcp14> reject an 'auth_session' if it is presented from a different device than the one it was bound to.</t>
          <t>See <xref target="auth-session-security"/> for additional security considerations.</t>
        </section>
      </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-successful-response">
        <name>Token Endpoint Successful Response</name>
        <t>This specification extends the OAuth 2.0 <xref target="RFC6749"/> token response
defined in Section 5.1 with the additional parameter <tt>auth_session</tt>, defined in <xref target="auth-session"/>.</t>
        <t>The response <bcp14>MAY</bcp14> include an <tt>auth_session</tt> parameter which the client is expected to include on a subsequent request to the authorization challenge endpoint. The <tt>auth_session</tt> parameter <bcp14>MAY</bcp14> also be included even if the authorization code was obtained through a traditional OAuth authorization code flow rather than the flow defined by this specification.</t>
        <t>An example successful token response is below:</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "access_token": "2YotnFZFEjr1zCsicMWpAA",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
  "auth_session": "uY29tL2F1dGhlbnRpY"
}
]]></artwork>
      </section>
      <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": "insufficient_authorization":</dt>
          <dd>
            <t>The presented authorization is insufficient, and the authorization
server is requesting the client take additional steps to
complete the authorization.</t>
          </dd>
        </dl>
        <t>Additionally, the response <bcp14>MAY</bcp14> contain an <tt>auth_session</tt> parameter which the client is expected to include on a subsequent request to the authorization challenge endpoint.</t>
        <dl>
          <dt>"auth_session":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>.  The optional auth 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>auth_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
Cache-Control: no-store

{
  "error": "insufficient_authorization",
  "auth_session": "uY29tL2F1dGhlbnRpY"
}
]]></artwork>
      </section>
    </section>
    <section anchor="resource-server-error-response">
      <name>Resource Server Error Response</name>
      <t>Step-Up Authentication <xref target="RFC9470"/> 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="RFC9470"/>.</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 first-party 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>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>
        <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>This specification is not prescriptive on how the Authorization Server establishes it's trust in the first-partyness of the application. For mobile platforms, most support some mechanism for application attestation that can be used to identify the entity that created/signed/uploaded the app to the app store. App attestation can be combined with other mechanisms like Dynamic Client Registration <xref target="RFC7591"/> to enable strong client authentication in addition to client verification (first-partyness). The exact steps required are out of scope for this specification. Note that applications running inside a browser (e.g. Single Page Apps) context it is much more difficult to verify the first-partyness of the client. Please see <xref target="single-page-apps"/> for additional details.</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="credential-attacks">
        <name>Credential Stuffing Attacks</name>
        <t>The authorization challenge endpoint is capable of directly receiving user credentials and returning authorization codes. This exposes a new vector to perform credential stuffing attacks, if additional measures are not taken to ensure the authenticity of the application.</t>
        <t>An authorization server may already have a combination of built-in or 3rd party security tools in place to monitor and reduce this risk in browser-based authentication flows. Implementors <bcp14>SHOULD</bcp14> consider similar security measures to reduce this risk in the authorization challenge endpoint. Additionally, the attestation APIs <bcp14>SHOULD</bcp14> be used when possible to assert a level of confidence to the authorization server that the request is originating from an application owned by the same party.</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 in response to an authorization challenge request <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 <bcp14>MUST</bcp14> 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="dpop-demonstrating-proof-of-possession">
          <name>DPoP: Demonstrating Proof-of-Possession</name>
          <t>DPoP (<xref target="RFC9449"/>) is an application-level mechanism for sender-constraining OAuth <xref target="RFC6749"/> access and refresh tokens. If DPoP is used to sender constrain tokens, the 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. Given the back-channel nature of this specification, there are far fewer opportunities for an attacker to access the authorization code and PKCE code verifier compared to the redirect-based Authorization Code Flow. In this specification, the Authorization Code is obtained via a back-channel request. Despite this, omitting Authorization Code binding leaves a gap in the end-to-end protection that DPoP provides, so DPoP Authorization Code binding <bcp14>SHOULD</bcp14> be used.</t>
          <t>The mechanism for Authorization Code binding with DPoP is similar as that defined for Pushed Authorization Requests (PARs) in Section 10.1 of <xref target="RFC9449"/>. In order to bind the Authorization Code with DPoP, the client <bcp14>MUST</bcp14> add the DPoP header to the Authorization Challenge Request. The authorization server <bcp14>MUST</bcp14> check the DPoP proof JWT that was included in the DPoP header as defined in Section 4.3 of <xref target="RFC9449"/>. The authorization server <bcp14>MUST</bcp14> ensure that the same key is used in all subsequent Authorization Challenge Requests, or in the eventual token request. The authorization server <bcp14>MUST</bcp14> reject subsequent Authorization Challenge Requests, or the eventual token request, unless a DPoP proof for the same key presented in the original Authorization Challenge Request is provided.</t>
          <t>The above mechanism simplifies the implementation of the client, as it can attach the DPoP header to all requests to the authorization server regardless of the type of request. This mechanism provides a stronger binding than using the <tt>dpop_jkt</tt> parameter, as the DPoP header contains a proof of possession of the private key.</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>
      <section anchor="auth-session-security">
        <name>Auth Session</name>
        <section anchor="auth-session-dpop-binding">
          <name>Auth Session DPoP Binding</name>
          <t>If the client and authorization server are using DPoP binding of access tokens and/or authorization codes, then the <tt>auth_session</tt> value <bcp14>SHOULD</bcp14> be protected by the DPoP binding as well. The authorization server <bcp14>SHOULD</bcp14> bind the <tt>auth_session</tt> value to the DPoP public key. If the authorization server is binding the <tt>auth_session</tt> value to the DPoP public key, it <bcp14>MUST</bcp14> check that the same DPoP public key is being used and <bcp14>MUST</bcp14> verify the DPoP proof to ensure the client controls the corresponding private key whenever the client includes the <tt>auth_session</tt> in an Authorization Challenge Request as described in <xref target="challenge-request"/>.</t>
          <t>DPoP binding of the <tt>auth_session</tt> value ensures that the context referenced by the <tt>auth_session</tt> cannot be stolen and reused by another device.</t>
        </section>
        <section anchor="auth-session-lifetime">
          <name>Auth Session Lifetime</name>
          <t>This specification makes no requirements or assumptions on the lifetime of the <tt>auth_session</tt> value. The lifetime and expiration is at the discretion of the authorization server, and the authorization server may choose to invalidate the value for any reason such as scheduled expiration, security events, or revocation events.</t>
          <t>Clients <bcp14>MUST NOT</bcp14> make any assumptions or depend on any particular lifetime of the <tt>auth_session</tt> value.</t>
        </section>
      </section>
      <section anchor="multiple-applications">
        <name>Multiple Applications</name>
        <t>When multiple first-party applications are 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="user-experience-risk">
          <name>User 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 first-party applications are supported, the implementation <bcp14>MUST</bcp14> ensure the native experience is identical across all the first-party 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 first-party application.</t>
        </section>
        <section anchor="technical-risk">
          <name>Technical Risk</name>
          <t>In addition to the experience risks, multiple implementations in first-party applications increases the risk of an incorrect implementation as well as increasing the attack surface as each implementation may expose its own weaknesses.</t>
        </section>
        <section anchor="mitigation">
          <name>Mitigation</name>
          <t>To address these risks, when multiple first-party 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 applications and to ensure the user experience is identical for all first-party apps.</t>
        </section>
      </section>
      <section anchor="single-page-apps">
        <name>Single Page Applications</name>
        <t>Single Page Applications (SPA) run in a scripting language inside the context of a browser instance. This environment poses several unique challenges compared to native applications, in particular:</t>
        <ul spacing="normal">
          <li>
            <t>Significant attack vectors due to the possibility of Cross-Site Scripting (XSS) attacks</t>
          </li>
          <li>
            <t>Fewer options to securely attest to the first-partyness of a browser based application</t>
          </li>
        </ul>
        <t>See <xref target="I-D.ietf-oauth-browser-based-apps"/> for a detailed discussion of the risks of XSS attacks in browsers.</t>
        <t>Additionally, the nature of a Single-Page App means the user is already in a browser context, so the user experience cost of doing a full page redirect or a popup window for the traditional OAuth Authorization Code Flow is much less than the cost of doing so in a native application. The complexity and risk of implementing this specification in a browser likely does not outweigh the user experience benefits that would be gained in that context.</t>
        <t>For these reasons, it is <bcp14>NOT RECOMMENDED</bcp14> to use this specification in browser-based applications.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="oauth-parameters-registration">
        <name>OAuth Parameters Registration</name>
        <t>IANA has (TBD) registered the following values in the IANA "OAuth Parameters" registry of <xref target="IANA.oauth-parameters"/> established by <xref target="RFC6749"/>.</t>
        <t><strong>Parameter name</strong>: <tt>auth_session</tt></t>
        <t><strong>Parameter usage location</strong>: token response</t>
        <t><strong>Change Controller</strong>: IETF</t>
        <t><strong>Specification Document</strong>: Section 5.4 of this specification</t>
      </section>
      <section anchor="oauth-server-metadata-registration">
        <name>OAuth Server Metadata Registration</name>
        <t>IANA has (TBD) registered the following values in the IANA "OAuth Authorization Server Metadata" registry of <xref target="IANA.oauth-parameters"/> established by <xref target="RFC8414"/>.</t>
        <t><strong>Metadata Name</strong>: <tt>authorization_challenge_endpoint</tt></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>
      <section anchor="json-web-token-claims-registration">
        <name>JSON Web Token Claims Registration</name>
        <t>IANA has (TBD) registered the following Claims in the "JSON Web Token Claims" registry <xref target="IANA.JWT"/> established by <xref target="RFC7519"/>.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="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="RFC7515">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </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="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="RFC8628">
          <front>
            <title>OAuth 2.0 Device Authorization Grant</title>
            <author fullname="W. Denniss" initials="W." surname="Denniss"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="August" year="2019"/>
            <abstract>
              <t>The OAuth 2.0 device authorization grant is designed for Internet- connected devices that either lack a browser to perform a user-agent- based authorization or are input constrained to the extent that requiring the user to input text in order to authenticate during the authorization flow is impractical. It enables OAuth clients on such devices (like smart TVs, media consoles, digital picture frames, and printers) to obtain user authorization to access protected resources by using a user agent on a separate device.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8628"/>
          <seriesInfo name="DOI" value="10.17487/RFC8628"/>
        </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="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="RFC9470">
          <front>
            <title>OAuth 2.0 Step Up Authentication Challenge Protocol</title>
            <author fullname="V. Bertocci" initials="V." surname="Bertocci"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <date month="September" 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 that resource servers can use 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, further, 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="RFC" value="9470"/>
          <seriesInfo name="DOI" value="10.17487/RFC9470"/>
        </reference>
        <reference anchor="I-D.ietf-oauth-cross-device-security">
          <front>
            <title>Cross-Device Flows: Security Best Current Practice</title>
            <author fullname="Pieter Kasselman" initials="P." surname="Kasselman">
              <organization>Microsoft</organization>
            </author>
            <author fullname="Daniel Fett" initials="D." surname="Fett">
              <organization>Authlete</organization>
            </author>
            <author fullname="Filip Skokan" initials="F." surname="Skokan">
              <organization>Okta</organization>
            </author>
            <date day="1" month="March" year="2024"/>
            <abstract>
              <t>   This document describes threats against cross-device flows along with
   practical mitigations, protocol selection guidance, and a summary of
   formal analysis results identified as relevant to the security of
   cross-device flows.  It serves as a security guide to system
   designers, architects, product managers, security specialists, fraud
   analysts and engineers implementing cross-device flows.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-cross-device-security-05"/>
        </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" target="http://www.iana.org/assignments/oauth-parameters">
          <front>
            <title>OAuth Parameters</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.JWT">
          <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="SHS" target="http://dx.doi.org/10.6028/NIST.FIPS.180-4">
          <front>
            <title>"Secure Hash Standard (SHS)", FIPS PUB 180-4, DOI 10.6028/NIST.FIPS.180-4</title>
            <author initials="N. I. of S. and" surname="Technology" fullname="National Institute of Standards and Technology">
              <organization/>
            </author>
            <date year="2015" month="August"/>
          </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="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>
        <reference anchor="I-D.ietf-oauth-browser-based-apps">
          <front>
            <title>OAuth 2.0 for Browser-Based Apps</title>
            <author fullname="Aaron Parecki" initials="A." surname="Parecki">
              <organization>Okta</organization>
            </author>
            <author fullname="David Waite" initials="D." surname="Waite">
              <organization>Ping Identity</organization>
            </author>
            <author fullname="Philippe De Ryck" initials="P." surname="De Ryck">
              <organization>Pragmatic Web Security</organization>
            </author>
            <date day="28" month="February" year="2024"/>
            <abstract>
              <t>   This specification details the threats, attack consequences, security
   considerations and best practices that must be taken into account
   when developing browser-based applications that use OAuth 2.0.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the Web Authorization
   Protocol Working Group mailing list (oauth@ietf.org), which is
   archived at https://mailarchive.ietf.org/arch/browse/oauth/.

   Source for this draft and an issue tracker can be found at
   https://github.com/oauth-wg/oauth-browser-based-apps.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-browser-based-apps-17"/>
        </reference>
      </references>
    </references>
    <?line 707?>

<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="passkey">
        <name>Passkey</name>
        <t>A user may log in with a passkey (without a password).</t>
        <ul spacing="normal">
          <li>
            <t>The Client collects the username from the user.</t>
          </li>
          <li>
            <t>The Client sends an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>) including the username.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the username and returns a challenge</t>
          </li>
          <li>
            <t>The Client signs the challenge using the platform authenticator, which results in the user being prompted for verification with biometrics or a PIN.</t>
          </li>
          <li>
            <t>The Client sends the signed challenge, username, and credential ID to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>).</t>
          </li>
          <li>
            <t>The Authorization Server verifies the signed challenge and returns an Authorization Code.</t>
          </li>
          <li>
            <t>The Client requests an Access Token and Refresh Token by issuing a Token Request (<xref target="token-request"/>) to the Token Endpoint.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the Authorization Code and issues the requested tokens.</t>
          </li>
        </ul>
      </section>
      <section anchor="redirect-to-authorization-server">
        <name>Redirect to Authorization Server</name>
        <t>A user may be redirected to the Authorization Server to perfrom an account reset.</t>
        <ul spacing="normal">
          <li>
            <t>The Client collects username from the user.</t>
          </li>
          <li>
            <t>The Client sends an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>) including the username.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the username and determines that the account is locked and returns a Redirect error response.</t>
          </li>
          <li>
            <t>The Client parses the redirect message, opens a browser and redirects the user to the Authorization Server performing an OAuth 2.0 flow with PKCE.</t>
          </li>
          <li>
            <t>The user resets their account by performing a multi-step authentication flow with the Authorization Server.</t>
          </li>
          <li>
            <t>The Authorization Server issues an Authorization Code in a redirect back to the client, which then exchanges it for an access and refresh token.</t>
          </li>
        </ul>
      </section>
      <section anchor="passwordless-one-time-password-otp">
        <name>Passwordless One-Time Password (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>
            <t>The Client collects username and OTP from user.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the username and OTP and returns an Authorization Code.</t>
          </li>
          <li>
            <t>The Client requests an Access Token and Refresh Token by issuing a Token Request (<xref target="token-request"/>) to the Token Endpoint.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the Authorization Code and issues the requested tokens.</t>
          </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 required 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>
            <t>The Client collects an e-mail address from the user.</t>
          </li>
          <li>
            <t>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"/>).</t>
          </li>
          <li>
            <t>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": "insufficient_authorization"</tt>, <tt>"auth_session"</tt> and a custom property indicating that an e-mail verification code must be entered.</t>
          </li>
          <li>
            <t>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>auth_session</tt> parameter returned in the previous Error Response.</t>
          </li>
          <li>
            <t>The Authorization Server uses the <tt>auth_session</tt> to maintain the session and verifies the e-mail verification code before issuing an Authorization Code to the Client.</t>
          </li>
          <li>
            <t>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the Authorization Code and issues the Access Token and Refresh Token.</t>
          </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 required to enter an 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>
            <t>The Client collects a mobile phone number from the user.</t>
          </li>
          <li>
            <t>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"/>).</t>
          </li>
          <li>
            <t>The Authorization Server sends a confirmation code to the phone number and returns an Error Response (<xref target="challenge-error-response"/>) including <tt>"error": "insufficient_authorization"</tt>, <tt>"auth_session"</tt> and a custom property indicating that a SMS confirmation code must be entered.</t>
          </li>
          <li>
            <t>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>auth_session</tt> parameter returned in the previous Error Response.</t>
          </li>
          <li>
            <t>The Authorization Server uses the <tt>auth_session</tt> to maintain the session context and verifies the SMS code before issuing an Authorization Code to the Client.</t>
          </li>
          <li>
            <t>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the Authorization Code and issues the Access Token and Refresh Token.</t>
          </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>
            <t>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.</t>
          </li>
          <li>
            <t>A week later, the user launches the app and tries to access a protected resource at the Resource Server.</t>
          </li>
          <li>
            <t>The Resource Server responds with an error code indicating an invalid access token since it has expired.</t>
          </li>
          <li>
            <t>The Client presents the refresh token to the Authorization Server to obtain a new access token (section 6 <xref target="RFC6749"/>)</t>
          </li>
          <li>
            <t>The Authorization Server responds with an error code indicating that an OTP from the user is required, as well as an <tt>auth_session</tt>.</t>
          </li>
          <li>
            <t>The Client prompts the user to enter an OTP.</t>
          </li>
          <li>
            <t>The Client sends the OTP and <tt>auth_session</tt> in an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>).</t>
          </li>
          <li>
            <t>The Authorization Server verifies the <tt>auth_session</tt> and OTP, and returns an Authorization Code.</t>
          </li>
          <li>
            <t>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the Authorization Code and issues the requested tokens.</t>
          </li>
          <li>
            <t>The Client presents the new Access Token to the Resource Server in order to access the protected resource.</t>
          </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>
            <t>The Client has a short-lived access token and long-lived refresh token following the completion of an Authorization Code Grant Flow which included user authentication.</t>
          </li>
          <li>
            <t>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>.</t>
          </li>
          <li>
            <t>The Client sends an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>) including the <tt>auth_session</tt>, <tt>acr_values</tt> and <tt>max_age</tt> parameters.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the <tt>auth_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": "insufficient_authorization"</tt> and a custom property indicating that an OTP must be entered.</t>
          </li>
          <li>
            <t>The Client prompts the user for an OTP, which the user obtains and enters.</t>
          </li>
          <li>
            <t>The Client sends an Authorization Challenge Request to the Authorization Challenge Endpoint including the <tt>auth_session</tt> and OTP.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the OTP and returns an Authorization Code.</t>
          </li>
          <li>
            <t>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the Authorization Code and issues an Access Token with the updated <tt>acr</tt> value along with the Refresh Token.</t>
          </li>
          <li>
            <t>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.</t>
          </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>
            <t>The Client collects a username from the user.</t>
          </li>
          <li>
            <t>The Client sends an Authorization Challenge Request (<xref target="challenge-request"/>) to the Authorization Challenge Endpoint (<xref target="authorization-challenge-endpoint"/>) including the username.</t>
          </li>
          <li>
            <t>The Authorization Server returns an Error Response (<xref target="challenge-error-response"/>) including <tt>"error": "insufficient_authorization"</tt>, <tt>"auth_session"</tt>, and a custom property indicating that an e-mail address must be collected.</t>
          </li>
          <li>
            <t>The Client collects an e-mail address from the user.</t>
          </li>
          <li>
            <t>The Client sends the e-mail address as part of a second Authorization Challenge Request to the Authorization Challenge Endpoint, along with the <tt>auth_session</tt> parameter.</t>
          </li>
          <li>
            <t>The Authorization Server sends a verification code to the e-mail address and returns an Error Response including <tt>"error": "insufficient_authorization"</tt>, <tt>"auth_session"</tt> and a custom property indicating that an e-mail verification code must be entered.</t>
          </li>
          <li>
            <t>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>auth_session</tt> parameter returned in the previous Error Response.</t>
          </li>
          <li>
            <t>The Authorization Server uses the <tt>auth_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": "insufficient_authorization"</tt>, <tt>"auth_session"</tt> and a custom property indicating that a phone number must be collected.</t>
          </li>
          <li>
            <t>The Client collects a mobile phone number from the user.</t>
          </li>
          <li>
            <t>The Client sends the phone number in an Authorization Challenge Request to the Authorization Challenge Endpoint, along with the <tt>auth_session</tt>.</t>
          </li>
          <li>
            <t>The Authorization Server uses the <tt>auth_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": "insufficient_authorization"</tt>, <tt>"auth_session"</tt> and a custom property indicating that a SMS confirmation code must be entered.</t>
          </li>
          <li>
            <t>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>auth_session</tt> parameter returned in the previous Error Response.</t>
          </li>
          <li>
            <t>The Authorization Server uses the <tt>auth_session</tt> to maintain the session context, and verifies the SMS verification code before issuing an Authorization Code to the Client.</t>
          </li>
          <li>
            <t>The Client sends the Authorization Code in a Token Request (<xref target="token-request"/>) to the Token Endpoint.</t>
          </li>
          <li>
            <t>The Authorization Server verifies the Authorization Code and issues the requested tokens.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="example-implementations">
      <name>Example Implementations</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",
  "auth_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

auth_session=ce6772f5e07bc8361572f
&otp=555121
]]></artwork>
        <t>The Authorization Server validates the <tt>auth_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 anchor="design-goals">
      <name>Design Goals</name>
      <t>Rather than extend the OAuth token endpoint with additional grant types, this specification defines a new authorization flow the client can use to obtain an authorization flow. There are two primary reasons for designing the specification this way.</t>
      <t>This enables existing OAuth implementations to make fewer modifications to existing code by not needing to extend the token endpoint with new logic. Instead, the new logic can be encapsulated in an entirely new endpoint, the output of which is an authorization code which can be redeemed for an access token at the existing token endpoint.</t>
      <t>This also mirrors more closely the existing architecture of the redirect-based authorization code flow. In the authorization code flow, the client first initiates a request by redirecting a browser to the authorization endpoint, at which point the authorization server takes over with its own custom logic to authenticate the user in whatever way appropriate. Afterwards, the authorization server redirects the user back to the client application with an authorization code in the query string. This specification mirrors the existing approach by having the client first make a POST request to the "authorization challenge endpoint", at which point the authorization server provides its own custom logic to authenticate the user, eventually returning an authorization code.</t>
      <t>These design decisions should enable authorization server implementations to isolate and encapsulate the changes needed to support this specification.</t>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Added clarification on use of authorization code binding when using DPoP with the authorization challenge endpoint.</t>
        </li>
        <li>
          <t>Removed ash claim to simplify DPoP binding with auth_session value.</t>
        </li>
        <li>
          <t>Fixed how "redirect to web" mechanism works with PKCE.</t>
        </li>
        <li>
          <t>Added "intermediate requests" section to clarify these requests are out of scope, moved "auth session" description to that section.</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Renamed <tt>authorization_required</tt> to <tt>insufficient_authorization</tt></t>
        </li>
        <li>
          <t>Defined <tt>insufficient_authorization</tt> on the Authorization Challenge Endpoint</t>
        </li>
        <li>
          <t>Renamed <tt>device_session</tt> to <tt>auth_session</tt></t>
        </li>
        <li>
          <t>Added explicit method to indicate the client should restart the flow in a browser</t>
        </li>
        <li>
          <t>Described how to use DPoP in conjunction with this spec</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the attendees of the OAuth Security Workshop 2023 session in which this was discussed, as well as the following individuals who contributed ideas, feedback, and wording that shaped and formed the final specification:</t>
      <t>Brian Campbell, Dick Hardt, Dmitry Telegin, John Bradley, Justin Richer, Mike Jones, Orie Steele, Tobias Looker.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
89lW83EZBf4Jz5fv/FGc5f4O/7YmYYEHvNHe0u9+ijYPthg18VeYiENd4OnA
/uHfH376qbWjn2gtZzUe1k+8XA6VMStvw+Unb438FY6CLIh28wd4Qu5M/NPv
w4uhUazN247iH4D5uHkYhG57kb2j4JTkTHijjZOfOAr922/D5RcfZfPoM8El
hHX3G6UH6+65lsC/e47Si3V3X8vm860WDei6jf07IteIj3WhXd4fLr/hUTZf
bDEv/LvXYlDWfn+/M7oFd51VfjruusTul8Ddl4C7jjgl338C7gZ2FPqun6sF
/oX5NPD+6EV6uSrVvhe86chsDY+jERuGIOltkcs4EIxREZOLtWt2gIKTo1wb
84l44TbQKA6C/UY8XtV1kVMAg7je8flOh7v108E3acmBdXEynZYUDMA2eoyk
GeF6n/F6ZY3a31sFLHPa1wXLXiRXrPWiX//evvm4WHL8DqoyuFl3K7JDjADx
ogjY1MN7cfawhXs45D0EvThTdJwtKK7GtUK4U4qZYXrXDbBhdgaSp3YRs0vH
m5/VNQk8YFfkVHtYu8IQWo9R4MEIhFUWeI0JKa3dfZGxCc43lagod2/wFhpv
UetkF2lwAhvkgA4MDGFAw37HkLjfFZplEFZyKcjE5gd3sBGSDhOW8KEWP+gS
TYMlGWjCyIzoO16kNX9/Z6zSvrycoz7YIcJ7QgNaG96401KB9gw3U11joEBc
pwtV0a048m7FZYKnWHUBhFFTfFjaRGfMS3Rvi1wNcXSemjCbUJk913CdyGbz
KbeJlvucl3srjEB9XJVkTQlAhEZ64W28Mq76AAAluoZMGOjGpmVYt1AiPnpz
jX39kWZ7GVr3mXbfm7V6XKRzPFTrPA3X0uV32l0t+xIbmR9M4C4dfVoJz0o/
DrrdxK8OftT3yr9W7RCCUg39IYqZZzWXGJKp3ouo4v42DO01EQsOxiTNOIaB
BM34wQ3da4ZNF+VU7PbWAnmGYQpvlw2DhYNiRoF3whIGevvM3u4HANcooM+4
IrjciuUfv/AmGZqrONQhRz+z/bCB1GYk5RB6P2rPNXoEbBDWEdLl02N7k8W0
8EW8++ry+Nvz89P44PQ4lhiVIJIyiyBvV8VvuLRG+IETZyKOD3pSoxfQRoos
GRfTtROQdeFs78GH4c3NzRBJ43BVwnJxO9OLmGmlcAD+I54nFXtOJNCZHsZB
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
7FiN8QAA

-->

</rfc>
