<?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-00" 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-00"/>
    <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="08"/>
    <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 different app publishers, using the App2App pattern to act as OAuth Client And Authorization Server, native browser-less user navigation.</t>
      <t>The native experience is also retained when the Client uses any number of brokers to federate across trust networks, while retaining 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>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), discusses the <xref target="App2App"/> pattern where two applications act as OAuth Client and Authorization Server respectively, to natively authenticate and authorize an end-user.</t>
      <t>It addresses the challenges introduced when a web browser is involved in OAuth flows through one or more Brokering Authorization Servers, which are needed because Client App is not an OAuth client of the User-Interacting Authorization Server.</t>
      <t>Since no app owns OAuth Brokers' urls, App2App flows involving brokers require using a web browser, which degrades the user experience.</t>
      <t>This document presents a protocol enabling native App2App <strong>browser-less</strong> navigation, through any number of brokers, without compromising on any security property.</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 applications without requiring the browser. However, it is dealing with the specific sub-case when both apps are published by the same issuer and leverage this fact to 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 Downstream Authorization Servers.
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.
Brokers are an established pattern for establishing 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>Native app implementing <xref target="RFC8252"/> as OAuth client of Primary Broker, and whose redirect_uri is claimed as a deep link.</t>
          </dd>
          <dt>"Primary Broker":</dt>
          <dd>
            <t>An OAuth Broker serving as Authorization Server of Client App.
And also an OAuth client of a Downstream Authorization Server.
Primary Broker performs additional handling for App2App use-case, covered in <xref target="protocol-flow"/>.</t>
          </dd>
          <dt>"Downstream Authorization Server":</dt>
          <dd>
            <t>An Authorization Server which may be a <em>Secondary Broker</em> or a <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt>"Secondary Broker":</dt>
          <dd>
            <t>A Broker redirecting the flow, which does not perform user authentication and authorization.</t>
          </dd>
          <dt>"User-Interacting Authorization Server":</dt>
          <dd>
            <t>The Authorization Server which interacts with end-user to perform authentication and authorization. May or may not offer App2App via a native app claiming it's urls as deep links.
Such app may or may not be installed on end-user's device.</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-brokers-requires-a-web-browser">
        <name>App2App with 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 32,64 L 32,128" fill="none" stroke="black"/>
                <path d="M 32,224 L 32,304" fill="none" stroke="black"/>
                <path d="M 120,136 L 120,160" fill="none" stroke="black"/>
                <path d="M 152,64 L 152,128" fill="none" stroke="black"/>
                <path d="M 152,224 L 152,304" fill="none" stroke="black"/>
                <path d="M 200,96 L 200,152" fill="none" stroke="black"/>
                <path d="M 200,168 L 200,256" fill="none" stroke="black"/>
                <path d="M 216,128 L 216,192" fill="none" stroke="black"/>
                <path d="M 296,128 L 296,192" fill="none" stroke="black"/>
                <path d="M 360,128 L 360,192" fill="none" stroke="black"/>
                <path d="M 432,128 L 432,192" fill="none" stroke="black"/>
                <path d="M 496,128 L 496,224" fill="none" stroke="black"/>
                <path d="M 560,232 L 560,288" fill="none" stroke="black"/>
                <path d="M 640,128 L 640,224" fill="none" stroke="black"/>
                <path d="M 656,96 L 656,256" 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 32,64 L 152,64" fill="none" stroke="black"/>
                <path d="M 200,96 L 656,96" fill="none" stroke="black"/>
                <path d="M 32,128 L 152,128" fill="none" stroke="black"/>
                <path d="M 216,128 L 296,128" fill="none" stroke="black"/>
                <path d="M 360,128 L 432,128" fill="none" stroke="black"/>
                <path d="M 496,128 L 640,128" fill="none" stroke="black"/>
                <path d="M 120,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 304,160 L 352,160" fill="none" stroke="black"/>
                <path d="M 440,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 216,192 L 296,192" fill="none" stroke="black"/>
                <path d="M 360,192 L 432,192" fill="none" stroke="black"/>
                <path d="M 32,224 L 152,224" fill="none" stroke="black"/>
                <path d="M 496,224 L 640,224" fill="none" stroke="black"/>
                <path d="M 200,256 L 552,256" fill="none" stroke="black"/>
                <path d="M 568,256 L 656,256" fill="none" stroke="black"/>
                <path d="M 160,288 L 560,288" fill="none" stroke="black"/>
                <path d="M 32,304 L 152,304" fill="none" stroke="black"/>
                <path d="M 8,320 L 688,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="496,160 484,154.4 484,165.6" fill="black" transform="rotate(0,488,160)"/>
                <polygon class="arrowhead" points="360,160 348,154.4 348,165.6" fill="black" transform="rotate(0,352,160)"/>
                <polygon class="arrowhead" points="216,160 204,154.4 204,165.6" fill="black" transform="rotate(0,208,160)"/>
                <polygon class="arrowhead" points="168,288 156,282.4 156,293.6" fill="black" transform="rotate(180,160,288)"/>
                <g class="text">
                  <text x="396" y="84">Mobile</text>
                  <text x="456" y="84">Browser</text>
                  <text x="76" y="100">Client</text>
                  <text x="120" y="100">App</text>
                  <text x="256" y="164">Primary</text>
                  <text x="560" y="164">User-</text>
                  <text x="136" y="180">Authorization</text>
                  <text x="252" y="180">Broker</text>
                  <text x="328" y="180">Auth.</text>
                  <text x="464" y="180">Auth.</text>
                  <text x="564" y="180">Authenticating</text>
                  <text x="128" y="196">Request</text>
                  <text x="324" y="196">Req.</text>
                  <text x="460" y="196">Req.</text>
                  <text x="568" y="196">Authorization</text>
                  <text x="392" y="212">Secondary</text>
                  <text x="564" y="212">Server</text>
                  <text x="384" y="228">Brokers</text>
                  <text x="96" y="260">User-</text>
                  <text x="92" y="276">Authenticating</text>
                  <text x="96" y="292">App</text>
                  <text x="260" y="308">Deep</text>
                  <text x="300" y="308">Link</text>
                  <text x="324" y="340">Mobile</text>
                  <text x="380" y="340">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+------------------------------------------------------------------------------------+
|                                                                                    |
|  +--------------+                                                                  |
|  |              |                           Mobile Browser                         |
|  |  Client App  |     +--------------------------------------------------------+   |
|  |              |     |                                                        |   |
|  +--------------+     | +---------+       +--------+       +-----------------+ |   |
|             |         | |         |       |        |       |                 | |   |
|             +---------->| Primary |------>|        |------>|     User-       | |   |
|         Authorization | | Broker  | Auth. |        | Auth. | Authenticating  | |   |
|           Request     | +---------+ Req.  +--------+ Req.  |  Authorization  | |   |
|                       |                   Secondary        |     Server      | |   |
|  +--------------+     |                   Brokers          +-----------------+ |   |
|  |              |     |                                            |           |   |
|  |     User-    |     +--------------------------------------------|-----------+   |
|  |Authenticating|                                                  |               |
|  |      App     |<-------------------------------------------------+               |
|  +--------------+           Deep Link                                              |
+------------------------------------------------------------------------------------+
                                     Mobile Device
]]></artwork>
          </artset>
        </figure>
        <t>Since OAuth Brokers reside on web domains which no native app claims as Deep Links, OAuth requests to Brokers and responses to Broker's redirect_uri will be 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. The browser may be noticed by end-user as it is loading urls and redirecting to native apps.</t>
        <t>The browser may prompt end-user for consent before opening deep links, introducing additional friction.</t>
        <t>App developers have limited control as to which browser will be opened on the return redirect to the Broker, so any cookies used to bind session identifiers (nonce, state or PKCE verifier) to the user agent may be lost, causing the flow to break.</t>
        <t>Finally, 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>
      </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="368" width="664" viewBox="0 0 664 368" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,336" fill="none" stroke="black"/>
              <path d="M 24,64 L 24,144" fill="none" stroke="black"/>
              <path d="M 88,152 L 88,176" fill="none" stroke="black"/>
              <path d="M 120,64 L 120,144" fill="none" stroke="black"/>
              <path d="M 136,112 L 136,168" fill="none" stroke="black"/>
              <path d="M 136,184 L 136,320" fill="none" stroke="black"/>
              <path d="M 152,144 L 152,208" fill="none" stroke="black"/>
              <path d="M 232,144 L 232,208" fill="none" stroke="black"/>
              <path d="M 296,144 L 296,208" fill="none" stroke="black"/>
              <path d="M 384,144 L 384,208" fill="none" stroke="black"/>
              <path d="M 448,144 L 448,240" fill="none" stroke="black"/>
              <path d="M 464,240 L 464,304" fill="none" stroke="black"/>
              <path d="M 600,240 L 600,304" fill="none" stroke="black"/>
              <path d="M 616,144 L 616,240" fill="none" stroke="black"/>
              <path d="M 640,112 L 640,320" fill="none" stroke="black"/>
              <path d="M 656,32 L 656,336" fill="none" stroke="black"/>
              <path d="M 8,32 L 656,32" fill="none" stroke="black"/>
              <path d="M 24,64 L 120,64" fill="none" stroke="black"/>
              <path d="M 136,112 L 640,112" fill="none" stroke="black"/>
              <path d="M 24,144 L 120,144" fill="none" stroke="black"/>
              <path d="M 152,144 L 232,144" fill="none" stroke="black"/>
              <path d="M 296,144 L 384,144" fill="none" stroke="black"/>
              <path d="M 448,144 L 616,144" fill="none" stroke="black"/>
              <path d="M 88,176 L 144,176" fill="none" stroke="black"/>
              <path d="M 240,176 L 288,176" fill="none" stroke="black"/>
              <path d="M 392,176 L 440,176" fill="none" stroke="black"/>
              <path d="M 152,208 L 232,208" fill="none" stroke="black"/>
              <path d="M 296,208 L 384,208" fill="none" stroke="black"/>
              <path d="M 448,240 L 616,240" fill="none" stroke="black"/>
              <path d="M 464,304 L 600,304" fill="none" stroke="black"/>
              <path d="M 136,320 L 640,320" fill="none" stroke="black"/>
              <path d="M 8,336 L 656,336" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="448,176 436,170.4 436,181.6" fill="black" transform="rotate(0,440,176)"/>
              <polygon class="arrowhead" points="296,176 284,170.4 284,181.6" fill="black" transform="rotate(0,288,176)"/>
              <polygon class="arrowhead" points="152,176 140,170.4 140,181.6" fill="black" transform="rotate(0,144,176)"/>
              <g class="text">
                <text x="76" y="100">Client</text>
                <text x="356" y="100">Mobile</text>
                <text x="416" y="100">Browser</text>
                <text x="72" y="116">App</text>
                <text x="192" y="180">Primary</text>
                <text x="336" y="180">Secondary</text>
                <text x="528" y="180">User-</text>
                <text x="80" y="196">Authorization</text>
                <text x="188" y="196">Broker</text>
                <text x="264" y="196">Auth.</text>
                <text x="336" y="196">Brokers</text>
                <text x="416" y="196">Auth.</text>
                <text x="532" y="196">Authenticating</text>
                <text x="56" y="212">Request</text>
                <text x="260" y="212">Req.</text>
                <text x="412" y="212">Req.</text>
                <text x="528" y="212">Authorization</text>
                <text x="540" y="228">Server</text>
                <text x="528" y="260">User-</text>
                <text x="532" y="276">Authenticating</text>
                <text x="520" y="292">Web</text>
                <text x="548" y="292">UI</text>
                <text x="324" y="356">Mobile</text>
                <text x="380" y="356">Device</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------------------------------------+
|                                                                                |
| +-----------+                                                                  |
| |           |                                                                  |
| |   Client  |                          Mobile Browser                          |
| |    App    | +--------------------------------------------------------------+ |
| |           | |                                                              | |
| +-----------+ | +---------+       +----------+       +--------------------+  | |
|         |     | |         |       |          |       |                    |  | |
|         +------>| Primary |------>|Secondary |------>|       User-        |  | |
|  Authorization| | Broker  | Auth. | Brokers  | Auth. |   Authenticating   |  | |
|  Request      | +---------+ Req.  +----------+ Req.  |   Authorization    |  | |
|               |                                      |        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 as deep links, 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 <xref target="RFC8252"/>, and referred to in <xref target="App2App"/> as <strong>App2Web</strong>.</t>
    </section>
    <section anchor="browser-less-app2app-with-broker">
      <name>Browser-less App2App with Broker</name>
      <section anchor="flow-diagram">
        <name>Flow Diagram</name>
        <figure anchor="app2app-browserless-w-brokers">
          <name>Browser-less App2App with Broker</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="392" viewBox="0 0 392 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,384" fill="none" stroke="black"/>
                <path d="M 24,96 L 24,160" fill="none" stroke="black"/>
                <path d="M 24,304 L 24,368" fill="none" stroke="black"/>
                <path d="M 40,168 L 40,296" fill="none" stroke="black"/>
                <path d="M 72,168 L 72,296" 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,304 L 160,368" fill="none" stroke="black"/>
                <path d="M 264,48 L 264,144" fill="none" stroke="black"/>
                <path d="M 264,192 L 264,272" fill="none" stroke="black"/>
                <path d="M 360,48 L 360,144" fill="none" stroke="black"/>
                <path d="M 360,192 L 360,272" fill="none" stroke="black"/>
                <path d="M 384,32 L 384,384" fill="none" stroke="black"/>
                <path d="M 8,32 L 384,32" fill="none" stroke="black"/>
                <path d="M 264,48 L 360,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 360,144" fill="none" stroke="black"/>
                <path d="M 24,160 L 144,160" fill="none" stroke="black"/>
                <path d="M 264,192 L 360,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,272 L 360,272" fill="none" stroke="black"/>
                <path d="M 24,304 L 160,304" fill="none" stroke="black"/>
                <path d="M 24,368 L 160,368" fill="none" stroke="black"/>
                <path d="M 8,384 L 384,384" fill="none" stroke="black"/>
                <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="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,296 68,290.4 68,301.6" fill="black" transform="rotate(90,72,296)"/>
                <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="192" y="100">(1)</text>
                  <text x="312" y="100">Primary</text>
                  <text x="84" y="116">Client</text>
                  <text x="308" y="116">Broker</text>
                  <text x="80" y="132">App</text>
                  <text x="192" y="148">(2)</text>
                  <text x="192" y="196">(3)</text>
                  <text x="312" y="228">Secondary</text>
                  <text x="192" y="244">(7)</text>
                  <text x="304" y="244">Brokers</text>
                  <text x="24" y="276">(6)</text>
                  <text x="88" y="276">(4)</text>
                  <text x="96" y="324">User-</text>
                  <text x="92" y="340">Authenticating</text>
                  <text x="192" y="340">(5)</text>
                  <text x="96" y="356">App</text>
                  <text x="172" y="404">Mobile</text>
                  <text x="228" y="404">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------------------------------------------+
|                     (8)       +-----------+  |
|             +---------------->|           |  |
|             |                 |           |  |
| +--------------+    (1)       |  Primary  |  |
| |    Client    |------------->|  Broker   |  |
| |     App      |<-------------|           |  |
| |              |    (2)       +-----------+  |
| +--------------+                             |
|   ^   |   ^ ^                                |
|   |   |   | |       (3)       +-----------+  |
|   |   |   | +---------------->|           |  |
|   |   |   +------------------>| Secondary |  |
|   |   |             (7)       | Brokers   |  |
|   |   |                       |           |  |
|(6)|   |(4)                    +-----------+  |
|   |   v                                      |
| +----------------+                           |
| |      User-     |                           |
| | Authenticating |  (5)                      |
| |       App      |                           |
| +----------------+                           |
+----------------------------------------------+
                  Mobile Device
]]></artwork>
          </artset>
        </figure>
        <ul spacing="normal">
          <li>
            <t>(1) Client App uses HTTP to call Primary Broker's authorization endpoint with an authorization request including <em>app2app</em> scope.</t>
          </li>
          <li>
            <t>(2) Primary Broker prepares authorization request for Downstream Authorization Server including scope app2app:<em>client_app_deep_link</em></t>
          </li>
          <li>
            <t>(3) Client App loops through Brokers, natively calling their authorization endpoint over HTTP using previously obtained authorization request urls, and processing their HTTP 3xx redirect directives, until a deep link owned by an app on the device is reached.</t>
          </li>
          <li>
            <t>(4) Client App natively invokes User-Authenticating App via its deep link.</t>
          </li>
          <li>
            <t>(5) User-Authenticating App authenticates user and authorizes the request. It identifies app2app mode and uses client_app_deep_link to override the request's redirect_uri.</t>
          </li>
          <li>
            <t>(6) User-Authenticating App natively invokes Client App using client_app_deep_link, handing it redirect_uri response.</t>
          </li>
          <li>
            <t>(7) Client App loops through Brokers, starting from the redirect_uri it received from User-Authenticating App. It natively calls them using HTTP traversing through their redirect directives, until Primary Broker redirects to Client App's own deep link.</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-primary-broker">
          <name>Client App calls Primary Broker</name>
          <t>Client App calls Primary Broker's authorization_endpoint to initiate an authorization code flow, it <bcp14>SHALL</bcp14> indicate App2App flow using the dedicated scope app2app.</t>
          <t>Client App's redirect_uri <bcp14>SHALL</bcp14> be claimed as a deep link and will be referred to as <em>client_app_deep_link</em>.</t>
        </section>
        <section anchor="primary-broker-returns-authorization-request-to-downstream-authorization-server">
          <name>Primary Broker returns authorization request to Downstream Authorization Server</name>
          <ul spacing="normal">
            <li>
              <t>Primary Broker <bcp14>SHALL</bcp14> validate Client's request and prepare an authorization request to Downstream Authorization Server's authorization_endpoint.</t>
            </li>
            <li>
              <t>Primary Broker <bcp14>SHALL</bcp14> provide <em>client_app_deep_link</em> to Downstream Authorization Server as a suffix to the dedicated scope app2app. The combined scope is: app2app:<strong>client_app_deep_link</strong>.</t>
            </li>
            <li>
              <t>Primary Broker <bcp14>SHALL</bcp14> respond with HTTP 302 with the authorization request url towards Downstream Authorization Server in the Location header.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-app-traverses-brokers-with-request">
          <name>Client App traverses Brokers with request</name>
          <t>Client App <bcp14>SHALL</bcp14> use OS mechanisms to detect if the authorization request URL it received is handled by an app installed on the device.
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> natively call the authorization request URL using HTTP GET and processe 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), a Secondary Broker was reached and 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 natively 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 domains it traverses, which serves later as the Allowlist when traversing the response.</t>
          <section anchor="secondary-brokers">
            <name>Secondary Brokers</name>
            <t>Secondary Brokers engaged in the journey <bcp14>MUST</bcp14> retain structured scope app2app:<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 with no app handling its urls, it may be impossible to relaunch the last authorization request URL on the browser as it might have included a single use 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 App2App indication, which is then launched on the browser.
The remaining flow follows <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 native app <bcp14>SHALL</bcp14> validate that an app owning <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 OpenID Federation:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>SHALL</bcp14> strip url path from <em>client_app_deep_link</em> (retaining the domain).</t>
                </li>
                <li>
                  <t><bcp14>SHALL</bcp14> add 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-brokers-in-reverse-order">
          <name>Client App traverses 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 through a 3xx redirect instruction from the brokers it traverses, against the Allowlist generated for this flow, 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 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> 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 protect their deep links using Android universal links / iOS App Links including the most specific package identifiers to prevent 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 domains it traverses through while processing the request, used to enforce all urls it later traverses through during response processing.
This mitigates open redirection attacks as urls outside of this Allowlist will 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 is managed as a single-use object and 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, and will break if these cookies are later missing.</t>
        <t>Therefore, Client App <bcp14>MUST</bcp14> handle Cookies as a web browser would:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>SHALL</bcp14> store cookies it obtains on HTTP responses.</t>
          </li>
          <li>
            <t><bcp14>SHALL</bcp14> send cookies on subsequent HTTP requests to servers that returned 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>
