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

<t>This document describes a protocol allowing a <em>Client App</em> to obtain an OAuth grant from a <em>Native App</em> using the <xref target="App2App"/> pattern, providing <strong>native</strong> app navigation user-experience (no web browser required), despite both apps residing on different trust domains.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://yaron-zehavi.github.io/oauth-app2app-browserless/draft-zehavi-oauth-app2app-browserless.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-zehavi-oauth-app2app-browserless/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Authorization Protocol Working Group mailing list (<eref target="mailto:oauth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/oauth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/yaron-zehavi/oauth-app2app-browserless"/>.</t>
    </note>
  </front>
  <middle>
    <?line 97?>

<section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="terminology">
        <name>Terminology</name>
        <t>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>An Authorization Server federating to other trust domains by acting as an OAuth Client of  <em>Downstream Authorization Servers</em>.</t>
          </dd>
          <dt>"Client App":</dt>
          <dd>
            <t>A Native app acting as client of <em>Initial Authorization Server</em>. In accordance with "OAuth 2.0 for Native Apps" <xref target="RFC8252"/>, Client's redirect_uri is claimed by the app.</t>
          </dd>
          <dt>"Initial Authorization Server":</dt>
          <dd>
            <t>Authorization Server of <em>Client App</em>. As an <em>OAuth Broker</em> it is a client of <em>Downstream Authorization Servers</em>, to which it federates requests.</t>
          </dd>
          <dt>"Downstream Authorization Server":</dt>
          <dd>
            <t>An Authorization Server downstream of <em>Initial Authorization Server</em>. It may be an <em>OAuth Broker</em> or the <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt>"User-Interacting Authorization Server":</dt>
          <dd>
            <t>An Authorization Server which interacts with end-user. The interaction may be interim navigation (e.g: user input is required to guide where to redirect), or performs user authentication and request authorization.</t>
          </dd>
          <dt>"User-Interacting App":</dt>
          <dd>
            <t>Native App of <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt>"Deep Link":</dt>
          <dd>
            <t>A url claimed by a native application.</t>
          </dd>
          <dt>"Native Callback uri":</dt>
          <dd>
            <t><em>Client App's</em> redirect_uri, claimed as a deep link. This deep link is invoked by <em>User-Interacting App</em> to natively return to <em>Client App</em>.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document, <em>OAuth 2.0 App2App Browser-less Flow</em>, describes a protocol enabling native (<strong>Browser-less</strong>) app navigation of an <xref target="App2App"/> OAuth grant across <em>different Trust Domains</em>.</t>
      <t>When Clients and Authorization Servers are located on <em>different Trust Domains</em>, authorization requests are routedusing federation, involving Authorization Servers acting as clients of <em>Downstream Authorization Servers</em>.</t>
      <t>Such federation setups create trust networks, for example in Academia and in the business world across corporations.</t>
      <t>However in <xref target="App2App"/> scenarios the web browser must serve as user-agent, because federating Authorization Servers url's are not claimed by any native app.</t>
      <t>The use of web browsers in App2App flows, degrades the user experience somewhat.</t>
      <t>This document specifies:</t>
      <ul spacing="normal">
        <li>
          <t>A <strong>Native App2App Profile</strong> <em>Authorization Servers</em> <bcp14>SHOULD</bcp14> follow to support browser-less App2App flows.</t>
        </li>
        <li>
          <t>A new Authorization Server metadata property: <strong>native_authorization_endpoint</strong>, indicating an <em>Authorization Server</em> supports the <strong>Native App2App Profile</strong>.</t>
        </li>
        <li>
          <t>A new <xref target="RFC9396"/> Authorization Details Type: <strong>https://scheme.example.org/native_callback_uri</strong>.</t>
        </li>
        <li>
          <t>A new error code value: <strong>native_app2app_unsupported</strong></t>
        </li>
      </ul>
      <section anchor="app2app-across-trust-domains-requires-a-web-browser">
        <name>App2App across trust domains requires a web browser</name>
        <figure anchor="app2app-w-brokers-and-browser">
          <name>App2App across trust domains using browser</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="464" width="768" viewBox="0 0 768 464" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,432" fill="none" stroke="black"/>
                <path d="M 24,48 L 24,96" fill="none" stroke="black"/>
                <path d="M 24,336 L 24,400" fill="none" stroke="black"/>
                <path d="M 40,104 L 40,240" fill="none" stroke="black"/>
                <path d="M 96,96 L 96,208" fill="none" stroke="black"/>
                <path d="M 120,48 L 120,96" fill="none" stroke="black"/>
                <path d="M 136,144 L 136,304" fill="none" stroke="black"/>
                <path d="M 144,336 L 144,400" fill="none" stroke="black"/>
                <path d="M 152,176 L 152,256" fill="none" stroke="black"/>
                <path d="M 272,176 L 272,256" fill="none" stroke="black"/>
                <path d="M 336,176 L 336,256" fill="none" stroke="black"/>
                <path d="M 352,256 L 352,272" fill="none" stroke="black"/>
                <path d="M 464,176 L 464,256" fill="none" stroke="black"/>
                <path d="M 480,192 L 480,272" fill="none" stroke="black"/>
                <path d="M 552,176 L 552,272" fill="none" stroke="black"/>
                <path d="M 600,272 L 600,352" fill="none" stroke="black"/>
                <path d="M 656,280 L 656,384" fill="none" stroke="black"/>
                <path d="M 720,176 L 720,272" fill="none" stroke="black"/>
                <path d="M 744,144 L 744,304" fill="none" stroke="black"/>
                <path d="M 760,32 L 760,432" fill="none" stroke="black"/>
                <path d="M 8,32 L 760,32" fill="none" stroke="black"/>
                <path d="M 24,48 L 120,48" fill="none" stroke="black"/>
                <path d="M 24,96 L 120,96" fill="none" stroke="black"/>
                <path d="M 136,144 L 744,144" fill="none" stroke="black"/>
                <path d="M 152,176 L 272,176" fill="none" stroke="black"/>
                <path d="M 336,176 L 464,176" fill="none" stroke="black"/>
                <path d="M 552,176 L 720,176" fill="none" stroke="black"/>
                <path d="M 464,192 L 480,192" fill="none" stroke="black"/>
                <path d="M 96,208 L 144,208" fill="none" stroke="black"/>
                <path d="M 272,208 L 328,208" fill="none" stroke="black"/>
                <path d="M 480,208 L 544,208" fill="none" stroke="black"/>
                <path d="M 40,240 L 152,240" fill="none" stroke="black"/>
                <path d="M 280,240 L 336,240" fill="none" stroke="black"/>
                <path d="M 488,240 L 552,240" fill="none" stroke="black"/>
                <path d="M 152,256 L 272,256" fill="none" stroke="black"/>
                <path d="M 336,256 L 464,256" fill="none" stroke="black"/>
                <path d="M 352,272 L 480,272" fill="none" stroke="black"/>
                <path d="M 552,272 L 720,272" fill="none" stroke="black"/>
                <path d="M 136,304 L 744,304" fill="none" stroke="black"/>
                <path d="M 24,336 L 144,336" fill="none" stroke="black"/>
                <path d="M 152,352 L 600,352" fill="none" stroke="black"/>
                <path d="M 144,384 L 656,384" fill="none" stroke="black"/>
                <path d="M 24,400 L 144,400" fill="none" stroke="black"/>
                <path d="M 8,432 L 760,432" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="664,280 652,274.4 652,285.6" fill="black" transform="rotate(270,656,280)"/>
                <polygon class="arrowhead" points="552,208 540,202.4 540,213.6" fill="black" transform="rotate(0,544,208)"/>
                <polygon class="arrowhead" points="496,240 484,234.4 484,245.6" fill="black" transform="rotate(180,488,240)"/>
                <polygon class="arrowhead" points="336,208 324,202.4 324,213.6" fill="black" transform="rotate(0,328,208)"/>
                <polygon class="arrowhead" points="288,240 276,234.4 276,245.6" fill="black" transform="rotate(180,280,240)"/>
                <polygon class="arrowhead" points="160,352 148,346.4 148,357.6" fill="black" transform="rotate(180,152,352)"/>
                <polygon class="arrowhead" points="152,208 140,202.4 140,213.6" fill="black" transform="rotate(0,144,208)"/>
                <polygon class="arrowhead" points="48,104 36,98.4 36,109.6" fill="black" transform="rotate(270,40,104)"/>
                <g class="text">
                  <text x="76" y="68">Client</text>
                  <text x="72" y="84">App</text>
                  <text x="116" y="116">1.</text>
                  <text x="156" y="116">Launch</text>
                  <text x="240" y="116">Authorization</text>
                  <text x="160" y="132">Request</text>
                  <text x="204" y="132">on</text>
                  <text x="248" y="132">Browser</text>
                  <text x="396" y="132">Mobile</text>
                  <text x="456" y="132">Browser</text>
                  <text x="308" y="164">2.Federate</text>
                  <text x="304" y="180">Auth.</text>
                  <text x="520" y="180">Auth.</text>
                  <text x="216" y="196">Initial</text>
                  <text x="300" y="196">Req.</text>
                  <text x="404" y="196">Downstream</text>
                  <text x="516" y="196">Req.</text>
                  <text x="632" y="196">User-</text>
                  <text x="216" y="212">Authorization</text>
                  <text x="408" y="212">Authorization</text>
                  <text x="636" y="212">Authenticating</text>
                  <text x="212" y="228">Server</text>
                  <text x="400" y="228">Servers</text>
                  <text x="632" y="228">Authorization</text>
                  <text x="628" y="244">Server</text>
                  <text x="72" y="260">6.Authorization</text>
                  <text x="304" y="260">Auth.</text>
                  <text x="512" y="260">5.Auth.</text>
                  <text x="68" y="276">Response</text>
                  <text x="300" y="276">Response</text>
                  <text x="516" y="276">Response</text>
                  <text x="48" y="292">(Deep</text>
                  <text x="96" y="292">Link)</text>
                  <text x="188" y="340">3.</text>
                  <text x="252" y="340">Authenticate</text>
                  <text x="312" y="340">&amp;</text>
                  <text x="360" y="340">Authorize</text>
                  <text x="436" y="340">end-user</text>
                  <text x="496" y="340">(Deep</text>
                  <text x="544" y="340">Link)</text>
                  <text x="80" y="356">User-</text>
                  <text x="80" y="372">Interacting</text>
                  <text x="80" y="388">App</text>
                  <text x="188" y="404">4.</text>
                  <text x="260" y="404">Authentication</text>
                  <text x="328" y="404">&amp;</text>
                  <text x="392" y="404">Authorization</text>
                  <text x="484" y="404">Response</text>
                  <text x="316" y="452">Mobile</text>
                  <text x="372" y="452">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------------------------------------------------------------------------------------------+
| +-----------+                                                                               |
| |   Client  |                                                                               |
| |    App    |                                                                               |
| +--------+--+                                                                               |
|   ^      | 1. Launch Authorization                                                          |
|   |      |    Request on Browser            Mobile Browser                                  |
|   |      |    +---------------------------------------------------------------------------+ |
|   |      |    |                2.Federate                                                 | |
|   |      |    | +--------------+ Auth. +---------------+    Auth. +--------------------+  | |
|   |      |    | |    Initial   | Req.  |   Downstream  +-+  Req.  |       User-        |  | |
|   |      +----+>| Authorization+------>|  Authorization+ +------->|   Authenticating   |  | |
|   |           | |    Server    |       |    Servers    | |        |   Authorization    |  | |
|   +-----------+-+              |<------+               | |<-------+      Server        |  | |
|6.Authorization| +--------------+ Auth. +-+-------------+ |5.Auth. |                    |  | |
|   Response    |                Response  +---------------+Response+-----+------------+-+  | |
|  (Deep Link)  |                                                         |      ^          | |
|               +---------------------------------------------------------+------+----------+ |
|                                                                         |      |            |
| +--------------+    3. Authenticate & Authorize end-user (Deep Link)    |      |            |
| |    User-     |<-------------------------------------------------------+      |            |
| | Interacting  |                                                               |            |
| |     App      +---------------------------------------------------------------+            |
| +--------------+    4. Authentication & Authorization Response                              |
|                                                                                             |
+---------------------------------------------------------------------------------------------+
                                    Mobile Device
]]></artwork>
          </artset>
        </figure>
        <t>Since no native app claims the urls of redirecting Authorization Servers (<em>OAuth Brokers</em>), mobile Operating Systems default to using the system browser as the User Agent.</t>
      </section>
      <section anchor="impact-of-using-a-web-browser">
        <name>Impact of using a web browser</name>
        <t>Using a web browser may degrade the user experience in several ways:</t>
        <ul spacing="normal">
          <li>
            <t>Some browser's support for deep links is limited by design, or by the settings used.</t>
          </li>
          <li>
            <t>Browsers may prompt end-user for consent before opening apps claiming deep links, introducing additional friction.</t>
          </li>
          <li>
            <t>Browsers are noticeable by end-users, rendering the UX less smooth.</t>
          </li>
          <li>
            <t>Client app developers don't control which browser the <em>User-Interacting App</em> uses to provide its response to redirect_uri. Opinionated choices pose a risk that different browsers will use, making necessary cookies used to bind session identifiers to the user agent (nonce, state or PKCE verifier) unavailable, which may break the flow.</t>
          </li>
          <li>
            <t>After flow completion, "orphan" browser tabs may remain. They do not directly impact the flow, but can be regarded as unnecessary "clutter".</t>
          </li>
        </ul>
      </section>
      <section anchor="relation-to-openidnative-sso">
        <name>Relation to <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:</t>
        <ul spacing="normal">
          <li>
            <t>Published by the same issuer, therefore can securely share information.</t>
          </li>
          <li>
            <t>Using the same Authorization Server.</t>
          </li>
        </ul>
      </section>
      <section anchor="relation-to-oauthfirst-party">
        <name>Relation to <xref target="OAuth.First-Party"/></name>
        <t><xref target="OAuth.First-Party"/> also deals with native apps, but it <bcp14>MUST</bcp14> only be used by first-party applications, which is when the authorization server and application are controlled by the same entity, which is not true in the case described in this document.</t>
        <t>While this document also discusses a mechanism for <em>Authorization Servers</em> to guide <em>Client App</em> in obtaining user's input to guide routing the request across trust domains, the <xref target="OAuth.First-Party"/> required high degree of trust between the authorization server and the client is not fulfilled.</t>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <section anchor="flow-diagram">
        <name>Flow Diagram</name>
        <figure anchor="app2app-browserless-w-brokers">
          <name>Browser-less App2App across trust domains</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="368" width="424" viewBox="0 0 424 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,48 L 24,96" fill="none" stroke="black"/>
                <path d="M 24,240 L 24,320" fill="none" stroke="black"/>
                <path d="M 40,104 L 40,232" fill="none" stroke="black"/>
                <path d="M 64,96 L 64,232" fill="none" stroke="black"/>
                <path d="M 88,104 L 88,176" fill="none" stroke="black"/>
                <path d="M 104,104 L 104,144" fill="none" stroke="black"/>
                <path d="M 120,96 L 120,128" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,96" fill="none" stroke="black"/>
                <path d="M 160,240 L 160,320" fill="none" stroke="black"/>
                <path d="M 248,96 L 248,192" fill="none" stroke="black"/>
                <path d="M 248,240 L 248,320" fill="none" stroke="black"/>
                <path d="M 264,192 L 264,208" fill="none" stroke="black"/>
                <path d="M 376,96 L 376,192" fill="none" stroke="black"/>
                <path d="M 376,240 L 376,320" fill="none" stroke="black"/>
                <path d="M 392,112 L 392,208" fill="none" stroke="black"/>
                <path d="M 416,32 L 416,336" fill="none" stroke="black"/>
                <path d="M 8,32 L 416,32" fill="none" stroke="black"/>
                <path d="M 24,48 L 136,48" fill="none" stroke="black"/>
                <path d="M 24,96 L 136,96" fill="none" stroke="black"/>
                <path d="M 248,96 L 376,96" fill="none" stroke="black"/>
                <path d="M 376,112 L 392,112" fill="none" stroke="black"/>
                <path d="M 120,128 L 240,128" fill="none" stroke="black"/>
                <path d="M 104,144 L 248,144" fill="none" stroke="black"/>
                <path d="M 88,176 L 240,176" fill="none" stroke="black"/>
                <path d="M 248,192 L 376,192" fill="none" stroke="black"/>
                <path d="M 264,208 L 392,208" fill="none" stroke="black"/>
                <path d="M 24,240 L 160,240" fill="none" stroke="black"/>
                <path d="M 248,240 L 376,240" fill="none" stroke="black"/>
                <path d="M 168,272 L 240,272" fill="none" stroke="black"/>
                <path d="M 24,320 L 160,320" fill="none" stroke="black"/>
                <path d="M 248,320 L 376,320" fill="none" stroke="black"/>
                <path d="M 8,336 L 416,336" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="248,272 236,266.4 236,277.6" fill="black" transform="rotate(0,240,272)"/>
                <polygon class="arrowhead" points="248,176 236,170.4 236,181.6" fill="black" transform="rotate(0,240,176)"/>
                <polygon class="arrowhead" points="248,128 236,122.4 236,133.6" fill="black" transform="rotate(0,240,128)"/>
                <polygon class="arrowhead" points="176,272 164,266.4 164,277.6" fill="black" transform="rotate(180,168,272)"/>
                <polygon class="arrowhead" points="112,104 100,98.4 100,109.6" fill="black" transform="rotate(270,104,104)"/>
                <polygon class="arrowhead" points="96,104 84,98.4 84,109.6" fill="black" transform="rotate(270,88,104)"/>
                <polygon class="arrowhead" points="72,232 60,226.4 60,237.6" fill="black" transform="rotate(90,64,232)"/>
                <polygon class="arrowhead" points="48,104 36,98.4 36,109.6" fill="black" transform="rotate(270,40,104)"/>
                <g class="text">
                  <text x="84" y="68">Client</text>
                  <text x="80" y="84">App</text>
                  <text x="192" y="116">(1,3,7)</text>
                  <text x="288" y="116">Initial</text>
                  <text x="332" y="116">or</text>
                  <text x="300" y="132">Downstream</text>
                  <text x="312" y="148">Authorization</text>
                  <text x="192" y="164">(2,8)</text>
                  <text x="288" y="164">Servers</text>
                  <text x="192" y="196">(9)</text>
                  <text x="24" y="212">(6)</text>
                  <text x="80" y="212">(4)</text>
                  <text x="312" y="260">User-</text>
                  <text x="96" y="276">User-</text>
                  <text x="316" y="276">Authenticating</text>
                  <text x="92" y="292">Authenticating</text>
                  <text x="192" y="292">(5)</text>
                  <text x="312" y="292">Authorization</text>
                  <text x="96" y="308">App</text>
                  <text x="308" y="308">Server</text>
                  <text x="172" y="356">Mobile</text>
                  <text x="228" y="356">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------+
| +-------------+                                  |
| |    Client   |                                  |
| |     App     |                                  |
| +----+------+-+             +---------------+    |
|   ^  |  ^ ^ |     (1,3,7)   | Initial or    +-+  |
|   |  |  | | +-------------->| Downstream    | |  |
|   |  |  | +-----------------+ Authorization | |  |
|   |  |  |          (2,8)    | Servers       | |  |
|   |  |  +------------------>|               | |  |
|   |  |              (9)     +-+-------------+ |  |
|(6)|  |(4)                     +---------------+  |
|   |  v                                           |
| +----------------+          +---------------+    |
| |                |          |     User-     |    |
| |      User-     |<-------->| Authenticating|    |
| | Authenticating |  (5)     | Authorization |    |
| |       App      |          |    Server     |    |
| +----------------+          +---------------+    |
+--------------------------------------------------+
                  Mobile Device
]]></artwork>
          </artset>
        </figure>
        <ul spacing="normal">
          <li>
            <t>(1) <em>Client App</em> presents an authorization request to <em>Authorization Server's</em> <strong>native_authorization_endpoint</strong>, including the <em>native_callback_uri</em> <em>Authorization Details Type</em>.</t>
          </li>
          <li>
            <t>(2) <em>Authorization Server</em> returns either a <em>native authorization request url</em> for Downstream Authorization Server which includes the original <strong>native_callback_uri</strong> Authorization Details, or a <strong>Routing Instructions Response</strong>.</t>
          </li>
          <li>
            <t>(3) <em>Client App</em> handles obtained <em>Routing Instructions Response</em> by prompting end-user and providing their response to <em>Authorization Server</em>, which then responds with a <em>native authorization request url</em>. <em>Client App</em> handles obtained <em>native authorization request urls</em> by seeking an app on the device claiming the url. If not found, <em>Client App</em> loops through invocations of obtained <em>native authorization request urls</em>, until a claimed url is reached.</t>
          </li>
          <li>
            <t>(4) Once a claimed url is reached <em>Client App</em> natively invokes <em>User-Interacting App</em>.</t>
          </li>
          <li>
            <t>(5) <em>User-Interacting App</em> authenticates end-user and authorizes the request.</t>
          </li>
          <li>
            <t>(6) <em>User-Interacting App</em> natively invokes <strong>native_callback_uri</strong>, providing as a parameter a url-encoded <em>redirect_uri</em> with its response parameters.</t>
          </li>
          <li>
            <t>(7) <em>Client App</em> invokes the obtained <em>redirect_uri</em>.</t>
          </li>
          <li>
            <t>(8) <em>Client App</em> calls any subsequent uri obtained as 30x redirect directive, until it reaches a location header to its own redirect_uri.</t>
          </li>
          <li>
            <t>(9) <em>Client App</em> exchanges code for tokens and the flow is complete.</t>
          </li>
        </ul>
      </section>
      <section anchor="usage-and-applicability">
        <name>Usage and Applicability</name>
        <t>This specification <bcp14>MUST NOT</bcp14> be used when <em>Client App</em> detects <em>Initial Authorization Server's</em> url is claimed by an app on the device.</t>
        <t>In such case <em>Client App</em> <bcp14>SHOULD</bcp14> natively invoke the authorization request url.</t>
      </section>
      <section anchor="authorization-server-metadata">
        <name>Authorization Server Metadata</name>
        <t>This document introduces the following authorization server metadata <xref target="RFC8414"/> parameter to indicate it supports the <em>Native App2App Profile</em>.</t>
        <dl>
          <dt><strong>native_authorization_endpoint</strong>:</dt>
          <dd>
            <t>URL of the authorization server's native authorization endpoint.</t>
          </dd>
        </dl>
      </section>
      <section anchor="rfc9396-authorization-details-type-nativecallbackuri">
        <name><xref target="RFC9396"/> Authorization Details Type <em>native_callback_uri</em></name>
        <t>The protocol described in this document requires <strong>User-Interacting App</strong> to natively navigate end-user back to <em>Client App</em>, for which it requires <em>Client App's</em> <strong>native_callback_uri</strong>.</t>
        <t>To this end this document defines a new Authorization Details Type:</t>
        <artwork><![CDATA[
{
   "type": "https://scheme.example.org/native_callback_uri",
   "locations": [
      "https://app.example.com/native_callback_uri"
   ]
}
]]></artwork>
        <t><strong>locations</strong> array <bcp14>MUST</bcp14> include exactly one instance.</t>
      </section>
      <section anchor="native-app2app-profile">
        <name>Native App2App Profile</name>
        <t><em>Authorization servers</em> providing a <strong>native_authorization_endpoint</strong> <bcp14>MUST</bcp14> follow the <strong>Native App2App Profile's</strong> requirements:</t>
        <ul spacing="normal">
          <li>
            <t>Accept the <xref target="RFC9396"/> Authorization Details Type: <strong>https://scheme.example.org/native_callback_uri</strong>.</t>
          </li>
          <li>
            <t>Forward the Authorization Details Type to <em>Downstream Authorization Servers</em>.</t>
          </li>
          <li>
            <t>Ensure <em>Downstream Authorization Servers</em> it federates to, support the <em>Native App2App profile</em>, otherwise return error=native_app2app_unsupported.</t>
          </li>
          <li>
            <t>Redirect using HTTP 30x (avoid redirecting using HTTP Form Post or scripts embedded in HTML).</t>
          </li>
          <li>
            <t>Avoid challenging end-user with bot-detection such as CAPTCHAs when invoked without cookies.</t>
          </li>
          <li>
            <t><bcp14>MAY</bcp14> provide <em>Routing Instructions Response</em>.</t>
          </li>
        </ul>
      </section>
      <section anchor="routing-instructions-response">
        <name>Routing Instructions Response</name>
        <t><em>Authorization servers</em> supporting the <em>Native App2App profile</em>, but requiring end-user input to guide request routing, <bcp14>MAY</bcp14> provide a <em>Routing Instructions Response</em>.</t>
        <t>Example prompting end-user for multiple-choice:</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/vnd.oauth.app2app.routing+json

{
    "id": "request-identifier-1",
    "logo": "uri or base64-encoded logo of Authorization Server",
    "userPrompt": {
        "options": {
            "bank": {
                "title": "Bank",
                "description": "Choose your Bank",
                "values": {
                    "bankOfSomething": {
                        "name": "Bank of Something",
                        "logo": "uri or base64-encoded logo"
                    },
                    "firstBankOfCountry": {
                        "name": "First Bank of Country",
                        "logo": "uri or base64-encoded logo"
                    }
                }
            },
            "segment": {
                "title": "Customer Segment",
                "description": "Choose your Customer Segment",
                "values": {
                    "retail": "Retail",
                    "smb": "Small & Medium Businesses",
                    "corporate": "Corporate",
                    "ic": "Institutional Clients"
                }
            }
        }
    },
    "response": {
        "post": "url to POST to using application/x-www-form-urlencoded",
        "get": "url to use for a GET with query params"
    }
}
]]></artwork>
        <t>Example prompting end-user for input entry:</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/vnd.oauth.app2app.routing+json

{
    "id": "request-identifier-2",
    "logo": "uri or base64-encoded logo of Authorization Server",
    "userPrompt": {
        "inputs": {
            "email": {
                "hint": "Enter your email address",
                "title": "E-Mail",
                "description": "Lore Ipsum"
            }
        }
    },
    "response": {
        "post": "url to POST to using application/x-www-form-urlencoded",
        "get": "url to use for a GET with query params"
    }
}
]]></artwork>
        <dl>
          <dt><em>Client App</em> supporting <em>Routing Instructions Response</em> identifies the response as such using its Content-Type, then prompts end-user for their input:</dt>
          <dd>
            <t><em>logo</em> is <bcp14>OPTIONAL</bcp14> and used to brand the interaction and represent the Authorization Server.</t>
          </dd>
          <dt/>
          <dd>
            <t><em>userPrompt</em> <bcp14>MUST</bcp14> specify at least <em>options</em> or <em>inputs</em> and <bcp14>MAY</bcp14> specify both.</t>
          </dd>
          <dt/>
          <dd>
            <t><em>options</em> specifies 1..n multiple-choice prompts.</t>
          </dd>
          <dt/>
          <dd>
            <t><em>inputs</em> specifies free-form input.</t>
          </dd>
        </dl>
        <t><em>Client App</em> provides end-user's input using <em>response</em> which specifies HTTP GET or POST urls.
If provided, <em>Client App</em> includes "id" as interaction identifier.</t>
        <t>Example <em>Client App</em> response following end-user multiple-choice:</t>
        <artwork><![CDATA[
POST /native/routing HTTP/1.1
Host: example.as.com
Content-Type: application/x-www-form-urlencoded

id=request-identifier-1
&bank=bankOfSomething
&segment=retail
]]></artwork>
        <t>Example <em>Client App</em> response following end-user input entry:</t>
        <artwork><![CDATA[
POST /native/routing HTTP/1.1
Host: example.as.com
Content-Type: application/x-www-form-urlencoded

id=request-identifier-2
&email=end_user@example.as.com
]]></artwork>
      </section>
      <section anchor="protocol-flow">
        <name>Protocol Flow</name>
        <section anchor="client-app-calls-authorization-server">
          <name>Client App calls Authorization Server</name>
          <t>Client App uses HTTP to call <em>Initial Authorization Server's</em> <em>native_authorization_endpoint</em> with an authorization request including the <em>native_callback_uri</em> Authorization Details <xref target="RFC9396"/> RAR Type.</t>
        </section>
        <section anchor="authorization-server">
          <name>Authorization Server</name>
          <t><em>Authorization Server</em> evaluates the native authorization request.
It <bcp14>MAY</bcp14> return:</t>
          <ul spacing="normal">
            <li>
              <t>Error <em>native_app2app_unsupported</em> in case the intended <em>Downstream Authorization Server</em> does not support the <em>Native App2App Profile</em>.</t>
            </li>
            <li>
              <t>HTTP 200 with a <em>Routing Instructions Response</em>, in case it requires user input to guide choosing a <em>Downstream Authorization Server</em>.</t>
            </li>
            <li>
              <t>HTTP 30x in case the <em>Downstream Authorization Server</em> is known and eligible, with a <em>native authorization request url</em> towards <em>Downstream Authorization Server</em> in the Location header.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-app-processes-the-response">
          <name>Client App processes the response</name>
          <t><em>Client App</em> <bcp14>SHALL</bcp14> terminate the protocol flow if it obtains:</t>
          <ul spacing="normal">
            <li>
              <t>An error response.</t>
            </li>
            <li>
              <t>Or an HTTP 2xx response other than a <em>Routing Instructions Response</em>.</t>
            </li>
            <li>
              <t>A <em>Routing Instructions Response</em>, in case <em>Client App</em>  does not support it.</t>
            </li>
          </ul>
          <t>If a <em>Routing Instructions Response</em> was obtained and is supported, <em>Client App</em> interacts with end-user and provides their response to <em>Authorization Server</em>.</t>
          <t>If an HTTP 30x redirect response was obtained, <em>Client App</em> <bcp14>SHALL</bcp14> use OS SDK's to locate an app claiming the url in the Location header, and if found <bcp14>SHALL</bcp14> natively invoke it to process the <em>native authorization request</em>.</t>
          <t>If a suitable app is not found, <em>Client App</em> <bcp14>SHALL</bcp14> use HTTP to call the authorization request url and process the response as described herein.</t>
          <t>Client App repeats these actions until a native app is reached, or an error occurs.</t>
          <t>As the <em>Client App</em> performs HTTP calls, it <bcp14>SHALL</bcp14> maintain a list of all the DNS domains it interacts with, serving as an Allowlist for later invocations as part of the response handling.</t>
          <t>As Authorization Servers <bcp14>MAY</bcp14> use Cookies to bind security elements (state, nonce, PKCE) to the user agent, causing the flow to break if required cookies are missing from subsequent HTTP requests, <em>Client App</em> <bcp14>MUST</bcp14> handle cookies:</t>
          <ul spacing="normal">
            <li>
              <t>Store Cookies it obtains in HTTP responses.</t>
            </li>
            <li>
              <t>Send Cookies in subsequent HTTP requests.</t>
            </li>
          </ul>
        </section>
        <section anchor="processing-by-user-interacting-authorization-servers-app">
          <name>Processing by User-Interacting Authorization Server's App:</name>
          <t>The <em>User-Interacting Authorization Server's</em> app handles the native authorization request:</t>
          <ul spacing="normal">
            <li>
              <t>Validates the native authorization request as an OAuth authorization code request.</t>
            </li>
            <li>
              <t>Establishes trust in <em>native_callback_uri</em>, otherwise terminates the flow.</t>
            </li>
            <li>
              <t>Validates that an app claiming <strong>native_callback_uri</strong> is on the device, otherwise terminates the flow.</t>
            </li>
            <li>
              <t>Authenticates end-user and authorizes the request.</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> use <strong>native_callback_uri</strong> to invoke <em>Client App</em>, providing it the redirect url and its response parameters as the url-encoded query parameter <strong>redirect_uri</strong>.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-app-traverses-authorization-servers-in-reverse-order">
          <name>Client App traverses Authorization Servers in reverse order</name>
          <t><em>Client App</em> is natively invoked by <em>User-Interacting Authorization Server App</em>, with the request's redirect_uri.</t>
          <t><em>Client App</em> <bcp14>MUST</bcp14> validate this url, and any url subsequently obtained via a 30x redirect instruction, against the Allowlist it previously generated, and <bcp14>MUST</bcp14> fail if any url is not included in the Allowlist.</t>
          <t><em>Client App</em> <bcp14>SHALL</bcp14> invoke urls it received using HTTP GET:</t>
          <ul spacing="normal">
            <li>
              <t>If the response is a redirect instruction (HTTP Code 30x + Location header), <em>Client App</em> <bcp14>SHALL</bcp14> proceed to call obtained urls until reaching its own redirect_uri.</t>
            </li>
            <li>
              <t><bcp14>SHALL</bcp14> handle any other HTTP code (2xx / 4xx / 5xx) as a failure and terminate the flow.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-app-obtains-response">
          <name>Client App obtains response</name>
          <t>Once <em>Client App's</em> own redirect_uri is reached, the traversal of <em>Authorization Servers</em> is complete and <em>Client App</em> proceeds to process the response:</t>
          <ul spacing="normal">
            <li>
              <t>Exchange code for tokens.</t>
            </li>
            <li>
              <t>Or handle errors obtained.</t>
            </li>
          </ul>
        </section>
        <section anchor="recovery-from-failed-native-app2app-flows">
          <name>Recovery from failed native App2App flows</name>
          <figure anchor="app2web-w-brokers">
            <name>App2Web using the browser</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="400" width="768" viewBox="0 0 768 400" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,368" fill="none" stroke="black"/>
                  <path d="M 24,48 L 24,96" fill="none" stroke="black"/>
                  <path d="M 40,104 L 40,240" fill="none" stroke="black"/>
                  <path d="M 96,96 L 96,208" fill="none" stroke="black"/>
                  <path d="M 120,48 L 120,96" fill="none" stroke="black"/>
                  <path d="M 136,144 L 136,352" fill="none" stroke="black"/>
                  <path d="M 152,176 L 152,256" fill="none" stroke="black"/>
                  <path d="M 272,176 L 272,256" fill="none" stroke="black"/>
                  <path d="M 336,176 L 336,256" fill="none" stroke="black"/>
                  <path d="M 352,256 L 352,272" fill="none" stroke="black"/>
                  <path d="M 464,176 L 464,256" fill="none" stroke="black"/>
                  <path d="M 480,192 L 480,272" fill="none" stroke="black"/>
                  <path d="M 552,176 L 552,272" fill="none" stroke="black"/>
                  <path d="M 568,272 L 568,304" fill="none" stroke="black"/>
                  <path d="M 704,272 L 704,304" fill="none" stroke="black"/>
                  <path d="M 720,176 L 720,272" fill="none" stroke="black"/>
                  <path d="M 744,144 L 744,352" fill="none" stroke="black"/>
                  <path d="M 760,32 L 760,368" fill="none" stroke="black"/>
                  <path d="M 8,32 L 760,32" fill="none" stroke="black"/>
                  <path d="M 24,48 L 120,48" fill="none" stroke="black"/>
                  <path d="M 24,96 L 120,96" fill="none" stroke="black"/>
                  <path d="M 136,144 L 744,144" fill="none" stroke="black"/>
                  <path d="M 152,176 L 272,176" fill="none" stroke="black"/>
                  <path d="M 336,176 L 464,176" fill="none" stroke="black"/>
                  <path d="M 552,176 L 720,176" fill="none" stroke="black"/>
                  <path d="M 464,192 L 480,192" fill="none" stroke="black"/>
                  <path d="M 96,208 L 144,208" fill="none" stroke="black"/>
                  <path d="M 272,208 L 328,208" fill="none" stroke="black"/>
                  <path d="M 480,208 L 544,208" fill="none" stroke="black"/>
                  <path d="M 40,240 L 152,240" fill="none" stroke="black"/>
                  <path d="M 280,240 L 336,240" fill="none" stroke="black"/>
                  <path d="M 488,240 L 552,240" fill="none" stroke="black"/>
                  <path d="M 152,256 L 272,256" fill="none" stroke="black"/>
                  <path d="M 336,256 L 464,256" fill="none" stroke="black"/>
                  <path d="M 352,272 L 480,272" fill="none" stroke="black"/>
                  <path d="M 552,272 L 720,272" fill="none" stroke="black"/>
                  <path d="M 568,304 L 704,304" fill="none" stroke="black"/>
                  <path d="M 136,352 L 744,352" fill="none" stroke="black"/>
                  <path d="M 8,368 L 64,368" fill="none" stroke="black"/>
                  <path d="M 80,368 L 760,368" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="552,208 540,202.4 540,213.6" fill="black" transform="rotate(0,544,208)"/>
                  <polygon class="arrowhead" points="496,240 484,234.4 484,245.6" fill="black" transform="rotate(180,488,240)"/>
                  <polygon class="arrowhead" points="336,208 324,202.4 324,213.6" fill="black" transform="rotate(0,328,208)"/>
                  <polygon class="arrowhead" points="288,240 276,234.4 276,245.6" fill="black" transform="rotate(180,280,240)"/>
                  <polygon class="arrowhead" points="152,208 140,202.4 140,213.6" fill="black" transform="rotate(0,144,208)"/>
                  <polygon class="arrowhead" points="48,104 36,98.4 36,109.6" fill="black" transform="rotate(270,40,104)"/>
                  <g class="text">
                    <text x="68" y="68">Client</text>
                    <text x="64" y="84">App</text>
                    <text x="116" y="116">1.</text>
                    <text x="156" y="116">Launch</text>
                    <text x="240" y="116">Authorization</text>
                    <text x="160" y="132">Request</text>
                    <text x="204" y="132">on</text>
                    <text x="248" y="132">Browser</text>
                    <text x="396" y="132">Mobile</text>
                    <text x="456" y="132">Browser</text>
                    <text x="308" y="164">2.Federate</text>
                    <text x="304" y="180">Auth.</text>
                    <text x="520" y="180">Auth.</text>
                    <text x="216" y="196">Initial</text>
                    <text x="300" y="196">Req.</text>
                    <text x="404" y="196">Downstream</text>
                    <text x="516" y="196">Req.</text>
                    <text x="632" y="196">User-</text>
                    <text x="216" y="212">Authorization</text>
                    <text x="408" y="212">Authorization</text>
                    <text x="636" y="212">Authenticating</text>
                    <text x="212" y="228">Server</text>
                    <text x="400" y="228">Servers</text>
                    <text x="632" y="228">Authorization</text>
                    <text x="628" y="244">Server</text>
                    <text x="72" y="260">5.Authorization</text>
                    <text x="304" y="260">Auth.</text>
                    <text x="512" y="260">4.Auth.</text>
                    <text x="76" y="276">Response</text>
                    <text x="300" y="276">Response</text>
                    <text x="516" y="276">Response</text>
                    <text x="56" y="292">(Deep</text>
                    <text x="104" y="292">Link)</text>
                    <text x="624" y="292">Web</text>
                    <text x="652" y="292">UI</text>
                    <text x="572" y="324">3.</text>
                    <text x="636" y="324">Authenticate</text>
                    <text x="560" y="340">&amp;</text>
                    <text x="608" y="340">Authorize</text>
                    <text x="684" y="340">end-user</text>
                    <text x="72" y="372">=</text>
                    <text x="316" y="388">Mobile</text>
                    <text x="372" y="388">Device</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+---------------------------------------------------------------------------------------------+
| +-----------+                                                                               |
| |  Client   |                                                                               |
| |   App     |                                                                               |
| +--------+--+                                                                               |
|   ^      | 1. Launch Authorization                                                          |
|   |      |    Request on Browser            Mobile Browser                                  |
|   |      |    +---------------------------------------------------------------------------+ |
|   |      |    |                2.Federate                                                 | |
|   |      |    | +--------------+ Auth. +---------------+    Auth. +--------------------+  | |
|   |      |    | |    Initial   | Req.  |   Downstream  +-+  Req.  |       User-        |  | |
|   |      +----+>| Authorization+------>|  Authorization+ +------->|   Authenticating   |  | |
|   |           | |    Server    |       |    Servers    | |        |   Authorization    |  | |
|   +-----------+-+              |<------+               | |<-------+      Server        |  | |
|5.Authorization| +--------------+ Auth. +-+-------------+ |4.Auth. |                    |  | |
|    Response   |                Response  +---------------+Response+-+----------------+-+  | |
|   (Deep Link) |                                                     |     Web UI     |    | |
|               |                                                     +----------------+    | |
|               |                                                     3. Authenticate       | |
|               |                                                    & Authorize end-user   | |
|               +---------------------------------------------------------------------------+ |
+-------=-------------------------------------------------------------------------------------+
                                    Mobile Device
]]></artwork>
            </artset>
          </figure>
          <t>The <em>Native App2App flow</em> described in this document <bcp14>MAY</bcp14> fail when:</t>
          <ul spacing="normal">
            <li>
              <t>An error response is obtained.</t>
            </li>
            <li>
              <t><em>Client App</em> doesn't support an obtained <em>Routing Instructions Response</em>.</t>
            </li>
            <li>
              <t>An HTTP 2xx response other than a <em>Routing Instructions Response</em> is obtained.</t>
            </li>
          </ul>
          <t>In case of such failures, <em>Client App</em> <bcp14>MAY</bcp14> recover by launching a new (non-native) authorization request on a web browser, in accordance with "OAuth 2.0 for Native Apps" <xref target="RFC8252"/>.</t>
          <t>Note - Failure because an HTTP 2xx response, other than a <em>Routing Instructions Response</em> was obtained, suggests the <em>User-Interacting App</em> is not installed on end-user's device.
<em>Client App</em> <bcp14>MAY</bcp14> choose in future to retry the <em>Native App2App</em> flow, to benefit if in the meantime the missing app has been installed.</t>
        </section>
      </section>
    </section>
    <section anchor="detecting-presence-of-native-apps-claiming-urls">
      <name>Detecting Presence of Native Apps claiming Urls</name>
      <t>Native Apps on iOS and Android <bcp14>MAY</bcp14> use OS SDK's to detect if an app owns a url.
The general method is the same - App calls an SDK to open the url as deep link and handles an exception thrown if no matching app is found.</t>
      <section anchor="android">
        <name>Android</name>
        <t>App <bcp14>SHALL</bcp14> invoke Android <xref target="android.method.intent"/> method with FLAG_ACTIVITY_REQUIRE_NON_BROWSER, which throws ActivityNotFoundException if no matching app is found.</t>
      </section>
      <section anchor="ios">
        <name>iOS</name>
        <t>App <bcp14>SHALL</bcp14> invoke iOS <xref target="iOS.method.openUrl"/> method with options <xref target="iOS.option.universalLinksOnly"/> which ensures URLs must be universal links and have an app configured to open them.
Otherwise the method returns false in completion.success.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="embedded-user-agents">
        <name>Embedded User Agents</name>
        <t><xref target="RFC8252"/> Security Considerations advises against using <em>embedded user agents</em>. The main concern is preventing theft through keystroke recording of end-user's credentials such as usernames and passwords.</t>
        <t>This risk does not apply to this draft as <em>Client App</em> acts as User Agent only for the purpose of flow redirection, and does not interact with end-user's credentials in any way.</t>
        <t>The mechanism for providing routing instructions <bcp14>MUST NOT</bcp14> be used to request end-user to provide any authentication credentials.</t>
      </section>
      <section anchor="open-redirection-by-authorization-servers-user-interacting-app">
        <name>Open redirection by Authorization Server's User-Interacting App</name>
        <t>To mitigate open redirection attacks, trust establishment in <em>native_callback_uri</em> is <bcp14>RECOMMENDED</bcp14> by <em>User-Interacting App</em>.
Any federating <em>Authorization Server</em> <bcp14>MAY</bcp14> also wish to establish trust.</t>
        <t>The sepcific trust establishment mechanisms are outside the scope of this document.
For example purposes, one way to validate could leverage <xref target="OpenID.Federation"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Strip url path from <strong>native_callback_uri</strong> (retaining the DNS domain).</t>
          </li>
          <li>
            <t>Add the url path /.well-known/openid-federation and perform trust chain resolution.</t>
          </li>
          <li>
            <t>Inspect Client's metadata for redirect_uri's and validate <strong>native_callback_uri</strong> is included.</t>
          </li>
        </ul>
      </section>
      <section anchor="oauth-request-forgery-and-manipulation">
        <name>OAuth request forgery and manipulation</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that <em>Client App</em> acts as a confidential OAuth client.</t>
      </section>
      <section anchor="secure-native-application-communication">
        <name>Secure Native application communication</name>
        <t>If <em>Client App</em> uses a Backend it is <bcp14>RECOMMENDED</bcp14> to communicate with it securely:</t>
        <ul spacing="normal">
          <li>
            <t>Use TLS in up to date versions and ciphers.</t>
          </li>
          <li>
            <t>Use DNSSEC.</t>
          </li>
          <li>
            <t>Perform certificate pinning.</t>
          </li>
        </ul>
      </section>
      <section anchor="deep-link-hijacking">
        <name>Deep link hijacking</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that all apps in this specification shall use https-scheme deep links (Android App Links / iOS universal links). Apps <bcp14>SHOULD</bcp14> implement the most specific package identifiers mitigating deep link hijacking by malicious apps.</t>
      </section>
      <section anchor="open-redirection-by-client-app">
        <name>Open redirection by Client App</name>
        <t>Client App <bcp14>SHALL</bcp14> construct an Allowlist of DNS domains it traverses while processing the request, used to enforce all urls it later traverses during response processing.
This mitigates open redirection attacks as urls not in this Allowlist <bcp14>SHALL</bcp14> be rejected.</t>
        <t>In addition <em>Client App</em> <bcp14>MUST</bcp14> ignore any invocation for response processing which is not in the context of a request it initiated.
It is <bcp14>RECOMMENDED</bcp14> the Allowlist be managed as a single-use object, destructed after each protocol flow ends.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> <em>Client App</em> allows only one OAuth request processing at a time.</t>
      </section>
      <section anchor="authorization-code-theft-and-injection">
        <name>Authorization code theft and injection</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that PKCE is used and that the code_verifier is tied to the <em>Client App</em> instance, as mitigation to authorization code theft and injection attacks.</t>
      </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="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="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="RFC9396">
          <front>
            <title>OAuth 2.0 Rich Authorization Requests</title>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="J. Richer" initials="J." surname="Richer"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <date month="May" year="2023"/>
            <abstract>
              <t>This document specifies a new parameter authorization_details that is used to carry fine-grained authorization data in OAuth messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9396"/>
          <seriesInfo name="DOI" value="10.17487/RFC9396"/>
        </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="OAuth.First-Party" target="https://www.ietf.org/archive/id/draft-ietf-oauth-first-party-apps-01.html">
          <front>
            <title>OAuth 2.0 for First-Party Applications</title>
            <author initials="A." surname="Parecki">
              <organization/>
            </author>
            <author initials="G." surname="Fletcher">
              <organization/>
            </author>
            <author initials="P." surname="Kasselman">
              <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 586?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the following individuals who contributed ideas, feedback, and wording that shaped and formed the final specification: George Fletcher, Arndt Schwenkschuster, Henrik Kroll, Grese Hyseni.
As well as the attendees of the OAuth Security Workshop 2025 session in which this topic was discussed for their ideas and feedback.</t>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-latest
* removed error native_callback_uri_not_claimed
* Added Routing Instructions Response
* Added native_authorization_endpoint and matching AS profile
* Added Authorization Details Type as container for native_callback_uri</t>
      <t>-04</t>
      <ul spacing="normal">
        <li>
          <t>Phrased the challenge in Trust Domain terminology</t>
        </li>
        <li>
          <t>Discussed interim Authorization Server interacting the end-user, which is not the User-Authenticating Authorization Server</t>
        </li>
        <li>
          <t>Moved Cookies topic to Protocol Flow</t>
        </li>
        <li>
          <t>Mentioned that Authorization Servers redirecting not through HTTP 30x force the use of a browser</t>
        </li>
        <li>
          <t>Discussed Embedded user agents security consideration</t>
        </li>
      </ul>
      <t>-03</t>
      <ul spacing="normal">
        <li>
          <t>Defined parameters and values</t>
        </li>
        <li>
          <t>Added error native_callback_uri_not_claimed</t>
        </li>
      </ul>
      <t>-02</t>
      <ul spacing="normal">
        <li>
          <t>Clarified wording</t>
        </li>
        <li>
          <t>Improved figures</t>
        </li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Better defined terms</t>
        </li>
        <li>
          <t>Explained deep link claiming detection on iOS and android</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>initial working group version (previously draft-zehavi-oauth-app2app-browserless)</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1d/XLbRpL/n1X3DnNMVSxRJGTJdhKrktzKkhxrY1s+Sd5c
Lpt1geSQRAQCPAwommt7n+We5Z7s+tc9AwxAkKKd5G5ra1WVmATmo6enp7+n
2ev1WnmUx/pItS+O5/lEHQb31fFsdkj/qSdZujA668XaGPU0ThftVtjvZ/qW
Wr8M8+hWK+lkO7RbgzDX4zRbHimTD1utYTpIwikNPszCUd77q56Et1EvDalP
L6Q+9F+vL5Ngjt79Ry0z708jY6I0yZcz6nl+dv20lcynfZ0dtYY0/FFrkCZG
J2ZujlSezXWLwHnQCjMdElhXejDPonzZbi3S7GacpfMZPf1B9xUATbPorwR3
mqhXWZqngzRut270kpoOj1qqpxJeFEAz+MqA4oOFFR/7Hk687/z1Vidzgk+p
beZVShbY/oEAjZKx+g6d8HwaRjE959n/EOl8FKTZGC/CbDChF5M8n5mj/X20
wyMCOXDN9vFgX4Da5xH20XMc5ZN5n/ouwyxN7Ebsr90IdIkJ1yb3pvO7BjJg
EKXrB9nfbtODST4ldLRCxhO2gSZXajSPY6GdHzGv+k8ehl/RMsPEIvRIXYbR
aKQjogj1JExu1HmS6yzhl2HM7bUglOEPBJw/ZP3IbxcM0mmrlaTZlCkAe3j5
9OSLLx8+Lj4+um8/fvnFgy/sx68OHx26jw8PHtqPjw8OXYPHDx7zx4uZTs5P
jxgce97kkTpJk0QPcvo30+oguC9NwmysCfcO9Sm1jYZBovN9M9MDYx/0BtKZ
/s107+DNfcYlj8AnRb1MbzVOjvqqqw7vHzzkVwWi+a+nooQO0stAXYU30XSe
hdUXfwyIDYTDWC+rz18ETwL1xzTRpvqcng61eqGHOsrS2ruTQL1IszyaErgF
UoKn1DaTzWzAT/n2o7EzKro24eYFTop6BMQcPlqPmMtAPdNDwuG4q86GwXZI
OA6OCZ9pjG7bofO7QJ1qhimtvvgTvfjrZH4bJeltK0pGPolatltBW/u7OR1b
9SROx8Q8p7NYT3WSg79Qy16e9sDYLU8ygtcoETZ+uF+lyfZd2B5jql6fpupF
3kw45ZgJ/4T+TL0oET5w2KsS8P56/P8R+NdJmHhbdzHIU1D14QGT9eOSlkQq
9a6uLjadNSu7qJUifBJN9qNYAz/mk06flRrGpFU6a1wPbfTTWOeDic6aDioR
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
Oq6gi9XZqhwE0xrRGcDZq9zJWyxOj4I10nT/lUMUoh9JLe5f9GAjF+P6VpGt
lSWpsmFuETjUb1zlKzYfIqGplZwId6uQf3TFnRipt9QQbW6AzpGR1Iw/fnm8
onxWr/HC7CLtnVvaBA/74zng9xjkeADxQ/YYp2DaX8sRYFCRnIVkdKNlObiL
Ur0OjHu9pPjMufTTJJXaS1EfRdnBHkKUQNd6iNlEeVtYxZOxR9xrZrEJjqnt
nW2uDFHhc0fqOw2xU/yyVlcdZ8mQDsxgstDEvQYTko94/EwnWXSjvkcBqK76
DlalerYk0zIKkOnhfhaFc2pyzufTxmWHCCUVmjl+qNJM0hn/Yl5ZFi0pLCds
dTojhghT3ZWAGvrJ18CALM8iQaxetz3P6PCk2bLV+vNPf/5JXady8qcpQqOs
aKxBh/r5Z9pF+cXKVqfoIt6fBqH+ho77G3vrXBQRar355p9rtTFB1OoA1jQ8
vnL3/oreG+6JovR+yjlANl+9AW5a5P2HXAxtkoXGkoe7O8m2mf9TATaiKr/g
01GnxYa438VojNNHnoaL4Z1WXy8UZqsw9moBgMZ0VeLNvCFl5hCoBJcTKnm+
1Ezzj1Zpy02a0xT8O6cCithzRdKcSK68LMIfFqUgfTScNdiQZTLTwGckQPwD
IP7U/tyRn5ohOiRx22KbtyM8GvOwxTUUQ+aVBTOAFjuFBQWyZ0PdoPEBGj/R
KM1X/OwS/24Sh5pnsfgqS23Dqwzp7s96LqLQeVZ69+9j4MiGlhb252j5N2yd
hqd2vLSI7X7Xdbf1v0ZbdmNdeAAA

-->

</rfc>
