<?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.3.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-zehavi-oauth-app2app-browserless-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Native OAuth App2App">OAuth 2.0 App2App Browserless Flow</title>
    <seriesInfo name="Internet-Draft" value="draft-zehavi-oauth-app2app-browserless-02"/>
    <author fullname="Yaron Zehavi">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>yaron.zehavi@rbinternational.com</email>
      </address>
    </author>
    <author fullname="Henrik Kroll">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>henrik.kroll@rbinternational.com</email>
      </address>
    </author>
    <author fullname="Grese Hyseni">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>grese.hyseni@rbinternational.com</email>
      </address>
    </author>
    <date year="2025" month="May" day="09"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>native-apps</keyword>
    <keyword>oauth</keyword>
    <keyword>app2app</keyword>
    <keyword>browserless</keyword>
    <abstract>
      <?line 90?>

<t>This document describes a protocol enabling native apps from any app publisher, using the <xref target="App2App"/> pattern, to achieve native user navigation without requiring a web browser.</t>
      <t>The native navigation is retained also when the Client uses any number of OAuth brokers to federate across trust domains, while offering highest levels of security.</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 96?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document, OAuth 2.0 App2App Browserless Flow (Native App2App), presents a protocol enabling native <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 OAuth Brokers are needed when Client App is not an OAuth client of the User-Interacting Authorization Server.</t>
        </li>
        <li>
          <t>Since no app owns OAuth Brokers' urls, App2App flows involving brokers require using a web browser, which degrades the user experience.</t>
        </li>
      </ul>
      <t>This document specifies a new scope.</t>
      <section anchor="difference-from-openidnative-sso">
        <name>Difference from <xref target="OpenID.Native-SSO"/></name>
        <t><xref target="OpenID.Native-SSO"/> also offers a native SSO flow across apps. However, it is limited to apps published by the same issuer which can therefore securely share information.</t>
      </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 currently employed to establish trust in federation use cases, such as in Academia and in the business world across corporations.
Brokers may be replaced in the future with dynamic trust establishment leveraging <xref target="OpenID.Federation"/>.</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 Broker</em>. Client's redirect_uri is claimed by the app.</t>
          </dd>
          <dt>"Initial Broker":</dt>
          <dd>
            <t>An OAuth Broker serving as the Authorization Server of Client App. Is 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>"Deep Link":</dt>
          <dd>
            <t>A url claimed by a native application.</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-brokers">
      <name>Challenge of App2App with 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</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 OAuth Brokers url's are not claimed by any native app, requests targeting them (OAuth requests and redirect_uri responses) are handled by a web browser.</t>
      </section>
      <section anchor="impact-of-using-a-web-browser">
        <name>Impact of using a web browser</name>
        <t>Using a web browser downgrades the user experience in several ways:</t>
        <ul spacing="normal">
          <li>
            <t>Some browsers do not support deep links at all. Others may not support deep links depending on 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>Even if the browser supports deep links and does not prompt the end-user, browser loading of urls and redirecting may be noticeable.</t>
          </li>
          <li>
            <t>The browser may be left after the flow ends with "orphan" browser tabs used for redirection. While these do not impact the process directly, they can be seen as clutter which degrades the overall UX's cleanliness.</t>
          </li>
        </ul>
        <t>In addition, app developers cannot control which browser will be used to handle the response redirect_uri, which risks losing of cookies used to bind session identifiers (nonce, state or PKCE verifier) to the user agent, which may break the flow.</t>
      </section>
    </section>
    <section anchor="app2web">
      <name>App2Web</name>
      <figure anchor="app2web-w-brokers">
        <name>App2Web with brokers</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>When the user's device does not have an app owning the User-Authenticating Authorization Server's urls, the flow requires the help of a browser.</t>
      <t>This is the case when the User-Authenticating Authorization Server offers no native app, or when such an app exists but is not installed on the end-user's device.</t>
      <t>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>.</t>
    </section>
    <section anchor="browser-less-app2app-with-brokers">
      <name>Browser-less App2App with 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) Client App uses HTTP to call Initial Broker's authorization endpoint with an authorization request including <em>app2app</em> scope.</t>
          </li>
          <li>
            <t>(2) Initial Broker returns an authorization request for Downstream Authorization Server including scope app2app:<em>client_app_deep_link</em></t>
          </li>
          <li>
            <t>(3) If the authorization request url is owned by an app on the device this step is skipped. Otherwise Client App loops through Downstream Authorization Servers, using HTTP to call their authorization endpoint and process their HTTP 3xx redirect responses, until a url owned by an app on the device is reached.</t>
          </li>
          <li>
            <t>(4) Client App natively invokes User-Authenticating App.</t>
          </li>
          <li>
            <t>(5) User-Authenticating App authenticates user and authorizes the request. It identifies app2app mode and overrides the request's redirect_uri, using client_app_deep_link instead.</t>
          </li>
          <li>
            <t>(6) User-Authenticating App natively invokes Client App using client_app_deep_link, handing it the redirect_uri.</t>
          </li>
          <li>
            <t>(7) Client App loops through Authorization Servers in reverse order, starting from the redirect_uri it received from the User-Authenticating App. It uses HTTP to call the first redirect_uri and any subsequent uri obtained as 3xx redirect directive, until it obtains a redirect to its own redirect_uri.</t>
          </li>
          <li>
            <t>(8) Client App exchanges code for tokens.</t>
          </li>
        </ul>
      </section>
      <section anchor="protocol-flow">
        <name>Protocol Flow</name>
        <section anchor="client-app-calls-initial-broker">
          <name>Client App calls Initial Broker</name>
          <t>Client App calls Initial Broker's authorization_endpoint to initiate an authorization code flow, it <bcp14>SHALL</bcp14> indicate App2App flow using the dedicated scope <strong>app2app</strong>.</t>
          <t>Client App's redirect_uri <bcp14>SHALL</bcp14> be claimed by the app and will be referred to as <em>client_app_deep_link</em>.</t>
        </section>
        <section anchor="initial-broker-returns-authorization-request-to-downstream-authorization-server">
          <name>Initial Broker returns authorization request to Downstream Authorization Server</name>
          <ul spacing="normal">
            <li>
              <t>Initial Broker <bcp14>SHALL</bcp14> validate Client's request and prepare an authorization request to Downstream Authorization Server's authorization_endpoint.</t>
            </li>
            <li>
              <t>Initial Broker <bcp14>SHALL</bcp14> provide <em>client_app_deep_link</em> to Downstream Authorization Server as a suffix to the dedicated scope <em>app2app</em>. The combined scope is: <em>app2app</em>:<strong>client_app_deep_link</strong>.</t>
            </li>
            <li>
              <t>Initial Broker <bcp14>SHALL</bcp14> respond with HTTP 3xx and the authorization request url towards Downstream Authorization Server in the Location header.</t>
            </li>
          </ul>
        </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, Client App <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, Client App <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 Client App "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), Client App <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 Client App 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="downstream-authorization-servers">
            <name>Downstream Authorization Servers</name>
            <t>Downstream Authorization Servers engaged in the journey <bcp14>MUST</bcp14> retain structured scope <em>app2app</em>:<strong>client_app_deep_link</strong> in downstream authorization requests they create.</t>
          </section>
          <section anchor="downgrade-to-app2web">
            <name>Downgrade to App2Web</name>
            <t>If Client App reaches a User-Interacting Authorization Server 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 Client App <bcp14>MUST</bcp14> start over, generating a new authorization request without the <strong>app2app</strong> scope indication, which is then launched on the browser.
The remaining flow follows "OAuth 2.0 for Native Apps" <xref target="RFC8252"/> and is therefore not further elaborated in this document.</t>
          </section>
        </section>
        <section anchor="processing-by-user-interacting-authorization-server">
          <name>Processing by User-Interacting Authorization Server:</name>
          <t>The User-Interacting Authorization Server <bcp14>SHALL</bcp14> handle the authorization request using its native app:</t>
          <ul spacing="normal">
            <li>
              <t>Native app authenticates end user and authorizes the request.</t>
            </li>
            <li>
              <t>The <em>client_app_deep_link</em> provided in the strcutured scope, <bcp14>SHALL</bcp14> override the request's original redirect_uri:  </t>
              <ul spacing="normal">
                <li>
                  <t>User-Interacting Authorization Server's app <bcp14>SHALL</bcp14> validate that an app claiming <em>client_app_deep_link</em> is on the device</t>
                </li>
                <li>
                  <t>If so it <bcp14>SHALL</bcp14> natively invoke it, handing it the redirect url with its response parameters</t>
                </li>
                <li>
                  <t>If such an app does not exist it is an error and the flow <bcp14>SHALL</bcp14> terminate</t>
                </li>
              </ul>
            </li>
            <li>
              <t>To establish trust towards client_app_deep_link, User-Interacting Authorization Server <bcp14>MAY</bcp14> use mechanisms outside the scope of this document, or <xref target="OpenID.Federation"/>:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>SHALL</bcp14> strip url path from <em>client_app_deep_link</em> (retaining the DNS domain).</t>
                </li>
                <li>
                  <t><bcp14>SHALL</bcp14> add the url path /.well-known/openid-federation and perform trust chain resolution.</t>
                </li>
                <li>
                  <t><bcp14>SHALL</bcp14> inspect Client's metadata for redirect_uri's and validate <em>client_app_deep_link</em> is included.</t>
                </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>Client App is natively invoked by User-Interacting Authorization Server App, with the request's redirect_uri.</t>
          <t>Client App <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>Client App <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), Client App <bcp14>SHALL</bcp14> repeat the logic and proceed to call obtained urls until reaching its own redirect_uri (<em>client_app_deep_link</em>).</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 Client App's own redirect_uri is returned in a redirect 3xx directive, the traversal of OAuth Brokers is complete.</t>
          <t>Client App <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-owning-urls">
      <name>Detecting Presence of Native Apps Owning 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 Client App acts as a confidential OAuth client.</t>
      </section>
      <section anchor="secure-native-application-communication">
        <name>Secure Native application communication</name>
        <t>If Client App 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">
        <name>Open redirection</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 Client App <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> Client App allows only one OAuth request processing at a time.</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 Client App 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, Client App <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 415?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the attendees of the OAuth Security Workshop 2025 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>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
