<?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-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title abbrev="Native OAuth App2App">OAuth 2.0 App2App Browser-less Flow</title>
    <seriesInfo name="Internet-Draft" value="draft-zehavi-oauth-app2app-browserless-07"/>
    <author fullname="Yaron Zehavi">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>yaron.zehavi@rbinternational.com</email>
      </address>
    </author>
    <date year="2025" month="October" day="16"/>
    <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 <strong>federation</strong>, 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>When <em>App2App</em> is performed in federation scenarios, a purely native user-experience is not achieved, because a web browser must act as user-agent, as federated <em>Authorization Server's</em> urls are not claimed by any native app.</t>
      <t>Using web browsers in <em>App2App</em> 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</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"
    }
}
]]></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": {
        "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>
        <t>Note - As <em>Authorization Servers</em> <bcp14>MAY</bcp14> use Cookies to bind security elements (state, PKCE) to the user agent, flows <bcp14>MAY</bcp14> break if necessary cookies are missing from subsequent HTTP requests, <em>Client App</em> <bcp14>MUST</bcp14> support cookies:</t>
        <ul spacing="normal">
          <li>
            <t>Store Cookies it has obtained in any HTTP response.</t>
          </li>
          <li>
            <t>Send Cookies in subsequent HTTP requests.</t>
          </li>
        </ul>
      </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>The ability to use the Client App to ask the user for input by a <em>Downstream Authorization Server</em> <bcp14>MUST NOT</bcp14> be used to request authentication credentials from the user. The Client App <bcp14>SHOULD</bcp14> terminate the flow if such a request is detected.</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 587?>

<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>Re-added required support for cookies</t>
        </li>
      </ul>
      <t>-06</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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
6PT6dLTrSEhtOeVGt3ul+Lb3/47xXQvYfgAA

-->

</rfc>
