<?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.35 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-embesozzi-oauth-agent-native-authorization-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="Agent Native Authorization">OAuth 2.0 Agents Native Authorization via Structured Elicitation</title>
    <seriesInfo name="Internet-Draft" value="draft-embesozzi-oauth-agent-native-authorization-00"/>
    <author fullname="Martin Besozzi">
      <organization>TwoGenIdentity</organization>
      <address>
        <email>embesozzi@twogenidentity.com</email>
      </address>
    </author>
    <date year="2026" month="April" day="03"/>
    <area>Security</area>
    <workgroup>Independent Submission</workgroup>
    <keyword>oauth</keyword>
    <keyword>agent</keyword>
    <keyword>native authorization</keyword>
    <keyword>elicitation</keyword>
    <keyword>ai agents</keyword>
    <abstract>
      <?line 63?>

<t>This document defines a Structured Elicitation extension to the OAuth 2.0
First-Party Applications (FiPA) specification <xref target="FiPA"/>, establishing a standard
metadata format for FiPA authorization challenge responses.  FiPA leaves the format
for advertising available authenticators and their required inputs undefined,
preventing interoperable implementation by AI Agents and other non-browser
clients. This extension adds an <tt>elicitations</tt> array to the FiPA Authorization
Challenge Response, providing a standard metadata format for authenticator
challenges. Model Context Protocol (MCP) Elicitation <xref target="MCP-Elicitation"/> is the
normative reference binding.</t>
      <t>This specification covers the just-in-time (JIT) authorization for AI Agents executing on behalf of users in Human-to-Agent (H2A) flows.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://embesozzi.github.io/draft-embesozzi-oauth-agent-native-authorization/draft-embesozzi-oauth-agent-native-authorization.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-embesozzi-oauth-agent-native-authorization/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/embesozzi/draft-embesozzi-oauth-agent-native-authorization"/>.</t>
    </note>
  </front>
  <middle>
    <?line 77?>

<section anchor="introduction">
      <name>Introduction</name>
      <section anchor="applicability">
        <name>Applicability</name>
        <t>AI Agents operate autonomously and do not inherently distinguish routine
operations from sensitive ones.  When an agent encounters an operation
requiring step-up authentication or explicit user approval, a just-in-time
(JIT) authorization gate is needed: the agent must pause, surface a structured
challenge to the human user, and obtain a cryptographic proof — an OAuth token
— before proceeding.  The FiPA specification <xref target="FiPA"/> provides the
challenge/response wire protocol for this gate.  This extension defines the
metadata format that makes FiPA challenges machine-readable for agent runtimes.</t>
        <t>This extension applies when the client is an AI Agent acting on behalf of a
human user (see Section 1.2), the authorization server supports the FiPA
challenge/response protocol, and the agent runtime supports a Structured
Elicitation mechanism (Section 4), with MCP Elicitation <xref target="MCP-Elicitation"/> as
the normative reference implementation.</t>
      </section>
      <section anchor="human-to-agent-h2a-communication-model">
        <name>Human-to-Agent (H2A) Communication Model</name>
        <t>This extension addresses the Human-to-Agent (H2A) communication pattern.
In this pattern, a human user interacts with an AI Agent
that acts as a first-party OAuth client on their behalf.  The AI Agent
orchestrates the FiPA challenge/response cycle but cannot independently
satisfy authentication challenges that require human interaction — such as
entering a TOTP code or completing a WebAuthn ceremony.</t>
        <t>The Structured Elicitation mechanism defined in Section 4 is the channel
through which the authorization server communicates challenge requirements back
to the human user via the agent runtime.  The agent runtime presents the
challenge to the human, collects the response, and forwards it to the
authorization server as an Authorization Challenge Request.</t>
        <t>This contrasts with Agent-to-Agent (A2A) patterns, in which an autonomous
agent satisfies authorization challenges without human involvement.  The
present document is scoped to H2A interactions; A2A authorization is outside
the scope of this specification.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 <xref target="RFC8174">RFC2119</xref> when, and only when, they appear in all
capitals, as shown here.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>This document uses terminology defined in <xref target="RFC6749"/>, <xref target="FiPA"/>, and
<xref target="MCP-Elicitation"/>. The following terms are used as defined:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Authorization Server (AS):</strong> As defined in <xref target="RFC6749"/>.</t>
          </li>
          <li>
            <t><strong>Just-In-Time (JIT) Authorization:</strong> An authorization pattern in which a
fresh credential challenge is issued at the moment a sensitive action is
attempted, rather than relying solely on the trust established at initial
authentication. This extension enables JIT Authorization by providing the
structured metadata needed for agent runtimes to surface mid-flow challenges
to the human user.</t>
          </li>
          <li>
            <t><strong>Structured Elicitation:</strong> The abstract mechanism by which an agent runtime
requests structured user input mid-flow and returns a structured response.
MCP Elicitation <xref target="MCP-Elicitation"/> is a conformant implementation of this
mechanism and serves as the normative reference implementation for this
specification.</t>
          </li>
          <li>
            <t><strong>Human-to-Agent (H2A) Communication:</strong> The interaction pattern in which a
human user delegates actions to an AI Agent that acts as a first-party OAuth
client. The agent orchestrates protocol flows on behalf of the user.</t>
          </li>
          <li>
            <t><strong>First-Party AI Agent:</strong> An AI agent whose client runtime is built and
controlled by the same operator as the server-side components and
authorization server. The agent MAY implement FiPA-specific elicitation
extensions.</t>
          </li>
          <li>
            <t><strong>Third-Party AI Agent:</strong> An AI agent whose client runtime is a product
provided by a third party. The implementer
cannot modify client elicitation handling.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>This extension operates within the FiPA challenge/response cycle defined in
<xref target="FiPA"/>. A FiPA authorization request that requires additional authentication
receives an Authorization Challenge Response:</t>
      <sourcecode type="http"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error": "insufficient_authorization",
  "auth_session": "sess_abc123"
}
]]></sourcecode>
      <t>The <tt>auth_session</tt> binds all subsequent requests to this authentication
context. FiPA supports multi-step flows via continued challenge/response cycles
on the same <tt>auth_session</tt>.</t>
      <t>This extension adds an <tt>elicitations</tt> array to the Authorization Challenge
Response. Each entry in the array describes one authenticator challenge the
human user must complete. The agent runtime translates each entry into a
Structured Elicitation request directed at the human user, collects the
response, and submits it in the next Authorization Challenge Request.</t>
      <t>Upon completion of the challenge/response cycle, the authorization server
issues an authorization code or token bound to the <tt>auth_session</tt>.  This token
serves as cryptographic proof that a human user satisfied the required
authentication challenge at a specific point in time, enabling the MCP server
to enforce JIT authorization before executing sensitive operations.</t>
    </section>
    <section anchor="elicitation-extension">
      <name>Elicitation Extension</name>
      <section anchor="response-format">
        <name>Response Format</name>
        <t>The <tt>elicitations</tt> array is added to the FiPA <tt>insufficient_authorization</tt>
error response body. Each entry carries the parameters needed for the agent
runtime to present a structured challenge to the human user.</t>
        <t>Fields per entry:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>mode</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">Interaction mode. <tt>"form"</tt> for in-band structured data collection using a JSON Schema.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>message</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">Human-readable prompt displayed to the user by the agent runtime.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>requestedSchema</tt></td>
              <td align="left">Form mode only</td>
              <td align="left">A restricted JSON Schema object describing the fields the user must fill in. Maps 1:1 to the Structured Elicitation <tt>requestedSchema</tt>.</td>
            </tr>
          </tbody>
        </table>
        <t>Note: A <tt>"url"</tt> mode (out-of-band browser interaction) is defined in
<xref target="MCP-Elicitation"/> and may be used in future revisions of this specification
for authenticator types that require a browser ceremony (e.g., Passkeys in
runtimes that cannot invoke the WebAuthn API natively).</t>
        <section anchor="request-content-type-for-intermediate-requests">
          <name>Request Content Type for Intermediate Requests</name>
          <t>The initial Authorization Challenge Request MUST use
<tt>application/x-www-form-urlencoded</tt> as required by <xref target="FiPA"/>. Intermediate
requests — those that carry an <tt>auth_session</tt> obtained from a prior challenge
response — MAY use <tt>application/json</tt> as the content type.  This is consistent
with <xref target="FiPA"/>, which explicitly permits intermediate requests to use a different
format than the initial request.</t>
        </section>
        <section anchor="elicitation-sequencing">
          <name>Elicitation Sequencing</name>
          <t>The <tt>elicitations</tt> array typically contains one entry at a time. Because
subsequent steps depend on prior user selections (e.g., choosing TOTP versus
Passkey changes the next challenge), the authorization server issues each
step's elicitation in a new Authorization Challenge Response after the
preceding credential is submitted.</t>
        </section>
        <section anchor="clients-without-structured-elicitation-support">
          <name>Clients Without Structured Elicitation Support</name>
          <t>For clients that do not support Structured Elicitation, the authorization
server returns a standard OAuth error response per <xref target="RFC6749"/> §5.2. The
<tt>WWW-Authenticate</tt> response header per <xref target="RFC6749"/> §5.2 is one example of how
the error is surfaced at the HTTP level:</t>
          <sourcecode type="http"><![CDATA[
WWW-Authenticate: Bearer realm="authorization-server",
                  error="insufficient_scope",
                  auth_session="sess_abc123"
]]></sourcecode>
        </section>
      </section>
      <section anchor="runtime-bindings">
        <name>Runtime Bindings</name>
        <t>The <tt>elicitations</tt> array is a transport-agnostic FiPA extension. The agent
runtime is responsible for translating each entry into its native interaction
mechanism. This section defines bindings for known runtimes.</t>
        <section anchor="mcp-elicitation-binding">
          <name>MCP Elicitation Binding</name>
          <t>When the agent runtime is MCP-based, the runtime (acting as the FiPA client)
maps each <tt>elicitations</tt> entry directly to an <tt>elicitation/create</tt> params
object per <xref target="MCP-Elicitation"/>. The <tt>jsonrpc</tt>, <tt>id</tt>, and <tt>method</tt> fields are MCP
transport framing — the <tt>params</tt> content is identical to the <tt>elicitations</tt>
entry.</t>
          <t>The following example shows a form mode elicitation entry from the
Authorization Challenge Response alongside the resulting <tt>elicitation/create</tt>
call:</t>
          <t>FiPA <tt>elicitations</tt> entry (from Authorization Challenge Response):</t>
          <sourcecode type="json"><![CDATA[
{
  "mode": "form",
  "message": "Additional verification is required. Select your authentication method.",
  "requestedSchema": {
    "type": "object",
    "properties": {
      "authenticator": {
        "type": "string",
        "title": "Authentication Method",
        "oneOf": [
          { "const": "totp", "title": "Authenticator App (TOTP)" },
          { "const": "passkey", "title": "Passkey" }
        ]
      }
    },
    "required": ["authenticator"]
  }
}
]]></sourcecode>
          <t>Resulting MCP <tt>elicitation/create</tt> call issued by the MCP server:</t>
          <sourcecode type="json"><![CDATA[
{
  "jsonrpc": "2.0",
  "id": "elicit-1",
  "method": "elicitation/create",
  "params": {
    "mode": "form",
    "message": "Additional verification is required. Select your authentication method.",
    "requestedSchema": {
      "type": "object",
      "properties": {
        "authenticator": {
          "type": "string",
          "title": "Authentication Method",
          "oneOf": [
            { "const": "totp", "title": "Authenticator App (TOTP)" },
            { "const": "passkey", "title": "Passkey" }
          ]
        }
      },
      "required": ["authenticator"]
    }
  }
}
]]></sourcecode>
          <t>MCP client response:</t>
          <sourcecode type="json"><![CDATA[
{
  "jsonrpc": "2.0",
  "id": "elicit-1",
  "result": {
    "action": "accept",
    "content": { "authenticator": "totp" }
  }
}
]]></sourcecode>
          <section anchor="mcp-elicitation-flow-example">
            <name>MCP Elicitation Flow Example</name>
            <artwork><![CDATA[
   Human        AI Agent        MCP Server        Authorization Server
     |               |               |                      |
     |  Prompt       |               |                      |
     |-------------->|               |                      |
     |               |  execute      |                      |
     |               |  MCP tool     |                      |
     |               |-------------->|                      |
     |               |               |  Authorization       |
     |               |               |  Request             |
     |               |               |--------------------->|
     |               |               |                      |
     |               |               |  Authorization       |
     |               |               |  Challenge Error     |
     |               |               |  + Elicitations      |
     |               |               |<---------------------|
     |               |               |                      |
     |               |               |  MCP Elicitation     |
     |               |<--------------|                      |
     |               |               |                      |
     |  Input        |               |                      |
     |-------------->|               |                      |
     |               |  Elicitation  |                      |
     |               |  Response     |                      |
     |               |-------------->|                      |
     |               |               |  Authorization       |
     |               |               |  Challenge Request   |
     |               |               |--------------------->|
     |               |               |                      |
     |               |               |  Authorization       |
     |               |               |  Challenge Error     |
     |               |               |  + Elicitations      |
     |               |               |<---------------------|
     |               |               |                      |
     |               |               |  ... (repeat as      |
     |               |               |  needed)             |
     |               |               |                      |
     |               |               |  Authorization       |
     |               |               |  Code Response       |
     |               |               |<---------------------|
     |               |               |                      |
     |               |               |  Token Request       |
     |               |               |--------------------->|
     |               |               |                      |
     |               |               |  Token Response      |
     |               |               |<---------------------|
     |               |               |                      |
]]></artwork>
          </section>
        </section>
        <section anchor="http-api-binding">
          <name>HTTP API Binding</name>
          <t>TODO: future section</t>
        </section>
      </section>
    </section>
    <section anchor="authorization-challenge-protocol">
      <name>Authorization Challenge Protocol</name>
      <section anchor="authorization-challenge-response">
        <name>Authorization Challenge Response</name>
        <t>When the authorization server requires additional authentication, it returns an
<tt>insufficient_authorization</tt> error response containing an <tt>elicitations</tt> array.
Each entry in <tt>elicitations</tt> describes one structured challenge the agent runtime
MUST present to the human user.</t>
        <t>The response includes the following parameters:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>error</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">MUST be <tt>"insufficient_authorization"</tt>.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>auth_session</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">Session identifier that MUST be included in all subsequent Authorization Challenge Requests for this context.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>elicitations</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">Array of elicitation objects. Each entry contains <tt>mode</tt>, <tt>message</tt>, and (for <tt>"form"</tt> mode) <tt>requestedSchema</tt>. See the Appendix for authenticator-specific schema examples.</td>
            </tr>
          </tbody>
        </table>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store

{
  "error": "insufficient_authorization",
  "auth_session": "<session-identifier>",
  "elicitations": [
    {
      "mode": "form",
      "message": "<human-readable prompt>",
      "requestedSchema": { ... }
    }
  ]
}
]]></sourcecode>
      </section>
      <section anchor="authorization-challenge-request">
        <name>Authorization Challenge Request</name>
        <t>After collecting user input via Structured Elicitation, the agent runtime
submits an Authorization Challenge Request to the authorization challenge
endpoint.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>auth_session</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">The session identifier from the preceding Authorization Challenge Response.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>response</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">An object whose fields match the <tt>requestedSchema</tt> advertised in the corresponding <tt>elicitations</tt> entry.</td>
            </tr>
          </tbody>
        </table>
        <sourcecode type="http"><![CDATA[
POST /as/authorization.oauth2
Content-Type: application/json

{
  "auth_session": "<session-identifier>",
  "response": { ... }
}
]]></sourcecode>
        <t>On success, the authorization server issues an OAuth token bound to the
completed <tt>auth_session</tt>, per <xref target="FiPA"/>.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TBD</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="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="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>
        <reference anchor="RFC9700">
          <front>
            <title>Best Current Practice for OAuth 2.0 Security</title>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="A. Labunets" initials="A." surname="Labunets"/>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <date month="January" year="2025"/>
            <abstract>
              <t>This document describes best current security practice for OAuth 2.0. It updates and extends the threat model and security advice given in RFCs 6749, 6750, and 6819 to incorporate practical experiences gathered since OAuth 2.0 was published and covers new threats relevant due to the broader application of OAuth 2.0. Further, it deprecates some modes of operation that are deemed less secure or even insecure.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="240"/>
          <seriesInfo name="RFC" value="9700"/>
          <seriesInfo name="DOI" value="10.17487/RFC9700"/>
        </reference>
        <reference anchor="FiPA" target="https://datatracker.ietf.org/doc/draft-ietf-oauth-first-party-apps/">
          <front>
            <title>OAuth 2.0 First-Party Applications</title>
            <author>
              <organization>IETF OAuth Working Group</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="MCP-Elicitation" target="https://modelcontextprotocol.io/specification/">
          <front>
            <title>Model Context Protocol Specification — Elicitation</title>
            <author>
              <organization>Anthropic</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="WebAuthn" target="https://www.w3.org/TR/webauthn/">
          <front>
            <title>Web Authentication: An API for accessing Public Key Credentials, Level 3</title>
            <author>
              <organization>W3C</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="EAP-ACR" target="https://openid.net/specs/openid-connect-eap-acr-values-1_0.html">
          <front>
            <title>OpenID Connect Extended Authentication Profile (EAP) ACR Values 1.0</title>
            <author>
              <organization>OpenID Foundation</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 448?>

<section anchor="appendix">
      <name>Appendix</name>
      <section anchor="examples">
        <name>Examples</name>
        <section anchor="authenticator-selection">
          <name>Authenticator Selection</name>
          <t>When additional authentication is required, the first elicitation typically
presents the available authenticators. The following examples show the FiPA
wire format for authenticator selection. This specification defines elicitation
schemas for two authenticator types: Passkey (WebAuthn) and Authenticator App
(TOTP). Password authentication is outside the scope of this document.</t>
          <t>When multiple authenticators are supported, the authorization server returns a
selection prompt:</t>
          <sourcecode type="http"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store

{
  "error": "insufficient_authorization",
  "auth_session": "sess_abc123",
  "elicitations": [
    {
      "mode": "form",
      "message": "Additional verification is required. Select your authentication method.",
      "requestedSchema": {
        "type": "object",
        "properties": {
          "authenticator": {
            "type": "string",
            "title": "Authentication Method",
            "oneOf": [
              { "const": "totp", "title": "Authenticator App (TOTP)" },
              { "const": "passkey", "title": "Passkey" }
            ]
          }
        },
        "required": ["authenticator"]
      }
    }
  ]
}
]]></sourcecode>
          <t>The agent submits the user's selection:</t>
          <sourcecode type="http"><![CDATA[
POST /as/authorization.oauth2
Content-Type: application/json

{
  "auth_session": "sess_abc123",
  "response": { "authenticator": "totp" }
}
]]></sourcecode>
        </section>
        <section anchor="totp-challenge">
          <name>TOTP Challenge</name>
          <t>TOTP uses form mode: the challenge is a 6-digit numeric code, expressible as a
plain string with <tt>pattern</tt> and length constraints.</t>
          <t>Authorization Challenge Response:</t>
          <sourcecode type="http"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store

{
  "error": "insufficient_authorization",
  "auth_session": "sess_abc123",
  "elicitations": [
    {
      "mode": "form",
      "message": "Enter the 6-digit code from your Authenticator App.",
      "requestedSchema": {
        "type": "object",
        "properties": {
          "otp": {
            "type": "string",
            "title": "One-Time Password",
            "minLength": 6,
            "maxLength": 6,
            "pattern": "^[0-9]{6}$"
          }
        },
        "required": ["otp"]
      }
    }
  ]
}
]]></sourcecode>
          <t>Authorization Challenge Request:</t>
          <sourcecode type="http"><![CDATA[
POST /as/authorization.oauth2
Content-Type: application/json

{
  "auth_session": "sess_abc123",
  "response": { "otp": "847291" }
}
]]></sourcecode>
          <t>On success, the authorization server issues an OAuth token with the
authenticated ACR value, per <xref target="FiPA"/>.</t>
        </section>
        <section anchor="passkey-challenge">
          <name>Passkey Challenge</name>
          <t>In a Third-Party AI Agent deployment, the client runtime is a product the
implementer does not control. It supports standard Structured Elicitation form
mode and URL mode but cannot be extended with custom format handling or WebAuthn
API invocation.</t>
          <t>For Third-Party AI Agents, URL mode SHOULD be used to redirect the user to a
browser-based WebAuthn flow. The out-of-band WebAuthn ceremony is outside the
scope of this specification.</t>
          <t>For in-band Passkey support, a First-Party AI Agent deployment is required.
The implementer controls the agent code and MAY implement custom elicitation
handling, including native WebAuthn API invocation using the OS or platform
FIDO2 APIs. The WebAuthn ceremony is performed in-band: no browser, no redirect.</t>
          <section anchor="webauthn-challenge-delivery">
            <name>WebAuthn Challenge Delivery</name>
            <t>This section defines how the authorization server delivers WebAuthn challenge
parameters to the agent through Structured Elicitation form mode.</t>
            <t>TBD</t>
          </section>
          <section anchor="authorization-challenge-response-1">
            <name>Authorization Challenge Response</name>
            <t>TBD</t>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
