<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-zehavi-oauth-app2app-browserless-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="Native OAuth App2App">OAuth 2.0 App2App Browserless Flow</title>
    <seriesInfo name="Internet-Draft" value="draft-zehavi-oauth-app2app-browserless-03"/>
    <author fullname="Yaron Zehavi">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>yaron.zehavi@rbinternational.com</email>
      </address>
    </author>
    <date year="2025" month="June" day="25"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>native-apps</keyword>
    <keyword>oauth</keyword>
    <keyword>app2app</keyword>
    <keyword>browserless</keyword>
    <abstract>
      <?line 82?>

<t>This document describes a protocol connecting 2 native apps via the OAuth <xref target="App2App"/> pattern, to achieve native user navigation (no web browser required), regardless of any number of OAuth brokers federating the request across trust domains.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://yaron-zehavi.github.io/oauth-app2app-browserless/draft-zehavi-oauth-app2app-browserless.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-zehavi-oauth-app2app-browserless/"/>.
      </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/yaron-zehavi/oauth-app2app-browserless"/>.</t>
    </note>
  </front>
  <middle>
    <?line 86?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document, <em>OAuth 2.0 App2App Browserless Flow</em> (Native App2App), presents a protocol enabling native OAuth <xref target="App2App"/> <strong>browser-less</strong> navigation across apps.</t>
      <t>It addresses the challenges presented when using a web browser to navigate through <strong>one or more</strong> Brokering Authorization Servers:</t>
      <ul spacing="normal">
        <li>
          <t>Such <em>OAuth Brokers</em> are required when <em>Client App</em> is not an OAuth client of the <em>User-Interacting Authorization Server</em> and so they federate the flow across trust domains.</t>
        </li>
        <li>
          <t>Since no app owns <em>OAuth Brokers'</em> urls, App2App flows involving brokers require a web browser, which degrades the user experience.</t>
        </li>
      </ul>
      <t>This document specifies:</t>
      <ul spacing="normal">
        <li>
          <t>A new parameter to the authorization endpoint: <strong>native_callback_uri</strong>.</t>
        </li>
        <li>
          <t>A new scope value: <strong>app2app</strong>.</t>
        </li>
        <li>
          <t>A new error_description value: <strong>native_callback_uri_not_claimed</strong>.</t>
        </li>
      </ul>
      <section anchor="difference-from-openidnative-sso">
        <name>Difference from OpenID.Native-SSO</name>
        <t><xref target="OpenID.Native-SSO"/> also offers a native SSO flow across apps. However, it is limited to apps:</t>
        <ul spacing="normal">
          <li>
            <t>Published by the same issuer, therefore can securely share information.</t>
          </li>
          <li>
            <t>Using the same Authorization Server.</t>
          </li>
        </ul>
      </section>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>In addition to the terms defined in referenced specifications, this document uses
the following terms:</t>
        <dl>
          <dt>"OAuth":</dt>
          <dd>
            <t>In this document, "OAuth" refers to OAuth 2.0, <xref target="RFC6749"/> and <xref target="RFC6750"/> as well as <xref target="OpenID"/>, both in their <strong>authorization code flow</strong>.</t>
          </dd>
          <dt>"PKCE":</dt>
          <dd>
            <t>Proof Key for Code Exchange (PKCE) <xref target="RFC7636"/>, a mechanism
to prevent various attacks on OAuth authorization codes.</t>
          </dd>
          <dt>"OAuth Broker":</dt>
          <dd>
            <t>A component acting as an Authorization Server for its clients, as well as an OAuth Client towards <em>Downstream Authorization Servers</em>.
Brokers are used to facilitate a trust relationship when there is no direct relation between an OAuth Client and the final Authorization Server where end-user authenticates and authorizes.
This pattern is in current use to establish trust in federation use cases in Academia and in the business world, across corporations.
Note: It is possible OAuth Brokers will be superseded in the future by <xref target="OpenID.Federation"/>, offering dynamic trust establishment.</t>
          </dd>
          <dt>"Client App":</dt>
          <dd>
            <t>A Native app implementing "OAuth 2.0 for Native Apps" <xref target="RFC8252"/> as an OAuth client of <em>Initial Authorization Server</em>. Client's redirect_uri is claimed by the app.</t>
          </dd>
          <dt>"Initial Authorization Server":</dt>
          <dd>
            <t>The Authorization Server of <em>Client App</em> which acts as an <em>OAuth Broker</em> as an OAuth client of a <em>Downstream Authorization Server</em>.</t>
          </dd>
          <dt>"Downstream Authorization Server":</dt>
          <dd>
            <t>An Authorization Server which may be an <em>OAuth Broker</em> or a <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt>"User-Interacting Authorization Server":</dt>
          <dd>
            <t>The Authorization Server which interacts with end-user to perform authentication and authorization.</t>
          </dd>
          <dt>"User-Interacting App":</dt>
          <dd>
            <t>Native App of <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt>"Deep Link":</dt>
          <dd>
            <t>A url claimed by a native application.</t>
          </dd>
          <dt>"Native Callback uri":</dt>
          <dd>
            <t><em>Client App's</em> redirect_uri, claimed as a deep link. This deep link is invoked by <em>User-Interacting App</em> to natively return to <em>Client App</em>.</t>
          </dd>
        </dl>
      </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>
    <section anchor="challenge-of-app2app-with-oauth-brokers">
      <name>Challenge of App2App with OAuth Brokers</name>
      <section anchor="app2app-with-oauth-brokers-requires-a-web-browser">
        <name>App2App with OAuth Brokers requires a web browser</name>
        <figure anchor="app2app-w-brokers-and-browser">
          <name>App2App with brokers and browser (redirects back to Client not depicted)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="696" viewBox="0 0 696 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,320" fill="none" stroke="black"/>
                <path d="M 24,48 L 24,128" fill="none" stroke="black"/>
                <path d="M 24,240 L 24,304" fill="none" stroke="black"/>
                <path d="M 88,136 L 88,160" fill="none" stroke="black"/>
                <path d="M 120,48 L 120,128" fill="none" stroke="black"/>
                <path d="M 136,96 L 136,152" fill="none" stroke="black"/>
                <path d="M 136,168 L 136,224" fill="none" stroke="black"/>
                <path d="M 144,240 L 144,304" fill="none" stroke="black"/>
                <path d="M 152,128 L 152,192" fill="none" stroke="black"/>
                <path d="M 232,128 L 232,192" fill="none" stroke="black"/>
                <path d="M 296,128 L 296,192" fill="none" stroke="black"/>
                <path d="M 416,128 L 416,192" fill="none" stroke="black"/>
                <path d="M 480,128 L 480,208" fill="none" stroke="black"/>
                <path d="M 560,208 L 560,272" fill="none" stroke="black"/>
                <path d="M 648,128 L 648,208" fill="none" stroke="black"/>
                <path d="M 672,96 L 672,224" fill="none" stroke="black"/>
                <path d="M 688,32 L 688,320" fill="none" stroke="black"/>
                <path d="M 8,32 L 688,32" fill="none" stroke="black"/>
                <path d="M 24,48 L 120,48" fill="none" stroke="black"/>
                <path d="M 136,96 L 672,96" fill="none" stroke="black"/>
                <path d="M 24,128 L 120,128" fill="none" stroke="black"/>
                <path d="M 152,128 L 232,128" fill="none" stroke="black"/>
                <path d="M 296,128 L 416,128" fill="none" stroke="black"/>
                <path d="M 480,128 L 648,128" fill="none" stroke="black"/>
                <path d="M 88,160 L 144,160" fill="none" stroke="black"/>
                <path d="M 240,160 L 288,160" fill="none" stroke="black"/>
                <path d="M 424,160 L 472,160" fill="none" stroke="black"/>
                <path d="M 152,192 L 232,192" fill="none" stroke="black"/>
                <path d="M 296,192 L 416,192" fill="none" stroke="black"/>
                <path d="M 480,208 L 648,208" fill="none" stroke="black"/>
                <path d="M 136,224 L 552,224" fill="none" stroke="black"/>
                <path d="M 568,224 L 672,224" fill="none" stroke="black"/>
                <path d="M 24,240 L 144,240" fill="none" stroke="black"/>
                <path d="M 152,272 L 560,272" fill="none" stroke="black"/>
                <path d="M 24,304 L 144,304" fill="none" stroke="black"/>
                <path d="M 8,320 L 688,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="480,160 468,154.4 468,165.6" fill="black" transform="rotate(0,472,160)"/>
                <polygon class="arrowhead" points="296,160 284,154.4 284,165.6" fill="black" transform="rotate(0,288,160)"/>
                <polygon class="arrowhead" points="160,272 148,266.4 148,277.6" fill="black" transform="rotate(180,152,272)"/>
                <polygon class="arrowhead" points="152,160 140,154.4 140,165.6" fill="black" transform="rotate(0,144,160)"/>
                <g class="text">
                  <text x="76" y="84">Client</text>
                  <text x="388" y="84">Mobile</text>
                  <text x="448" y="84">Browser</text>
                  <text x="72" y="100">App</text>
                  <text x="348" y="148">Downstream</text>
                  <text x="560" y="148">User-</text>
                  <text x="192" y="164">Initial</text>
                  <text x="360" y="164">Authorization</text>
                  <text x="564" y="164">Authenticating</text>
                  <text x="80" y="180">Authorization</text>
                  <text x="188" y="180">Broker</text>
                  <text x="264" y="180">Auth.</text>
                  <text x="336" y="180">Servers</text>
                  <text x="448" y="180">Auth.</text>
                  <text x="560" y="180">Authorization</text>
                  <text x="56" y="196">Request</text>
                  <text x="260" y="196">Req.</text>
                  <text x="444" y="196">Req.</text>
                  <text x="556" y="196">Server</text>
                  <text x="88" y="260">User-</text>
                  <text x="84" y="276">Authenticating</text>
                  <text x="88" y="292">App</text>
                  <text x="308" y="292">Deep</text>
                  <text x="348" y="292">Link</text>
                  <text x="324" y="340">Mobile</text>
                  <text x="380" y="340">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+------------------------------------------------------------------------------------+
| +-----------+                                                                      |
| |           |                                                                      |
| |   Client  |                              Mobile Browser                          |
| |    App    | +------------------------------------------------------------------+ |
| |           | |                                                                  | |
| +-----------+ | +---------+       +--------------+       +--------------------+  | |
|         |     | |         |       | Downstream   |       |       User-        |  | |
|         +------>| Initial |------>| Authorization|------>|   Authenticating   |  | |
|  Authorization| | Broker  | Auth. | Servers      | Auth. |   Authorization    |  | |
|  Request      | +---------+ Req.  +--------------+ Req.  |      Server        |  | |
|               |                                          +---------+----------+  | |
|               +----------------------------------------------------|-------------+ |
| +--------------+                                                   |               |
| |     User-    |                                                   |               |
| |Authenticating|<--------------------------------------------------+               |
| |      App     |                  Deep Link                                        |
| +--------------+                                                                   |
+------------------------------------------------------------------------------------+
                                     Mobile Device
]]></artwork>
          </artset>
        </figure>
        <t>Since no native app claims <em>OAuth Brokers'</em> urls, OAuth requests and redirect_uri responses to and from <em>OAuth Brokers</em> are handled by a web browser as the User Agent.</t>
      </section>
      <section anchor="impact-of-using-a-web-browser">
        <name>Impact of using a web browser</name>
        <t>Using a web browser may degrade the user experience in several ways:</t>
        <ul spacing="normal">
          <li>
            <t>Some browser's support for deep links is limited by design, or by the settings used.</t>
          </li>
          <li>
            <t>The browser may prompt end-user for consent before opening deep links, introducing additional friction.</t>
          </li>
          <li>
            <t>Browser's loading of urls and redirecting may be noticeable by end-user, rendering the UX less smooth.</t>
          </li>
          <li>
            <t>App developers cannot control which browser will handle the response redirect_uri. This poses a risk that necessary cookies used to bind session identifiers to the user agent (nonce, state or PKCE verifier) will be unavailable, which may break the flow.</t>
          </li>
          <li>
            <t>After the flow is complete, "orphan" browser tabs might remain. While they do not directly impact the flow, they can be regarded as unnecessary "clutter".</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="app2web-with-brokers">
      <name>App2Web with brokers</name>
      <figure anchor="app2web-w-brokers">
        <name>App2Web with brokers (redirects back to Client not depicted)</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="696" viewBox="0 0 696 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,304" fill="none" stroke="black"/>
              <path d="M 24,48 L 24,128" fill="none" stroke="black"/>
              <path d="M 88,136 L 88,160" fill="none" stroke="black"/>
              <path d="M 120,48 L 120,128" fill="none" stroke="black"/>
              <path d="M 136,96 L 136,152" fill="none" stroke="black"/>
              <path d="M 136,168 L 136,288" fill="none" stroke="black"/>
              <path d="M 152,128 L 152,192" fill="none" stroke="black"/>
              <path d="M 232,128 L 232,192" fill="none" stroke="black"/>
              <path d="M 296,128 L 296,192" fill="none" stroke="black"/>
              <path d="M 416,128 L 416,192" fill="none" stroke="black"/>
              <path d="M 480,128 L 480,208" fill="none" stroke="black"/>
              <path d="M 496,208 L 496,272" fill="none" stroke="black"/>
              <path d="M 632,208 L 632,272" fill="none" stroke="black"/>
              <path d="M 648,128 L 648,208" fill="none" stroke="black"/>
              <path d="M 672,96 L 672,288" fill="none" stroke="black"/>
              <path d="M 688,32 L 688,304" fill="none" stroke="black"/>
              <path d="M 8,32 L 688,32" fill="none" stroke="black"/>
              <path d="M 24,48 L 120,48" fill="none" stroke="black"/>
              <path d="M 136,96 L 672,96" fill="none" stroke="black"/>
              <path d="M 24,128 L 120,128" fill="none" stroke="black"/>
              <path d="M 152,128 L 232,128" fill="none" stroke="black"/>
              <path d="M 296,128 L 416,128" fill="none" stroke="black"/>
              <path d="M 480,128 L 648,128" fill="none" stroke="black"/>
              <path d="M 88,160 L 144,160" fill="none" stroke="black"/>
              <path d="M 240,160 L 288,160" fill="none" stroke="black"/>
              <path d="M 424,160 L 472,160" fill="none" stroke="black"/>
              <path d="M 152,192 L 232,192" fill="none" stroke="black"/>
              <path d="M 296,192 L 416,192" fill="none" stroke="black"/>
              <path d="M 480,208 L 648,208" fill="none" stroke="black"/>
              <path d="M 496,272 L 632,272" fill="none" stroke="black"/>
              <path d="M 136,288 L 672,288" fill="none" stroke="black"/>
              <path d="M 8,304 L 688,304" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="480,160 468,154.4 468,165.6" fill="black" transform="rotate(0,472,160)"/>
              <polygon class="arrowhead" points="296,160 284,154.4 284,165.6" fill="black" transform="rotate(0,288,160)"/>
              <polygon class="arrowhead" points="152,160 140,154.4 140,165.6" fill="black" transform="rotate(0,144,160)"/>
              <g class="text">
                <text x="76" y="84">Client</text>
                <text x="388" y="84">Mobile</text>
                <text x="448" y="84">Browser</text>
                <text x="72" y="100">App</text>
                <text x="348" y="148">Downstream</text>
                <text x="560" y="148">User-</text>
                <text x="192" y="164">Initial</text>
                <text x="360" y="164">Authorization</text>
                <text x="564" y="164">Authenticating</text>
                <text x="80" y="180">Authorization</text>
                <text x="188" y="180">Broker</text>
                <text x="264" y="180">Auth.</text>
                <text x="336" y="180">Servers</text>
                <text x="448" y="180">Auth.</text>
                <text x="560" y="180">Authorization</text>
                <text x="56" y="196">Request</text>
                <text x="260" y="196">Req.</text>
                <text x="444" y="196">Req.</text>
                <text x="556" y="196">Server</text>
                <text x="560" y="228">User-</text>
                <text x="564" y="244">Authenticating</text>
                <text x="552" y="260">Web</text>
                <text x="580" y="260">UI</text>
                <text x="324" y="324">Mobile</text>
                <text x="380" y="324">Device</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+------------------------------------------------------------------------------------+
| +-----------+                                                                      |
| |           |                                                                      |
| |   Client  |                              Mobile Browser                          |
| |    App    | +------------------------------------------------------------------+ |
| |           | |                                                                  | |
| +-----------+ | +---------+       +--------------+       +--------------------+  | |
|         |     | |         |       | Downstream   |       |       User-        |  | |
|         +------>| Initial |------>| Authorization|------>|   Authenticating   |  | |
|  Authorization| | Broker  | Auth. | Servers      | Auth. |   Authorization    |  | |
|  Request      | +---------+ Req.  +--------------+ Req.  |      Server        |  | |
|               |                                          +-+----------------+-+  | |
|               |                                            |     User-      |    | |
|               |                                            | Authenticating |    | |
|               |                                            |     Web UI     |    | |
|               |                                            +----------------+    | |
|               +------------------------------------------------------------------+ |
+------------------------------------------------------------------------------------+
                                     Mobile Device
]]></artwork>
        </artset>
      </figure>
      <t>End-user's device may not have an app claiming <em>User-Interacting Authorization Server's</em> urls, when:</t>
      <ul spacing="normal">
        <li>
          <t><em>User-Interacting Authorization Server</em> offers no native app.</t>
        </li>
        <li>
          <t>Or such an app is offered, but is not installed on the end-user's device.</t>
        </li>
      </ul>
      <t>In such case interacting with <em>User-Interacting Authorization Server's</em> <bcp14>MUST</bcp14> use the browser as user agent.
This is similar to the flow described in "OAuth 2.0 for Native Apps" <xref target="RFC8252"/>, and referred to in <xref target="App2App"/> as <strong>App2Web</strong>, and is therefore not discussed further in this document.</t>
    </section>
    <section anchor="browser-less-app2app-with-oauth-brokers">
      <name>Browser-less App2App with OAuth Brokers</name>
      <section anchor="flow-diagram">
        <name>Flow Diagram</name>
        <figure anchor="app2app-browserless-w-brokers">
          <name>Browser-less App2App with Brokers</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="448" width="424" viewBox="0 0 424 448" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,416" fill="none" stroke="black"/>
                <path d="M 24,96 L 24,160" fill="none" stroke="black"/>
                <path d="M 24,320 L 24,400" fill="none" stroke="black"/>
                <path d="M 40,168 L 40,312" fill="none" stroke="black"/>
                <path d="M 72,168 L 72,312" fill="none" stroke="black"/>
                <path d="M 104,168 L 104,224" fill="none" stroke="black"/>
                <path d="M 120,64 L 120,88" fill="none" stroke="black"/>
                <path d="M 120,168 L 120,208" fill="none" stroke="black"/>
                <path d="M 144,96 L 144,160" fill="none" stroke="black"/>
                <path d="M 160,320 L 160,400" fill="none" stroke="black"/>
                <path d="M 264,48 L 264,144" fill="none" stroke="black"/>
                <path d="M 264,192 L 264,288" fill="none" stroke="black"/>
                <path d="M 264,320 L 264,400" fill="none" stroke="black"/>
                <path d="M 392,48 L 392,144" fill="none" stroke="black"/>
                <path d="M 392,192 L 392,288" fill="none" stroke="black"/>
                <path d="M 392,320 L 392,400" fill="none" stroke="black"/>
                <path d="M 416,32 L 416,416" fill="none" stroke="black"/>
                <path d="M 8,32 L 416,32" fill="none" stroke="black"/>
                <path d="M 264,48 L 392,48" fill="none" stroke="black"/>
                <path d="M 120,64 L 256,64" fill="none" stroke="black"/>
                <path d="M 24,96 L 144,96" fill="none" stroke="black"/>
                <path d="M 152,112 L 256,112" fill="none" stroke="black"/>
                <path d="M 152,128 L 256,128" fill="none" stroke="black"/>
                <path d="M 264,144 L 392,144" fill="none" stroke="black"/>
                <path d="M 24,160 L 144,160" fill="none" stroke="black"/>
                <path d="M 264,192 L 392,192" fill="none" stroke="black"/>
                <path d="M 120,208 L 256,208" fill="none" stroke="black"/>
                <path d="M 104,224 L 256,224" fill="none" stroke="black"/>
                <path d="M 264,288 L 392,288" fill="none" stroke="black"/>
                <path d="M 24,320 L 160,320" fill="none" stroke="black"/>
                <path d="M 264,320 L 392,320" fill="none" stroke="black"/>
                <path d="M 168,352 L 256,352" fill="none" stroke="black"/>
                <path d="M 24,400 L 160,400" fill="none" stroke="black"/>
                <path d="M 264,400 L 392,400" fill="none" stroke="black"/>
                <path d="M 8,416 L 416,416" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="264,352 252,346.4 252,357.6" fill="black" transform="rotate(0,256,352)"/>
                <polygon class="arrowhead" points="264,224 252,218.4 252,229.6" fill="black" transform="rotate(0,256,224)"/>
                <polygon class="arrowhead" points="264,208 252,202.4 252,213.6" fill="black" transform="rotate(0,256,208)"/>
                <polygon class="arrowhead" points="264,112 252,106.4 252,117.6" fill="black" transform="rotate(0,256,112)"/>
                <polygon class="arrowhead" points="264,64 252,58.4 252,69.6" fill="black" transform="rotate(0,256,64)"/>
                <polygon class="arrowhead" points="176,352 164,346.4 164,357.6" fill="black" transform="rotate(180,168,352)"/>
                <polygon class="arrowhead" points="160,128 148,122.4 148,133.6" fill="black" transform="rotate(180,152,128)"/>
                <polygon class="arrowhead" points="128,168 116,162.4 116,173.6" fill="black" transform="rotate(270,120,168)"/>
                <polygon class="arrowhead" points="112,168 100,162.4 100,173.6" fill="black" transform="rotate(270,104,168)"/>
                <polygon class="arrowhead" points="80,312 68,306.4 68,317.6" fill="black" transform="rotate(90,72,312)"/>
                <polygon class="arrowhead" points="48,168 36,162.4 36,173.6" fill="black" transform="rotate(270,40,168)"/>
                <g class="text">
                  <text x="192" y="52">(8)</text>
                  <text x="328" y="68">Initial</text>
                  <text x="328" y="84">Authorization</text>
                  <text x="192" y="100">(1)</text>
                  <text x="324" y="100">Server</text>
                  <text x="84" y="116">Client</text>
                  <text x="80" y="132">App</text>
                  <text x="300" y="132">(OAuth</text>
                  <text x="360" y="132">Broker)</text>
                  <text x="192" y="148">(2)</text>
                  <text x="192" y="196">(3)</text>
                  <text x="316" y="228">Downstream</text>
                  <text x="192" y="244">(7)</text>
                  <text x="328" y="244">Authorization</text>
                  <text x="304" y="260">Servers</text>
                  <text x="24" y="292">(6)</text>
                  <text x="88" y="292">(4)</text>
                  <text x="328" y="340">User-</text>
                  <text x="96" y="356">User-</text>
                  <text x="332" y="356">Authenticating</text>
                  <text x="92" y="372">Authenticating</text>
                  <text x="192" y="372">(5)</text>
                  <text x="328" y="372">Authorization</text>
                  <text x="96" y="388">App</text>
                  <text x="300" y="388">Server</text>
                  <text x="172" y="436">Mobile</text>
                  <text x="228" y="436">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------+
|                     (8)       +---------------+  |
|             +---------------->|    Initial    |  |
|             |                 | Authorization |  |
| +--------------+    (1)       |    Server     |  |
| |    Client    |------------->|               |  |
| |     App      |<-------------| (OAuth Broker)|  |
| |              |    (2)       +---------------+  |
| +--------------+                                 |
|   ^   |   ^ ^                                    |
|   |   |   | |       (3)       +---------------+  |
|   |   |   | +---------------->|               |  |
|   |   |   +------------------>| Downstream    |  |
|   |   |             (7)       | Authorization |  |
|   |   |                       | Servers       |  |
|   |   |                       |               |  |
|(6)|   |(4)                    +---------------+  |
|   |   v                                          |
| +----------------+            +---------------+  |
| |                |            |     User-     |  |
| |      User-     |<---------->| Authenticating|  |
| | Authenticating |  (5)       | Authorization |  |
| |       App      |            | Server        |  |
| +----------------+            +---------------+  |
+--------------------------------------------------+
                  Mobile Device
]]></artwork>
          </artset>
        </figure>
        <ul spacing="normal">
          <li>
            <t>(1) <em>Client App</em> presents an authorization request to <em>Initial Authorization Server</em>, indicating app2app flow using new scope value <strong>app2app</strong>.</t>
          </li>
          <li>
            <t>(2) <em>Initial Authorization Server</em> returns an authorization request for Downstream Authorization Server, including Client App's redirect_uri as <strong>native_callback_uri</strong>.</t>
          </li>
          <li>
            <t>(3) <em>Client App</em> checks if the returned authorization request url is claimed by an app on the device and if so proceeds to the next step. Otherwise it loops through Downstream Authorization Servers, calling their authorization endpoints and processing their HTTP 3xx redirect responses, until a url claimed by an app on the device is reached.</t>
          </li>
          <li>
            <t>(4) <em>Client App</em> natively invokes <em>User-Interacting App</em>.</t>
          </li>
          <li>
            <t>(5) <em>User-Interacting App</em> authenticates user and authorizes the request.</t>
          </li>
          <li>
            <t>(6) <em>User-Interacting App</em> natively invokes <strong>native_callback_uri</strong> (overriding the request's redirect_uri), providing as a parameter the redirect_uri with its response parameters.</t>
          </li>
          <li>
            <t>(7) <em>Client App</em> loops through Authorization Servers in reverse order, starting from the redirect_uri it received from the <em>User-Interacting App</em>. It calls the first redirect_uri and any subsequent uri obtained as 3xx redirect directive, until it obtains a location header indicating its own redirect_uri.</t>
          </li>
          <li>
            <t>(8) <em>Client App</em> exchanges code for tokens and the flow is complete.</t>
          </li>
        </ul>
      </section>
      <section anchor="parameters">
        <name>New Parameters and Values</name>
        <t>The protocol described in this document requires <em>User-Interacting App</em> to natively navigate end-user back to Client App, for which it requires Client App's native_callback_uri.</t>
        <t>Therefore this document defines new parameters and values.</t>
        <dl>
          <dt>"<strong>app2app</strong>":</dt>
          <dd>
            <t>New scope value, used by <em>Client App</em> to request an app2app flow from <em>Initial Authorization Server</em>.</t>
          </dd>
        </dl>
        <t><em>Initial Authorization Server</em>, processing an app2app flow according to this document, <bcp14>MUST</bcp14> provide Client App's redirect_uri as Native Callback uri to <em>Downstream Authorization Server</em> using one of the following options:</t>
        <dl>
          <dt>"<strong>native_callback_uri</strong>":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. New authorization endpoint request parameter. When <strong>native_callback_uri</strong> is provided, structured scope <strong>app2app:native_callback_uri</strong> <bcp14>MUST NOT</bcp14> be provided.</t>
          </dd>
          <dt>"<strong>app2app:{<em>native_callback_uri</em>}</strong>":</dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. New structured scope value including the <strong>app2app</strong> flag as well as the Client's <strong>native_callback_uri</strong>, separated by a colon. When structured scope <strong>app2app:{<em>native_callback_uri</em>}</strong> is provided, <strong>native_callback_uri</strong> <bcp14>MUST NOT</bcp14> be provided.</t>
          </dd>
        </dl>
        <t><strong>native_callback_uri</strong> accepts the following query parameter when invoked by <em>User-Interacting Authorization Server's App</em>:</t>
        <dl>
          <dt>"<strong>redirect_uri</strong>":</dt>
          <dd>
            <t>url-encoded OAuth redirect_uri with its response parameters.</t>
          </dd>
        </dl>
        <t><em>Downstream Authorization Server</em>, processing an app2app flow according to this document:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> retain the <strong>native_callback_uri</strong> in downstream authorization requests created.</t>
          </li>
          <li>
            <t><bcp14>MAY</bcp14> validate <strong>native_callback_uri</strong>.</t>
          </li>
        </ul>
      </section>
      <section anchor="validation-of-nativecallbackuri">
        <name>Validation of native_callback_uri</name>
        <t>Validation of <strong>native_callback_uri</strong> by <em>User-Interacting Authorization Server</em> and its App is <bcp14>RECOMMENDED</bcp14>, to mitiagte open redirection attacks.</t>
        <t>A validating Authorization Server <bcp14>MAY</bcp14> use various mechanisms outside the scope of this document.
For example, validation using <xref target="OpenID.Federation"/> is possible:</t>
        <ul spacing="normal">
          <li>
            <t>Strip url path from <strong>native_callback_uri</strong> (retaining the DNS domain).</t>
          </li>
          <li>
            <t>Add the url path /.well-known/openid-federation and perform trust chain resolution.</t>
          </li>
          <li>
            <t>Inspect Client's metadata for redirect_uri's and validate <strong>native_callback_uri</strong> is included.</t>
          </li>
        </ul>
      </section>
      <section anchor="protocol-flow">
        <name>Protocol Flow</name>
        <section anchor="client-app-calls-initial-authorization-server">
          <name>Client App calls Initial Authorization Server</name>
          <t>Client App calls Initial Authorization Server's authorization_endpoint to initiate an authorization code flow and indicates App2App flow using the scope: <strong>app2app</strong>.</t>
        </section>
        <section anchor="initial-authorization-server-returns-authorization-request-to-downstream-authorization-server">
          <name>Initial Authorization Server returns authorization request to Downstream Authorization Server</name>
          <t><em>Initial Authorization Server</em> <bcp14>SHALL</bcp14> process Client's request and return an HTTP 3xx response with a Location header containing an authorization request url towards <em>Downstream Authorization Server's</em> authorization_endpoint.
The request <bcp14>SHALL</bcp14> include Client's redirect_uri as <strong>native_callback_uri</strong> in one of the methods specified in this document.</t>
        </section>
        <section anchor="client-app-invokes-app-of-user-interacting-authorization-server">
          <name>Client App invokes app of User-Interacting Authorization Server</name>
          <t>Client App <bcp14>SHALL</bcp14> use OS mechanisms to locate an app installed on the device claiming the authorization request url.
If so, <em>Client App</em> <bcp14>SHALL</bcp14> natively invoke the app claiming the url to process the authorization request. This achieves native navigation across applications.
If an app handling the authorization request url is not found, <em>Client App</em> <bcp14>SHALL</bcp14> use HTTP to call the authorization request url and process the response:</t>
          <ul spacing="normal">
            <li>
              <t>If the response is successful (HTTP Code 2xx), it is assumed to be the User-Interacting Authorization Server. This means the <em>Client App</em> "over-stepped" and <bcp14>MUST</bcp14> downgrade to App2Web.</t>
            </li>
            <li>
              <t>If the response is a redirect instruction (HTTP Code 3xx + Location header), <em>Client App</em> <bcp14>SHALL</bcp14> repeat the logic previously described:  </t>
              <ul spacing="normal">
                <li>
                  <t>Check if an app owns the obtained url, and if so natively invoke it.</t>
                </li>
                <li>
                  <t>Otherwise use HTTP to call the obtained url and analyze the response.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Handle error response (HTTP 4xx / 5xx) for example by displaying the error.</t>
            </li>
          </ul>
          <t>As the <em>Client App</em> traverses through Brokers, it <bcp14>SHALL</bcp14> maintain a list of all the DNS domains it traverses, which serves later as the Allowlist when traversing the response.</t>
          <section anchor="downgrade-to-app2web">
            <name>Downgrade to App2Web</name>
            <t>If <em>Client App</em> reaches a <em>User-Interacting Authorization Server</em> but failed to locate an app claiming its urls, it may be impossible to relaunch the last authorization request on the browser as it might have included a single-use "OAuth 2.0 Pushed Authorization Requests" <xref target="RFC9126"/> request_uri which by now has been used and is therefore invalid.</t>
            <t>In such a case the <em>Client App</em> <bcp14>MUST</bcp14> start over, generating a new authorization request without the <strong>app2app</strong> scope, which is then launched on the browser.
The remaining flow follows "OAuth 2.0 for Native Apps" <xref target="RFC8252"/> and is therefore not elaborated further in this document.</t>
          </section>
        </section>
        <section anchor="processing-by-user-interacting-authorization-servers-app">
          <name>Processing by User-Interacting Authorization Server's App:</name>
          <t>The <em>User-Interacting Authorization Server</em> <bcp14>SHALL</bcp14> handle the authorization request using its native app:</t>
          <ul spacing="normal">
            <li>
              <t>Authenticates end-user and authorizes the request.</t>
            </li>
            <li>
              <t><bcp14>SHALL</bcp14> use <strong>native_callback_uri</strong> to override the request's original redirect_uri:  </t>
              <ul spacing="normal">
                <li>
                  <t><em>User-Interacting Authorization Server's app</em> validates that an app claiming <strong>native_callback_uri</strong> is on the device</t>
                </li>
                <li>
                  <t>If so it natively invokes <strong>native_callback_uri</strong> with the redirect url and its response parameters as the url-encoded query parameter <strong>redirect_uri</strong>.</t>
                </li>
                <li>
                  <t>If such an app does not exist on the device, the flow terminates and <em>User-Interacting Authorization Server's app</em> redirects to redirect_uri with:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>error=invalid_request.</t>
                    </li>
                    <li>
                      <t>error_description=<strong>native_callback_uri_not_claimed</strong>.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="client-app-traverses-oauth-brokers-in-reverse-order">
          <name>Client App traverses OAuth Brokers in reverse order</name>
          <t><em>Client App</em> is natively invoked by <em>User-Interacting Authorization Server App</em>, with the request's redirect_uri.</t>
          <t><em>Client App</em> <bcp14>MUST</bcp14> validate this url, and any url subsequently obtained via a 3xx redirect instruction, against the Allowlist it previously generated, and <bcp14>MUST</bcp14> fail if any url is not included in the Allowlist.</t>
          <t><em>Client App</em> <bcp14>SHALL</bcp14> invoke the url it received using HTTP GET:</t>
          <ul spacing="normal">
            <li>
              <t>If the response is a redirect instruction (HTTP Code 3xx + Location header), <em>Client App</em> <bcp14>SHALL</bcp14> repeat the logic and proceed to call obtained urls until reaching its own redirect_uri (<strong>native_callback_uri</strong>).</t>
            </li>
            <li>
              <t><bcp14>SHALL</bcp14> handle any other HTTP code (2xx / 4xx / 5xx) as a failure.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-app-obtains-response">
          <name>Client App obtains response</name>
          <t>Once <em>Client App's</em> own redirect_uri is returned in a redirect 3xx directive, the traversal of OAuth Brokers is complete.</t>
          <t><em>Client App</em> <bcp14>SHALL</bcp14> proceed according to OAuth to exchange code for tokens, or handle error responses.</t>
        </section>
      </section>
    </section>
    <section anchor="detecting-presence-of-native-apps-claiming-urls">
      <name>Detecting Presence of Native Apps claiming Urls</name>
      <t>Native Apps on iOS and Android <bcp14>MAY</bcp14> use OS SDK's to detect if an app owns a url.
The general method is the same - App calls an SDK to open the url as deep link and handles an exception thrown if no matching app is found.</t>
      <section anchor="android">
        <name>Android</name>
        <t>App <bcp14>SHALL</bcp14> invoke Android <xref target="android.method.intent"/> method with FLAG_ACTIVITY_REQUIRE_NON_BROWSER, which throws ActivityNotFoundException if no matching app is found.</t>
      </section>
      <section anchor="ios">
        <name>iOS</name>
        <t>App <bcp14>SHALL</bcp14> invoke iOS <xref target="iOS.method.openUrl"/> method with options <xref target="iOS.option.universalLinksOnly"/> which ensures URLs must be universal links and have an app configured to open them.
Otherwise the method returns false in completion.success</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="oauth-request-forgery-and-manipulation">
        <name>OAuth request forgery and manipulation</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that <em>Client App</em> acts as a confidential OAuth client.</t>
      </section>
      <section anchor="secure-native-application-communication">
        <name>Secure Native application communication</name>
        <t>If <em>Client App</em> uses a Backend it is <bcp14>RECOMMENDED</bcp14> to communicate with it securely:</t>
        <ul spacing="normal">
          <li>
            <t>Use TLS in up to date versions and ciphers.</t>
          </li>
          <li>
            <t>Use DNSSEC.</t>
          </li>
          <li>
            <t>Perform certificate pinning.</t>
          </li>
        </ul>
      </section>
      <section anchor="deep-link-hijacking">
        <name>Deep link hijacking</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that all apps in this specification shall use https-scheme deep links (Android App Links / iOS universal links). Apps <bcp14>SHOULD</bcp14> implement the most specific package identifiers mitigating deep link hijacking by malicious apps.</t>
      </section>
      <section anchor="open-redirection-by-client-app">
        <name>Open redirection by Client App</name>
        <t>Client App <bcp14>SHALL</bcp14> construct an Allowlist of DNS domains it traverses while processing the request, used to enforce all urls it later traverses during response processing.
This mitigates open redirection attacks as urls not in this Allowlist <bcp14>SHALL</bcp14> be rejected.</t>
        <t>In addition <em>Client App</em> <bcp14>MUST</bcp14> ignore any invocation for response processing which is not in the context of a request it initiated.
It is <bcp14>RECOMMENDED</bcp14> the Allowlist be managed as a single-use object, destructed after each protocol flow ends.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> <em>Client App</em> allows only one OAuth request processing at a time.</t>
      </section>
      <section anchor="open-redirection-by-user-interacting-authorization-servers-app">
        <name>Open redirection by User-Interacting Authorization Server's App</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that User-Interacting Authorization Server's App establishes trust in <strong>native_callback_uri</strong> to mitigate open redirection attacks and reject untrusted urls.</t>
      </section>
      <section anchor="authorization-code-theft-and-injection">
        <name>Authorization code theft and injection</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that PKCE is used and that the code_verifier is tied to the <em>Client App</em> instance.</t>
      </section>
      <section anchor="handling-of-cookies">
        <name>Handling of Cookies</name>
        <t>It can be assumed that Authorization Servers will use Cookies to bind security elements (state, nonce, PKCE) to the user agent, which will break the flow if these cookies are not present in subsequent HTTP requests.</t>
        <t>Therefore, <em>Client App</em> <bcp14>MUST</bcp14> handle Cookies:</t>
        <ul spacing="normal">
          <li>
            <t>Store cookies it obtains on HTTP responses.</t>
          </li>
          <li>
            <t>Send cookies on subsequent HTTP requests to Authorization Servers that returned such cookies.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC6750">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </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="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="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="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. B." 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="OpenID.Federation" target="https://openid.net/specs/openid-federation-1_0.html">
          <front>
            <title>OpenID Federation 1.0</title>
            <author initials="R." surname="Hedberg, Ed">
              <organization/>
            </author>
            <author initials="M. B." surname="Jones">
              <organization/>
            </author>
            <author initials="A. A." surname="Solberg">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="G." surname="De Marco">
              <organization/>
            </author>
            <author initials="V." surname="Dzhuvinov">
              <organization/>
            </author>
            <date year="2025" month="March"/>
          </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="App2App" target="https://openid.net/guest-blog-implementing-app-to-app-authorisation-in-oauth2-openid-connect/">
          <front>
            <title>Guest Blog: Implementing App-to-App Authorisation in OAuth2/OpenID Connect</title>
            <author initials="J." surname="Heenan">
              <organization/>
            </author>
            <date year="2019" month="October"/>
          </front>
        </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="iOS.method.openUrl" target="https://developer.apple.com/documentation/uikit/uiapplication/open(_:options:completionhandler:)">
          <front>
            <title>iOS open(_:options:completionHandler:) Method</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="iOS.option.universalLinksOnly" target="https://developer.apple.com/documentation/uikit/uiapplication/openexternalurloptionskey/universallinksonly">
          <front>
            <title>iOS method property universalLinksOnly</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="android.method.intent" target="https://developer.android.com/reference/android/content/Intent">
          <front>
            <title>Android Intent Method</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 450?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the following individuals who contributed ideas, feedback, and wording that shaped and formed the final specification: Henrik Kroll, Grese Hyseni.
As well as the attendees of the OAuth Security Workshop 2025 session in which this topic was discussed for their ideas and feedback.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
