<?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-06" 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-06"/>
    <author fullname="Yaron Zehavi">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>yaron.zehavi@rbinternational.com</email>
      </address>
    </author>
    <date year="2025" month="August" day="18"/>
    <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 81?>

<t>This document describes a protocol allowing a <em>Client App</em> to obtain an OAuth grant from an <em>Authorization Server's Native App</em> using the <xref target="App2App"/> pattern, providing <strong>native</strong> app navigation user-experience (no web browser used), despite both apps belonging to 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 85?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes a protocol enabling native app navigation of an <xref target="App2App"/> OAuth grant across <em>different Trust Domains</em>.</t>
      <t>When <em>Clients</em> and <em>Authorization Servers</em> are located on <em>different Trust Domains</em>, authorization requests traverse across domains using federation, involving <em>Authorization Servers</em> 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>In federated <xref target="App2App"/> scenarios the <strong>web browser</strong> serves as user-agent, as federated 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>
      <dl>
        <dt><strong>native_authorization_endpoint</strong>:</dt>
        <dd>
          <t>A new Authorization Server endpoint and corresponding metadata property <bcp14>REQUIRED</bcp14> to support the browser-less App2App flow.</t>
        </dd>
        <dt><strong>native_callback_uri</strong>:</dt>
        <dd>
          <t>A new native authorization request parameter, specifying the deep link of <em>Client App</em>.</t>
        </dd>
        <dt><strong>native_app2app_unsupported</strong>:</dt>
        <dd>
          <t>A new error code value.</t>
        </dd>
      </dl>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="terminology">
        <name>Terminology</name>
        <t>In addition to the terms defined in referenced specifications, this document uses
the following terms:</t>
        <dl>
          <dt><strong>OAuth</strong>:</dt>
          <dd>
            <t>In this document, "OAuth" refers to OAuth 2.0, <xref target="RFC6749"/> in the <strong>authorization code flow</strong>.</t>
          </dd>
          <dt><strong>OAuth Broker</strong>:</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><strong>Client App</strong>:</dt>
          <dd>
            <t>A Native app OAuth client of <em>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><strong>Downstream Authorization Server</strong>:</dt>
          <dd>
            <t>An Authorization Server downstream of another <em>Authorization Server</em>. It may be an <em>OAuth Broker</em> or the <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt><strong>User-Interacting Authorization Server</strong>:</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 federate), or performs user authentication and request authorization.</t>
          </dd>
          <dt><strong>User-Interacting App</strong>:</dt>
          <dd>
            <t>Native App of <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt><strong>Deep Link</strong>:</dt>
          <dd>
            <t>A url claimed by a native application.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <section anchor="flow-overview">
        <name>Flow Overview</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="336" y="116">and</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 and   +-+  |
|   |  |  | | +-------------->| 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 a <strong>native_callback_uri</strong>.</t>
          </li>
          <li>
            <t>(2) <em>Authorization Server</em> returns either:
            </t>
            <ul spacing="normal">
              <li>
                <t>A <em>native authorization request url</em> for a <em>Downstream Authorization Server</em>.</t>
              </li>
              <li>
                <t>A request for end-user input to guide request routing.</t>
              </li>
              <li>
                <t>A <em>deep link</em> url to its <em>User-Interacting App</em>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>(3) <em>Client App</em>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Calls <em>native authorization request urls</em> it obtains, so long as such responses are obtained, until a <em>deep link</em> url to <em>User-Interacting App</em> is obtained.</t>
              </li>
              <li>
                <t>Prompts end-user, then provides their input to <em>Authorization Server</em> to guide request routing.</t>
              </li>
              <li>
                <t>Handles <em>deep links</em>, by invoking the app claiming the url, if present on the device.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>(4) <em>Client App</em> natively invokes <em>User-Interacting App</em> claiming a <em>deep link</em> it has obtained.</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> returns to <em>Client App</em> by natively invoking <strong>native_callback_uri</strong> and provides the url-encoded <em>redirect_uri</em> with its response parameters.</t>
          </li>
          <li>
            <t>(7) <em>Client App</em> invokes the <em>redirect_uri</em> it obtained.</t>
          </li>
          <li>
            <t>(8) <em>Client App</em> calls any subsequent uris obtained until its own redirect_uri is obtained.</t>
          </li>
          <li>
            <t>(9) <em>Client App</em> exchanges code for tokens and the flow is complete.</t>
          </li>
        </ul>
      </section>
      <section anchor="authorization-server-metadata">
        <name>Authorization Server Metadata</name>
        <t>This document introduces the following parameter as authorization server metadata <xref target="RFC8414"/>, indicating support of <em>Native App2App</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="native-authorization-endpoint">
        <name>native_authorization_endpoint</name>
        <t>This is an OAuth authorization endpoint, interoperable with other OAuth RFCs.</t>
        <t>The following additional requirements apply to native_authorization_endpoint, in line with common REST APIs:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>SHALL NOT</bcp14> use cookies.</t>
          </li>
          <li>
            <t><bcp14>SHALL</bcp14> return Content-Type header with the value "application/json", and a JSON http body.</t>
          </li>
          <li>
            <t><bcp14>SHALL NOT</bcp14> return HTTP 30x redirects.</t>
          </li>
          <li>
            <t><bcp14>SHALL NOT</bcp14> respond with bot-detection challenges such as CAPTCHAs.</t>
          </li>
        </ul>
      </section>
      <section anchor="native-authorization-request">
        <name>Native Authorization Request</name>
        <t>An OAuth authorization request, interoperable with other OAuth RFCs, which also includes the <em>native_callback_uri</em> parameter:</t>
        <dl>
          <dt><strong>native_callback_uri</strong>:</dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. <em>Client App's</em> deep link, to be invoked by <em>User-Interacting App</em>. When invoking <em>native_callback_uri</em>, it accepts the following parameter:
</t>
            <dl>
              <dt><strong>redirect_uri</strong>:</dt>
              <dd>
                <t><bcp14>REQUIRED</bcp14>. url-encoded redirect_uri from <em>User-Interacting App</em> responding to its OAuth client, including its respective response parameters.</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t><em>Authorization servers</em> processing a <em>native authorization request</em> <bcp14>MUST</bcp14> also:</t>
        <ul spacing="normal">
          <li>
            <t>Forward the <em>native_callback_uri</em> in their requests to <em>Downstream Authorization Servers</em>.</t>
          </li>
          <li>
            <t>Ensure that the <em>Downstream Authorization Servers</em> it federates to, offers a <em>native_authorization_endpoint</em>, otherwise return an error response with error code <em>native_app2app_unsupported</em>.</t>
          </li>
        </ul>
      </section>
      <section anchor="native-authorization-response">
        <name>Native Authorization Response</name>
        <t>The authorization server responds with <em>application/json</em> and either 200 OK or 4xx/5xx.</t>
        <section anchor="federating-response">
          <name>Federating response</name>
          <t>If the <em>Authorization Server</em> decides to federate to another party such as <em>Downstream Authorization Server</em> or its OAuth client, it responds with 200 OK and the following JSON response body:</t>
          <dl>
            <dt>action:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A string with the value "call" to indicate that <em>url</em> is to be called with HTTP GET.</t>
            </dd>
            <dt>url:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A string holding a native authorization request for <em>Downstream Authorization Server</em>, or redirect_uri of an OAuth client with a response.</t>
            </dd>
          </dl>
          <t>Example:</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
    "action": "call",
    "url": "https://next-as.com/auth/native",
}
]]></artwork>
          <t><em>Client App</em> <bcp14>SHALL</bcp14> add all DNS domains of <em>urls</em> it encounters during each flow to an Allowlist, used to validate urls in the response handling phase, after being invoked by the <em>User-Interacting Authorization Server' App</em>.</t>
          <t>It then <bcp14>MUST</bcp14> make an HTTP GET request to the returned <em>url</em> and process the response as defined in this document.</t>
        </section>
        <section anchor="deep-link-response">
          <name>Deep Link Response</name>
          <t>If the <em>Authorization Server</em> wishes to authenticate the user and authorize the request, using its <em>User-Interacting App</em>, it responds with 200 OK and the following JSON response body:</t>
          <dl>
            <dt>action:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A string with the value "deep_link" to indicate that <em>url</em> is to be called with HTTP GET.</t>
            </dd>
            <dt>url:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A string holding the deep link url claimed by the <em>User-Interacting App</em>.</t>
            </dd>
          </dl>
          <t>Example:</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
    "action": "deep_link",
    "url": "uri of native authorization request handled by *User-Interacting App*",
}
]]></artwork>
          <t><em>Client App</em> <bcp14>MUST</bcp14> use OS mechanisms to invoke the deep link received in <em>url</em> and open the <em>User-Interacting Authorization Server's App</em>. If no app claiming the deep link is be found, <em>Client App</em> <bcp14>MUST</bcp14> terminate the flow and <bcp14>MAY</bcp14> attempt a non-native flow. See <xref target="fallback"/>.</t>
        </section>
        <section anchor="routing-response">
          <name>Routing Response</name>
          <t>If the <em>Authorization Server</em> requires user input to determine where to federate, it responds with 200 OK and the following JSON body:</t>
          <dl>
            <dt>id:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>. A string holding an interaction identifier used by <em>Authorization Server</em> to link the response to the request.</t>
            </dd>
            <dt>action:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A string with the value "prompt" to indicate that the client app must prompt the user for input before proceeding.</t>
            </dd>
            <dt>logo:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>. URL or base64-encoded logo of <em>Authorization Server</em>, for branding purposes.</t>
            </dd>
            <dt>userPrompt:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A JSON object containing the prompt definition. The following parameters <bcp14>MAY</bcp14> be used:</t>
            </dd>
          </dl>
          <ul spacing="normal">
            <li>
              <t>options: <bcp14>OPTIONAL</bcp14>. A JSON object that defines a dropdown/select input with various options to choose from. Each key is the parameter name to be sent in the response and each value defines the option:  </t>
              <ul spacing="normal">
                <li>
                  <t>title: <bcp14>OPTIONAL</bcp14>. A string holding the input's title.</t>
                </li>
                <li>
                  <t>description: <bcp14>OPTIONAL</bcp14>. A string holding the input's description.</t>
                </li>
                <li>
                  <t>values: <bcp14>REQUIRED</bcp14>. A JSON object where each key is the selection value and each value holds display data for that value:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>name: <bcp14>REQUIRED</bcp14>. A string holding the display name of the selection value.</t>
                    </li>
                    <li>
                      <t>logo: <bcp14>OPTIONAL</bcp14>. A string holding a URL or base64-encoded image for that selection value.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>inputs: <bcp14>OPTIONAL</bcp14>. A JSON object that defines an input field. Each key is the parameter name to be sent in the response and each value defines the input field:  </t>
              <ul spacing="normal">
                <li>
                  <t>title: <bcp14>OPTIONAL</bcp14>. A string holding the input's title.</t>
                </li>
                <li>
                  <t>hint: <bcp14>OPTIONAL</bcp14>. A string holding the input's hint that is displayed if the input is empty.</t>
                </li>
                <li>
                  <t>description: <bcp14>OPTIONAL</bcp14>. A string holding the input's description.</t>
                </li>
              </ul>
            </li>
          </ul>
          <dl>
            <dt>response:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A JSON object that holds the URL to which the user input <bcp14>MUST</bcp14> be sent. It only supports two keys, which are mutually exclusive:</t>
            </dd>
          </dl>
          <ul spacing="normal">
            <li>
              <t>get: The corresponding value is the URL to use for a GET request with user input appended as query parameters.</t>
            </li>
            <li>
              <t>post: The corresponding value is the URL to use for a POST request with user input sent in the request body, as application/x-www-form-urlencoded.</t>
            </li>
          </ul>
          <t>Example of prompting end-user for 2 multiple-choice inputs:</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
    "action": "prompt",
    "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 of prompting end-user for text input entry:</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/vnd.oauth.app2app.routing+json

{
    "action": "prompt",
    "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": "Lorem Ipsum"
            }
        }
    },
    "response": {
        "post": "url to POST to using application/x-www-form-urlencoded",
        "get": "url to use for a GET with query params"
    }
}
]]></artwork>
          <t><em>Client App</em> <bcp14>MUST</bcp14> prompt the user according to the response received.
It then <bcp14>MUST</bcp14> send the user input to the response endpoint using the requested method including the interaction id, if provided.</t>
          <t>Example of <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 of <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="error-response">
          <name>Error Response</name>
          <t>If <em>Authorization Server</em> encounters an error whose audience is its OAuth client, it returns 200 OK with the following JSON body:</t>
          <dl>
            <dt>action:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A string with the value "call" to indicate that <em>url</em> is to called with HTTP GET.</t>
            </dd>
            <dt>url:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. A string holding the redirect_uri of the OAuth client, including the OAuth error.</t>
            </dd>
          </dl>
          <t>Example:</t>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
    "action": "call",
    "url": "https://previous-as.com/auth/redirect?error=...&error_description=...&iss=...&state=..."
}
]]></artwork>
          <t><em>Client App</em> <bcp14>MUST</bcp14> make an HTTP GET request to the returned <em>url</em> and process the response as defined in this document.</t>
          <t>If <em>Authorization Server</em> encounters an error, that it cannot/or must not send to its OAuth client, it responds with 4xx/5xx and the following JSON body:</t>
          <dl>
            <dt>error:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14>. The error code as defined in <xref target="RFC6749"/> and other OAuth RFCs.</t>
            </dd>
            <dt>error_description:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>. The error description as defined in <xref target="RFC6749"/>.</t>
            </dd>
          </dl>
          <t>Example:</t>
          <artwork><![CDATA[
HTTP/1.1 500 OK
Content-Type: application/json

{
    "error": "native_app2app_unsupported",
}
]]></artwork>
          <t><em>Client App</em> <bcp14>SHOULD</bcp14> display an appropriate error message to the user and terminate the flow.
In case of <em>native_app2app_unsupported</em>, <em>Client App</em> <bcp14>MUST</bcp14> terminate the flow and <bcp14>MAY</bcp14> retry with a non-native flow. See <xref target="fallback"/>.</t>
        </section>
      </section>
      <section anchor="user-interacting-authorization-servers-app">
        <name>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.</t>
          </li>
          <li>
            <t>Establishes trust in <em>native_callback_uri</em> and validates that an app claiming <em>native_callback_uri</em> 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 <em>native_callback_uri</em> 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-response-handling">
        <name>Client App response handling</name>
        <t><em>Client App</em> is natively invoked by <em>User-Interacting Authorization Server App</em>:</t>
        <ul spacing="normal">
          <li>
            <t>If invoked with an <em>error</em> parameter, without parameters at all, it <bcp14>MUST</bcp14> terminate the flow.</t>
          </li>
          <li>
            <t>It <bcp14>MUST</bcp14> ignore any unknown parameters.</t>
          </li>
          <li>
            <t>If invoked with a url-encoded <strong>redirect_uri</strong> as parameter, <em>Client App</em> <bcp14>MUST</bcp14> validate <em>redirect_uri</em>, and any url subsequently obtained, using the Allowlist it previously generated, and <bcp14>MUST</bcp14> terminate the flow if any url is not found in the Allowlist.</t>
          </li>
        </ul>
        <t><em>Client App</em> <bcp14>SHALL</bcp14> invoke <em>redirect_uri</em>, and any validated subsequent obtained urls, using HTTP GET.</t>
        <t><strong>Authorization Servers</strong> processing <em>Native App2App</em> <bcp14>MUST</bcp14> respond to their redirect_uri invocations:</t>
        <ul spacing="normal">
          <li>
            <t>According to the REST API guidelines specified in <xref target="native-authorization-endpoint"/>.</t>
          </li>
          <li>
            <t>Returning a JSON body instructing the next url to call.</t>
          </li>
        </ul>
        <t>Example:</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
    "action": "call",
    "url": "redirect_uri of an OAuth Client, including response parameters",
}
]]></artwork>
        <t><em>Client App</em> <bcp14>MUST</bcp14> handle any other response (2xx with an unexpected Content-Type / 3xx / 4xx / 5xx) as a failure and terminate the flow.</t>
      </section>
      <section anchor="flow-completion">
        <name>Flow completion</name>
        <t>Once <em>Client App's</em> own redirect_uri is obtained, <em>Client App</em> processes the response:</t>
        <ul spacing="normal">
          <li>
            <t>Exchanges code for tokens.</t>
          </li>
          <li>
            <t>Or handles errors obtained.</t>
          </li>
        </ul>
        <t>And the <em>Native App2App</em> flow is complete.</t>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <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 claims a url.</t>
        <t>See <xref target="Appendix-A"/> for more details.</t>
      </section>
      <section anchor="fallback">
        <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 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="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>Required <em>User-Interacting App</em> is not installed on end-user's device.</t>
          </li>
        </ul>
        <t><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 <em>User-Interacting App</em> is not installed on end-user's device, might succeed in future, if the missing app has been installed. <em>Client App</em> <bcp14>MAY</bcp14> choose if and when to retry the <em>Native App2App flow</em> after such a failure.</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><em>Client App</em> when interacting with end-user to provide routing guiding input <bcp14>MUST NOT</bcp14> be used to request authentication credentials or any other sensitive information.</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 specific trust establishment mechanisms are outside the scope of this document.
For example purposes only, one possible way to establish trust is <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="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="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="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="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.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 585?>

<section anchor="Appendix-A">
      <name>Detecting Presence of Native Apps claiming Urls on iOS and Android</name>
      <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 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>
    <section anchor="background-and-relation-to-other-standards">
      <name>Background and relation to other standards</name>
      <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="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</t>
      <ul spacing="normal">
        <li>
          <t>Replaced Authorization Details Type with a new parameter</t>
        </li>
        <li>
          <t>native_authorization_endpoint as REST API - no cookies or HTTP 30x responses</t>
        </li>
      </ul>
      <t>-05</t>
      <ul spacing="normal">
        <li>
          <t>removed error native_callback_uri_not_claimed</t>
        </li>
        <li>
          <t>Added Routing Instructions Response</t>
        </li>
        <li>
          <t>Added native_authorization_endpoint and matching AS profile</t>
        </li>
        <li>
          <t>Added Authorization Details Type as container for native_callback_uri</t>
        </li>
      </ul>
      <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:
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
diVa2uxG3PizrZm0YZWJ44Z+iSveAsulMccS0wtIRPZwDqL+2NxVFxluImES
apVdZphl2oxBrsHRzJ5tYQsx7IG3zscuT6HZ0GQCIhSwhHU6LODQy+x25rNL
gMBZWv0Jz17IjAuyub8+yaGmbihcrbzk/VMbF3W9h50JHJYmeyZgZ5j4Wb11
Qm+BVa88E8/CGfaU2Dfy0dpZsDw/m/nIAli1EmgQWFMYSmS133ZwbLIn56qn
tONgy8WNdtqc4PoeqeQVWQ686+IULh5uAiKKqZ1kG0YKjPeGrP4PMbt684sO
1qzEDhGyKUeApT4RARsKrv3dXTBNLBtXGZbsx0ghjazZbfEAntpGUwb+BWNm
i2LyYgqeQVXIXq3qqvfqk1eC4ASN/FZa6KYU8lG7XoaoTjYNP6Kgo768cqSD
k8LpPhJWfo56sG9sszU67kpEr49sYo4AVGllz4vQNOlDTvGFhXpJ1RAxWRZe
qW2t514D2wWBfws965NTQqo9rwWNCZPncXr405fa5irgNvK0oTo1i0E8yEKa
Y0+AH9Sb8T4YioiROQrVhNxVk2T8Ssb5FaoaynHFNYX1zxqIMEc8vL3jrJXg
4woxb1ex1awOu0HF5q0+tmjtNsWdHzTAbepAbz+AQ9G9z4Qiqi+lX2InFM+i
KotnLVPhYwd4ZweAj0lzR3YwRXZ+A1Oy13HnxgN8SrK91zXA2jLv2oP05O0R
1D3AvTYYdChZd8Fk9y17v2cA+mNrh/ECLEvId/3aYKonrm/hp641FbbAuDEA
Fzl/36ojNeBhYW/zugOcan5bdamdAwhvBnXJ6bsaIntZew/aW2t07Q/QkEZt
ZrOVtW0efFfX3JpbXh2sP8CjsDH4hkVeq2J+GPKtTgHjz8AF60QHmdb31ujI
3mqPbRHhBrjr8mC3PlDccSs8c/T1cX2hnsHao7f9dFccf8IBHoQN59P19akG
+MJRqaz92p4BPrmw++xK/yYY6C/cXsrJerE2WjNIULW7Zmq7qTj7bN0A5DNi
ROOsoeYZNmiZoclEJwqxH7NWkNKohxySYqPTPPqLftHxQxeFg85cikfLSylJ
XFDbMvMp3ESGHPr0KWlnU/0glyM/+tSdg4yxP/+ELyrA+8CzYwC4FzkQ/Fg8
MR7CRMYRhVM+YsojMVcXsxIrWzCtFOGbVuDcyZHN+qKjlnn7jkqDJ5Iqx0yn
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
xM5dr2blZm+83gr+HxrEl1J3fQAA

-->

</rfc>
