<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.2.11) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-nordin-ocm-integration-protocol-01" category="std" consensus="true" submissionType="IETF">
  <front>
    <title>Open Cloud Mesh Integration Protocol</title>

    <author initials="M." surname="Nordin" fullname="Micke Nordin">
      <organization>SUNET</organization>
      <address>
        <email>kano@sunet.se</email>
        <uri>https://code.smolnet.org/micke</uri>
      </address>
    </author>
    <author initials="G." surname="Lo Presti" fullname="Giuseppe Lo Presti">
      <organization>CERN</organization>
      <address>
        <email>giuseppe.lopresti@cern.ch</email>
        <uri>https://cern.ch/lopresti</uri>
      </address>
    </author>
    <author initials="M." surname="Baghbani" fullname="Mahdi Baghbani">
      <organization>Ponder Source</organization>
      <address>
        <email>mahdi@pondersource.org</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>

    <date year="2026" month="September" day="01"/>

    <area>Applications and Real-Time</area>
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 33?>

<t>The Open Cloud Mesh Integration Protocol (OCM-IP) defines how an Open
Cloud Mesh (OCM) Server can integrate supporting servers, such as
SSH/SFTP servers, web application platforms, or stand-alone WebDAV
servers, to perform protocol-specific work on its behalf.</t>

<t>OCM-IP makes it possible for existing OCM Servers to offload protocol
specific interactions to stand-alone servers, or even implement OCM as a
lightweight server that handles only the OCM parts of a deployment:
discovery, share creation, token issuance and signing.  Anything
protocol-specific, such as serving files over WebDAV, providing SSH
access, or running an interactive web application, can be handed off to
one or more Protocol Servers running elsewhere, possibly operated with
different software and on different infrastructure.</t>

<t>OCM-IP defines three integration modes: a provisioned mode, in which the
OCM Server pushes Share information to the Protocol Server over a signed
back channel; a self-contained mode, in which the Share information is
embedded in the signed access token itself, so that the Protocol Server
needs no per-share state and no inbound API at all; and an introspected
mode, in which the Protocol Server validates presented credentials
through a token introspection endpoint, restoring compatibility with
Receiving Servers that do not support token exchange.</t>

<t>OCM-IP is a protocol between the Sending OCM Server and its Protocol
Servers only.  The Receiving Server is not involved in, and does not
need to be aware of, this protocol: everything it observes is
indistinguishable from the Sending Server serving the access protocols
itself.  For this reason, an OCM Sending Server MAY adopt a
different strategy to interoperate with Protocol Servers, including
e.g. establishing trust via shared keys, without compromising
compliance with the OCM protocol.</t>



    </abstract>



  </front>

  <middle>


<?line 67?>

<section anchor="introduction"><name>Introduction</name>

<t>Open Cloud Mesh [OCM] is a server federation protocol used to notify a
Receiving Party that they have been granted access to some Resource.
OCM deliberately handles interactions only up to the point where the
Receiving Party is informed of their access; actual Resource access is
subsequently managed by other protocols, such as WebDAV [RFC4918], SSH,
or application-specific web protocols.</t>

<t>In existing deployments, the Sending Server typically implements both
the OCM endpoints and all of the access protocols it offers.  This
couples the federation logic to the storage and application logic, and
makes it hard to:</t>

<t><list style="symbols">
  <t>implement OCM as a small, auditable component in front of existing
infrastructure,</t>
  <t>reuse a protocol implementation (for example a WebDAV server, an SFTP
server, or a computational notebook platform) across multiple OCM
deployments and vendors,</t>
  <t>operate the access protocol on separate infrastructure from the OCM
Server, for example running a web application platform in a different
security domain than the file sync and share system.</t>
</list></t>

<t>This document defines the Open Cloud Mesh Integration Protocol (OCM-IP),
which decouples the two concerns.  An OCM Server delegates the serving
of one or more access protocols to one or more Protocol Servers.  The
OCM Server remains the single party that the rest of the federation
interacts with: it performs OCM API Discovery, receives and sends Share
Creation Notifications.  The Protocol Server serves the actual Resource
access protocol, authorizing requests by independently verifying the
access tokens issued by the OCM Server.</t>

<t>Two properties of [OCM] make this delegation possible without
provisioning the Share's <spanx style="verb">sharedSecret</spanx> to the Protocol Server:</t>

<t><list style="numbers" type="1">
  <t>The OCM Server publishes its public keys as a JWK Set [RFC7517] at
the URL advertised in the <spanx style="verb">jwksUri</spanx> field of its OCM API Discovery
response, and signs its server-to-server requests using HTTP Message
Signatures [RFC9421].</t>
  <t>The Code Flow lets the Receiving Server exchange the <spanx style="verb">sharedSecret</spanx>
for an access token whose format [OCM] leaves entirely at the issuer's
discretion.</t>
</list></t>

<t>OCM-IP uses that freedom: it requires the OCM Server to issue these
access tokens as JWTs conforming to the JWT Profile for OAuth 2.0 Access
Tokens [RFC9068], signed with the OCM Server's published key.  Any
party, including a third-party service, can then verify such a token
without contacting the OCM Server on a per-request basis.</t>

<t>OCM-IP defines three integration modes that share a common authorization
core:</t>

<t><list style="symbols">
  <t>Provisioned integration: a small back-channel API through which the
OCM Server provisions and revokes Share records on the Protocol Server,
ahead of any Resource access.</t>
  <t>Self-contained integration: the OCM Server embeds the Share
information in the access token itself, as an additional JWT claim.  The
Protocol Server keeps no per-share state and exposes no inbound API;
everything it needs arrives inside the signed token.</t>
  <t>Introspected integration: the Protocol Server validates each presented
credential through a token introspection endpoint [RFC7662] at the OCM
Server.  This is the compatibility mode: it is the only one that can
serve Receiving Servers that directly presents the legacy <spanx style="verb">sharedSecret</spanx>
instead of performing the token exchange.</t>
</list></t>

<t>In all modes, normative rules define how the Protocol Server authorizes
front-channel Resource access using the OCM credentials.</t>

<t>This document is intended to be useful to anyone who wants to write a
reusable server component for use with OCM, such that one implementation
of, say, a notebook platform integration can be used unchanged behind
OCM Servers from different vendors.</t>

</section>
<section anchor="terms"><name>Terms</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
[RFC2119] [RFC8174] when, and only when, they appear in all capitals, as
shown here.</t>

<t>This document reuses the following terms as defined in [OCM]:
<em>Resource</em>, <em>Share</em>, <em>Share Creation Notification</em>, <em>Sending Server</em>,
<em>Receiving Server</em>, <em>Sending Party</em>, <em>Receiving Party</em>, <em>OCM Address</em>,
<em>OCM Server</em>, and <em>Code Flow</em>.</t>

<t>In addition, we define:</t>

<t><list style="symbols">
  <t><strong>Protocol Server</strong> - A server that serves one or more access
protocols (e.g., WebDAV, SSH, a web application) for Resources shared
through an OCM Server, on that OCM Server's behalf.</t>
  <t><strong>Integration API</strong> - The back-channel HTTP API exposed by a Protocol
Server, through which a paired OCM Server provisions and revokes Share
records.</t>
  <t><strong>Pairing</strong> - The out-of-band configuration step by which an OCM
Server and a Protocol Server are introduced to each other, establishing
mutual trust (see Pairing section).</t>
  <t><strong>Share Provisioning Request</strong> - A signed back-channel request from
the OCM Server to the Protocol Server, transferring the information the
Protocol Server needs in order to serve a Share.</t>
  <t><strong>Share Revocation Request</strong> - A signed back-channel request from the
OCM Server to the Protocol Server, instructing it to stop serving a
Share and release any associated resources.</t>
  <t><strong>Share Record</strong> - The Protocol Server's stored representation of a
provisioned Share, keyed by the pair (sender domain, providerId).</t>
  <t><strong>Provisioned Integration</strong> - The integration mode in which the OCM
Server transfers Share information to the Protocol Server over the back
channel, before any Resource access takes place.</t>
  <t><strong>Self-Contained Integration</strong> - The integration mode in which the
Share information travels inside the access token, in the <spanx style="verb">ocm_ip</spanx>
claim, and no back channel is used.</t>
  <t><strong>Introspected Integration</strong> - The integration mode in which the
Protocol Server validates a presented credential by querying a token
introspection endpoint [RFC7662] hosted by the OCM Server (or its
delegated Token Server).  Defined for backwards compatibility with
Receiving Servers that do not support the Code Flow.</t>
  <t><strong>ocm_ip Claim</strong> - A JWT claim, defined by this document, whose value
is an object carrying the Share information a Protocol Server needs in
order to serve a Share in Self-Contained Integration.</t>
  <t><strong>Front Channel</strong> - The path through which Resource access requests
reach the Protocol Server, originating from the Receiving Server or from
the Receiving Party's user agent, carrying a credential issued by the
OCM Server: an access token or, in Introspected Integration, possibly
the legacy <spanx style="verb">sharedSecret</spanx>.</t>
  <t><strong>Back Channel</strong> - The direct, signed, server-to-server path between
the OCM Server and the Protocol Server, carrying the Integration API
requests.</t>
</list></t>

</section>
<section anchor="architecture"><name>Architecture</name>

<section anchor="integration-modes"><name>Integration Modes</name>

<t>An OCM Server that delegates protocol work takes on the Sending Server
role of [OCM] towards the federation.  Towards its Protocol Servers it
uses one of three integration modes, chosen per pairing and per Share:</t>

<t><list style="symbols">
  <t>In <strong>Provisioned Integration</strong>, the OCM Server acts as a client of the
Protocol Server's Integration API: it pushes a Share Record over the
signed back channel before the Share is created, and revokes it when the
Share ends.  This mode supports the full Share lifecycle, including
prompt revocation and the release of per-share resources, and is the
only mode that supports SSH.</t>
  <t>In <strong>Self-Contained Integration</strong>, there is no back channel at all:
the OCM Server embeds the Share information in the access token, in the
<spanx style="verb">ocm_ip</spanx> claim.  The Protocol Server is stateless with respect to
Shares, which makes this mode attractive for simple gateways (for
example a token-verifying WebDAV front end to an existing storage
system), at the cost of revocation latency bounded only by token
lifetime (see Lifecycle).</t>
  <t>In <strong>Introspected Integration</strong>, the Protocol Server validates each
presented credential by querying a token introspection endpoint
[RFC7662] at the OCM Server (or its delegated Token Server).  This is a
compatibility mode: it is the only mode that can serve Receiving Servers
that do not support the <spanx style="verb">exchange-token</spanx> capability and therefore
present the legacy <spanx style="verb">sharedSecret</spanx> directly on the front channel.  It
reintroduces a per-request dependency on the OCM Server, which the other
two modes avoid.</t>
</list></t>

<t>A Protocol Server MAY support any combination of the modes.  Protocols
that allocate per-share resources or sessions (for example a notebook
platform that starts a computational session per Share) SHOULD use
Provisioned Integration, since Self-Contained Integration provides no
signal to release such resources.  Introspected Integration SHOULD be
used only where it is needed, namely for Shares towards Receiving
Servers that cannot perform the token exchange; where the Code Flow is
available, the other two modes avoid the per-request coupling.</t>

</section>
<section anchor="provisioned-integration-flow"><name>Provisioned Integration Flow</name>

<figure><artwork><![CDATA[
 Sending    OCM Server      Protocol     Receiving    Receiving
  Party   (Sending Server)    Server        Server       Party
    |            |              |             |            |
    | 1. Sending |              |             |            |
    |    Gesture |              |             |            |
    |----------->|              |             |            |
    |            | 2. Share     |             |            |
    |            | Provisioning |             |            |
    |            | Request      |             |            |
    |            |------------->|             |            |
    |            | 3. 201       |             |            |
    |            |<-------------|             |            |
    |            | 4. Share Creation          |            |
    |            |    Notification            |            |
    |            |--------------------------->|            |
    |            |              |             | 5. notify  |
    |            |              |             |----------->|
    |            | 6. Token Request           |            |
    |            |    (Code Flow)             |            |
    |            |<---------------------------|            |
    |            | 7. access_token (JWT)      |            |
    |            |--------------------------->|            |
    |            |              | 8. Resource access       |
    |            |              |    with access_token     |
    |            |              |<------------+------------|
    |            |              | 9. verify token against  |
    |            |              |    OCM Server's JWKS,    |
    |            |              |    look up Share Record, |
    |            |              |    serve the protocol    |
]]></artwork></figure>

<t>The numbered steps are:</t>

<t><list style="numbers" type="1">
  <t>The Sending Party makes a Sending Gesture to the OCM Server, as
described in [OCM].</t>
  <t>The OCM Server sends a Share Provisioning Request over the back
channel to the Protocol Server responsible for (one or more of) the
protocols offered in the Share.</t>
  <t>The Protocol Server verifies the request signature, stores the Share
Record and acknowledges.</t>
  <t>The OCM Server sends the Share Creation Notification to the Receiving
Server, exactly as specified in [OCM].  The protocol endpoints
advertised in the notification point (directly or via a reverse proxy)
at the Protocol Server.</t>
  <t>The Receiving Server notifies the Receiving Party as usual.</t>
  <t>The Receiving Server exchanges the <spanx style="verb">sharedSecret</spanx> for an access token
at the OCM Server's <spanx style="verb">tokenEndPoint</spanx>, using the Code Flow of [OCM].</t>
  <t>The OCM Server issues a signed JWT access token whose <spanx style="verb">client_id</spanx>
claim equals the <spanx style="verb">providerId</spanx> of the Share provisioned in step 2.</t>
  <t>The Receiving Server (or the Receiving Party's user agent, depending
on the access protocol) presents the access token to the Protocol
Server.</t>
  <t>The Protocol Server verifies the token against the OCM Server's
published keys, looks up the Share Record by (issuer domain,
<spanx style="verb">client_id</spanx>), cross-checks the identities bound into the token, and
serves the protocol-specific Resource access.</t>
</list></t>

</section>
<section anchor="self-contained-integration-flow"><name>Self-Contained Integration Flow</name>

<figure><artwork><![CDATA[
 Sending    OCM Server      Protocol     Receiving    Receiving
  Party   (Sending Server)    Server        Server       Party
    |            |              |             |            |
    | 1. Sending |              |             |            |
    |    Gesture |              |             |            |
    |----------->|              |             |            |
    |            | 2. Share Creation          |            |
    |            |    Notification            |            |
    |            |--------------------------->|            |
    |            |              |             | 3. notify  |
    |            |              |             |----------->|
    |            | 4. Token Request           |            |
    |            |    (Code Flow)             |            |
    |            |<---------------------------|            |
    |            | 5. access_token (JWT       |            |
    |            |    with ocm_ip claim)      |            |
    |            |--------------------------->|            |
    |            |              | 6. Resource access       |
    |            |              |    with access_token     |
    |            |              |<------------+------------|
    |            |              | 7. verify token against  |
    |            |              |    OCM Server's JWKS,    |
    |            |              |    check issuer pairing, |
    |            |              |    serve per the ocm_ip  |
    |            |              |    claim                 |
]]></artwork></figure>

<t>The flow is the OCM flow unchanged, except that the token issued in step
5 carries the <spanx style="verb">ocm_ip</spanx> claim, and that the protocol endpoints advertised
in step 2 point at the Protocol Server.  The Protocol Server is not
contacted before Resource access, holds no Share Records, and learns of
each Share only when the first request for it arrives.</t>

</section>
<section anchor="introspected-integration-flow"><name>Introspected Integration Flow</name>

<figure><artwork><![CDATA[
 Sending    OCM Server      Protocol     Receiving    Receiving
  Party   (Sending Server)    Server        Server       Party
    |            |              |             |            |
    | 1. Sending |              |             |            |
    |    Gesture |              |             |            |
    |----------->|              |             |            |
    |            | 2. Share Creation          |            |
    |            |    Notification            |            |
    |            |    (legacy sharedSecret)   |            |
    |            |--------------------------->|            |
    |            |              |             | 3. notify  |
    |            |              |             |----------->|
    |            |              | 4. Resource access       |
    |            |              |    with sharedSecret     |
    |            |              |<------------+------------|
    |            | 5. Token Introspection     |            |
    |            |    Request (signed)        |            |
    |            |<-------------|             |            |
    |            | 6. active + Share          |            |
    |            |    information             |            |
    |            |------------->|             |            |
    |            |              | 7. serve per the         |
    |            |              |    introspection         |
    |            |              |    response              |
]]></artwork></figure>

<t>The Share Creation Notification in step 2 is a legacy [OCM] share: it
carries the <spanx style="verb">sharedSecret</spanx> and does not include <spanx style="verb">must-exchange-token</spanx>,
because the Receiving Server cannot honor it.  The Protocol Server
validates the presented credential by introspecting it at the OCM Server
(steps 5 and 6) and authorizes the request from the introspection
response.</t>

<t>Introspected Integration composes with Provisioned Integration for the
same Share: in that case the introspection response identifies the
provisioned Share Record via <spanx style="verb">client_id</spanx>, and introspection replaces
only the credential validation, not the lifecycle handling.</t>

</section>
<section anchor="relationship-to-open-cloud-mesh"><name>Relationship to Open Cloud Mesh</name>

<t>OCM-IP is layered strictly behind the Sending Server role of [OCM]:</t>

<t><list style="symbols">
  <t>The OCM Server remains the Discoverable Server.  Protocol Servers MUST
NOT be required to expose <spanx style="verb">/.well-known/ocm</spanx>.</t>
  <t>The OCM Server remains the recipient of Invite Acceptance Requests,
Share Acceptance Notifications and all other OCM endpoints.</t>
  <t>The OCM Server remains the OAuth Authorization Server towards the
federation: access tokens are issued under its identity and verified
against the keys it publishes.  The hosting of the <spanx style="verb">tokenEndPoint</spanx>
itself MAY however be delegated as well; see the note below.</t>
  <t>The Protocol Server takes on (part of) the OAuth Resource Server
function: it is the party that ultimately accepts access tokens in
exchange for Resource access.</t>
</list></t>

<t>Shares whose protocols are served by a Protocol Server MUST use the Code
Flow of [OCM] unless the Share uses Introspected Integration: the OCM
Server MUST include <spanx style="verb">must-exchange-token</spanx> in the requirements of every
protocol entry that a Protocol Server serves in Provisioned or
Self-Contained Integration.  A Protocol Server cannot validate a legacy
<spanx style="verb">sharedSecret</spanx> on its own.  Introspected Integration allows the Protocol
Server to receive that credential on the front channel and validate it
through a per-request callback to the OCM Server.  After successful
introspection, the Protocol Server may also use the credential as
described in Security Considerations.</t>

<section anchor="note-delegating-the-token-endpoint"><name>Note: Delegating the Token Endpoint</name>

<t>This note is non-normative.</t>

<t>The <spanx style="verb">tokenEndPoint</spanx> is advertised as an absolute URL in the OCM Server's
discovery document, and nothing in [OCM] requires it to be served from
the OCM Server's own host.  Token issuance can therefore, in principle,
be delegated to a separate Token Server, in the same spirit as the rest
of this document:</t>

<t><list style="symbols">
  <t>The Token Server holds its own signing keypair, and the OCM Server
publishes the public key in its own JWK Set, advertised via the
<spanx style="verb">jwksUri</spanx> field of its Discovery response, under a <spanx style="verb">kid</spanx> in its own
domain.  The <spanx style="verb">iss</spanx> and <spanx style="verb">kid</spanx> rules of this document
(see Token Issuance by the OCM Server) are then satisfied without any
private key leaving the Token Server, and token
verification by Receiving Servers and Protocol Servers is unchanged.</t>
  <t>The Token Server learns about Shares through a special case of the
back channel: a share preparation request, by which the OCM Server sends
the information needed for issuance (the parties, the <spanx style="verb">providerId</spanx> or
the <spanx style="verb">ocm_ip</spanx> contents, the expiration) and receives in response a
<spanx style="verb">sharedSecret</spanx> minted by the Token Server.  The OCM Server forwards that
secret to the Receiving Server in the Share Creation Notification,
without needing to retain it.  The code presented in the Code Flow is
thereby validated by the very server that minted it, and the secret is
never stored outside the Token Server.</t>
</list></t>

<t>In such a deployment the OCM Server is reduced to pure federation logic:
discovery, Share bookkeeping, notifications and invites, with both token
issuance and Resource access served elsewhere.  The share preparation
request is identical to a request sent over the normal back channel, the
only difference being that the response from the Token Server includes
the <spanx style="verb">sharedSecret</spanx>.</t>

</section>
</section>
<section anchor="the-transparency-requirement"><name>The Transparency Requirement</name>

<t>OCM-IP is purely a protocol between the Sending Server and the Protocol
Server.  The Receiving Server MUST NOT be required to implement, or even
be aware of, OCM-IP.</t>

<t>Concretely, everything observable by the Receiving Server and the
Receiving Party MUST be indistinguishable from a deployment in which the
Sending Server serves the access protocols itself:</t>

<t><list style="symbols">
  <t>The protocol endpoints advertised in OCM API Discovery and in Share
Creation Notifications are ordinary URIs (or <spanx style="verb">host:port</spanx> addresses for
SSH); whether they are served by the OCM Server, by a reverse proxy in
front of a Protocol Server, or by a Protocol Server on a different
hostname is invisible at the OCM layer.</t>
  <t>Access tokens are obtained from the OCM Server's <spanx style="verb">tokenEndPoint</spanx> and
presented to the advertised protocol endpoint, exactly as specified in
[OCM].</t>
  <t>Errors returned by the Protocol Server on the front channel use the
semantics of the access protocol concerned.</t>
</list></t>

<t>A consequence of this requirement is that no OCM capability or criterium
is defined for OCM-IP: there is nothing for a remote peer to discover.</t>

</section>
<section anchor="topologies"><name>Topologies</name>

<t>The mapping between OCM Servers and Protocol Servers is many-to-many:</t>

<t><list style="symbols">
  <t>An OCM Server MAY pair with multiple Protocol Servers, for example one
serving WebDAV and another serving a web application platform, and MAY
provision the same Share to more than one of them when the Share offers
multiple protocols.</t>
  <t>A Protocol Server MAY be paired with multiple OCM Servers.  Share
Records are keyed by the pair (sender domain, providerId), so records
provisioned by different OCM Servers cannot collide and access tokens
issued by one OCM Server cannot address records provisioned by another.
In Self-Contained Integration the same isolation holds trivially: a
token is honored only if its issuer is paired, and grants only what its
own claims describe.</t>
</list></t>

</section>
</section>
<section anchor="pairing"><name>Pairing</name>

<t>Before a Protocol Server serves any Share, the OCM Server and the
Protocol Server MUST be paired.  Pairing is performed out of band,
typically by the operators of the two systems, and consists of at least:</t>

<t><list style="symbols">
  <t>On the OCM Server: which protocols and resource types the Protocol
Server is responsible for, which integration mode(s) to use, and, for
Provisioned Integration, the base URL of the Integration API of the
Protocol Server (referred to as <spanx style="verb">{integrationAPI}</spanx> below).  For
Introspected Integration, additionally the Protocol Server's JWKS URL
(referred to as <spanx style="verb">{protocolServerJwksUri}</spanx> below) and domain, used to
verify its introspection requests.</t>
  <t>On the Protocol Server: the domain(s) of the paired OCM Server(s) and
the integration mode(s) permitted for each.  The Protocol Server MUST
maintain an allowlist of paired OCM Server domains, MUST reject
Integration API requests whose sender is not on that allowlist, and MUST
NOT honor the <spanx style="verb">ocm_ip</spanx> claim of tokens whose issuer is not paired for
Self-Contained Integration.  For Introspected Integration, additionally
the URL of the introspection endpoint (referred to as
<spanx style="verb">{introspectionEndPoint}</spanx> below).</t>
</list></t>

<t>No shared secret is exchanged during pairing.  All trust on the back
channel derives from HTTP Message Signatures [RFC9421] made with the OCM
Server's signatory key, verified against the keys the OCM Server
publishes at the URL advertised in the <spanx style="verb">jwksUri</spanx> field of its OCM API
Discovery response [RFC7517], as specified in [OCM].  All trust on the
front channel derives from the JWT signatures on the access tokens,
verified against the same published keys.  Trust in introspection
requests derives, symmetrically, from HTTP Message Signatures made with
the Protocol Server's key, published at the JWKS URL exchanged during
pairing (see above).</t>

<t>The Protocol Server consequently does not need a signing keypair of its
own to implement this protocol, unless it uses Introspected Integration,
which requires it to sign its introspection requests (see Token
Introspection).</t>

</section>
<section anchor="integration-api"><name>Integration API</name>

<t>The Integration API is the back channel of Provisioned Integration.  A
Protocol Server that supports only Self-Contained Integration does not
expose it, and an OCM Server never calls it for self-contained Shares.</t>

<section anchor="general-requirements"><name>General Requirements</name>

<t>All Integration API requests:</t>

<t><list style="symbols">
  <t>MUST be made over TLS (implementations MAY fall back to plain HTTP in
testing setups only),</t>
  <t>MUST use the HTTP POST method with <spanx style="verb">application/json</spanx> as the
<spanx style="verb">Content-Type</spanx> request header,</t>
  <t>MUST be signed with an HTTP Message Signature [RFC9421] carrying the
label <spanx style="verb">ocm</spanx>, following the same rules as server-to-server requests in
[OCM]: the signature MUST cover at least <spanx style="verb">@method</spanx>, <spanx style="verb">@target-uri</spanx>,
<spanx style="verb">content-digest</spanx>, <spanx style="verb">content-length</spanx> and <spanx style="verb">date</spanx>, MUST include the
<spanx style="verb">created</spanx> parameter, and MUST be made with an asymmetric algorithm using
a key advertised in the OCM Server's JWK Set, located via the <spanx style="verb">jwksUri</spanx>
field of its Discovery response.</t>
</list></t>

<t>On receipt of an Integration API request, the Protocol Server:</t>

<t><list style="numbers" type="1">
  <t>MUST parse the <spanx style="verb">sender</spanx> field from the request body and derive the
sender domain from the part after the last <spanx style="verb">@</spanx> sign.</t>
  <t>MUST verify that the sender domain is on its allowlist of paired OCM
Servers, and reject the request with HTTP status 401 otherwise.</t>
  <t>MUST verify the <spanx style="verb">ocm</spanx>-labeled signature against the JWKS of the
sender domain, following the verification rules of [OCM] (single <spanx style="verb">ocm</spanx>
label, required covered components, content-digest match [RFC9530],
<spanx style="verb">created</spanx>
within a freshness window, <spanx style="verb">keyid</spanx> domain equal to the sender domain),
and reject the request with HTTP status 401 on any failure.</t>
</list></t>

<t>Note that, unlike the Share Creation Notification of [OCM], where the
verification key is discovered from the <spanx style="verb">sender</spanx> field of an arbitrary
remote server, the allowlist check in step 2 happens before any key
fetching: a Protocol Server never fetches keys from, or processes
payloads of, servers it is not paired with.</t>

<t>If the Protocol Server is deployed behind a TLS-terminating reverse
proxy, it MUST reconstruct the <spanx style="verb">@target-uri</spanx> that the OCM Server signed
(i.e., the public URL) when verifying signatures, for example from
forwarding headers set by the proxy.</t>

</section>
<section anchor="share-provisioning-request"><name>Share Provisioning Request</name>

<t>To provision a Share, the OCM Server MUST send a Share Provisioning
Request:</t>

<t><list style="symbols">
  <t>to <spanx style="verb">{integrationAPI}/shares</spanx>,</t>
  <t>before sending the corresponding Share Creation Notification to the
Receiving Server (see Lifecycle below),</t>
  <t>with a request body containing a JSON document as described below.</t>
</list></t>

<section anchor="fields"><name>Fields</name>

<t>The request body is the Share Creation Notification object of [OCM] that
the OCM Server intends to send to the Receiving Server, with one
transformation applied: every <spanx style="verb">sharedSecret</spanx> field, in every protocol
entry, MUST be removed.  The Integration API therefore never transfers a
<spanx style="verb">sharedSecret</spanx> to the Protocol Server.  Introspected Integration is
different: a <spanx style="verb">sharedSecret</spanx> may reach the Protocol Server as a
front-channel credential, independently of provisioning.</t>

<t>The fields used by the Protocol Server are thus:</t>

<t><list style="symbols">
  <t>REQUIRED <spanx style="verb">sender</spanx> (string) - OCM Address of the user that creates the
Share.  The domain part identifies the paired OCM Server and selects the
verification keys, as described above.</t>
  <t>REQUIRED <spanx style="verb">owner</spanx> (string) - OCM Address of the user that owns the
Resource.  Used for identity binding on the front channel.</t>
  <t>REQUIRED <spanx style="verb">shareWith</spanx> (string) - OCM Address of the Receiving Party.
Used for identity binding on the front channel.</t>
  <t>REQUIRED <spanx style="verb">providerId</spanx> (string) - as in [OCM]; opaque identifier of the
Share at the OCM Server, unique per Share.  It keys the Share Record and
links the back channel to the front channel (see below).</t>
  <t>REQUIRED <spanx style="verb">shareType</spanx> (string) - as in [OCM].</t>
  <t>REQUIRED <spanx style="verb">resourceType</spanx> (string) - as in [OCM].</t>
  <t>REQUIRED <spanx style="verb">protocol</spanx> (object) - as in [OCM], transformed as described
above.  The protocol entries carry the protocol-specific information the
Protocol Server needs to serve the Share (for example the <spanx style="verb">webdav</spanx>
entry's <spanx style="verb">uri</spanx> and <spanx style="verb">permissions</spanx>, or the <spanx style="verb">webapp</spanx> entry's <spanx style="verb">viewMode</spanx>).</t>
  <t>OPTIONAL <spanx style="verb">name</spanx>, <spanx style="verb">description</spanx>, <spanx style="verb">ownerDisplayName</spanx>,
<spanx style="verb">senderDisplayName</spanx>, <spanx style="verb">expiration</spanx> - as in [OCM]; informational, except
<spanx style="verb">expiration</spanx>, which the Protocol Server SHOULD honor (see Lifecycle).</t>
</list></t>

<t>Additional fields from the Share Creation Notification MAY be present
and MUST be ignored if not understood.</t>

</section>
<section anchor="the-providerid"><name>The providerId</name>

<t>The <spanx style="verb">providerId</spanx> is the link between the back channel and the front
channel, and the following rules apply:</t>

<t><list style="symbols">
  <t>[OCM] guarantees that the <spanx style="verb">providerId</spanx> is unique per Share, so the
pair (sender domain, providerId) identifies exactly one Share Record.</t>
  <t>The OCM Server MUST set the <spanx style="verb">client_id</spanx> claim of every access token it
issues for this Share (via its <spanx style="verb">tokenEndPoint</spanx>) to exactly the
<spanx style="verb">providerId</spanx>.  This constrains a value that the token profile of this
document (see Token Issuance by the OCM Server) otherwise leaves at the
OCM Server's discretion.</t>
  <t>The <spanx style="verb">providerId</spanx> is an identifier, not a credential: the Receiving
Server learns it from the Share Creation Notification anyway.
Possession of a <spanx style="verb">providerId</spanx> MUST NOT grant any access by itself; all
front channel authorization derives from the verified access token.
Consequently, the <spanx style="verb">providerId</spanx> does not need to be unguessable, and it
MAY appear in URLs and logs.</t>
</list></t>

</section>
<section anchor="response"><name>Response</name>

<t>On success the Protocol Server MUST respond with HTTP status 201 and a
JSON object with the following fields:</t>

<t><list style="symbols">
  <t>OPTIONAL <spanx style="verb">status</spanx> (string) - e.g. <spanx style="verb">"stored"</spanx>.</t>
  <t>OPTIONAL <spanx style="verb">protocol</spanx> (object) - protocol details allocated by the
Protocol Server for this Share, in the same format as the <spanx style="verb">protocol</spanx>
object of [OCM].</t>
</list></t>

<t>When the response contains a <spanx style="verb">protocol</spanx> object, the OCM Server SHOULD
use its field values (for example, a per-share <spanx style="verb">uri</spanx> allocated by the
Protocol Server) when constructing the corresponding protocol entries of
the outbound Share Creation Notification, in place of statically
configured values from the pairing.  This allows a Protocol Server to
allocate endpoints dynamically, per Share.</t>

<t>Two restrictions apply to the response <spanx style="verb">protocol</spanx> object:</t>

<t><list style="symbols">
  <t>It MUST NOT contain <spanx style="verb">sharedSecret</spanx> fields, and an OCM Server MUST
ignore any <spanx style="verb">sharedSecret</spanx> found in a Share Provisioning Response.
(Delegated token issuance is the exception: the share preparation
request is this same request sent to a Token Server, whose response
legitimately carries the <spanx style="verb">sharedSecret</spanx> it minted; see the note on
delegating the token endpoint.)</t>
  <t>The OCM Server MUST NOT take permissions from the response: the
Share's permissions are decided by the Sending Party and the OCM Server,
never by the Protocol Server.</t>
</list></t>

<t>Fields in the response <spanx style="verb">protocol</spanx> object that the OCM Server does not
understand MUST be ignored.</t>

<t>A Share Provisioning Request for a (sender domain, providerId) pair that
already has a Share Record MUST replace the existing record and respond
with HTTP status 201.  This makes provisioning idempotent and gives the
OCM Server a way to update a Share (for example after a permissions
change) by re-provisioning it.</t>

<t>Error responses:</t>

<t><list style="symbols">
  <t>400 - the request body is not valid JSON, or a required field is
missing or malformed.</t>
  <t>401 - the signature is missing, malformed, stale or invalid, or the
sender domain is not on the allowlist of paired OCM Servers.</t>
  <t>503 - the Protocol Server is temporarily unable to provision the
Share.</t>
</list></t>

</section>
</section>
<section anchor="share-revocation-request"><name>Share Revocation Request</name>

<t>When a Share is deleted, expires, is declined by the Receiving Party, or
access is otherwise withdrawn, the OCM Server SHOULD send a Share
Revocation Request:</t>

<t><list style="symbols">
  <t>to <spanx style="verb">{integrationAPI}/revoke</spanx>,</t>
  <t>with a request body containing a JSON document with the following
fields:</t>
  <t>REQUIRED <spanx style="verb">sender</spanx> (string) - an OCM Address whose domain part
identifies the paired OCM Server, subject to the same allowlist and
signature checks as all Integration API requests.</t>
  <t>REQUIRED <spanx style="verb">providerId</spanx> (string) - the <spanx style="verb">providerId</spanx> of the Share to
revoke.</t>
</list></t>

<t>On receipt of a valid Share Revocation Request, the Protocol Server MUST
stop serving the identified Share, MUST delete the Share Record, and
SHOULD release any resources associated with it (for example, stopping a
computational session that was started for the Share, or invalidating
local sessions derived from its access tokens).</t>

<section anchor="response-1"><name>Response</name>

<t>Revocation MUST be idempotent: if no Share Record exists for the given
(sender domain, providerId), the Protocol Server MUST respond with HTTP
status 200, so that the OCM Server can treat revocation as
fire-and-forget.  This document defines one OPTIONAL response field:</t>

<t><list style="symbols">
  <t>OPTIONAL <spanx style="verb">status</spanx> (string) - e.g. <spanx style="verb">"revoked"</spanx> when a record was found
and revoked, <spanx style="verb">"gone"</spanx> when there was nothing to revoke.</t>
</list></t>

<t>Error responses are as for Share Provisioning.</t>

</section>
</section>
<section anchor="liveness"><name>Liveness</name>

<t>A Protocol Server SHOULD respond to a GET request to <spanx style="verb">{integrationAPI}</spanx>
(or <spanx style="verb">{integrationAPI}/</spanx>) with HTTP status 200 and a JSON object, so that
operators and OCM Servers can verify reachability of the Integration
API.  The contents of the object are not specified.</t>

</section>
</section>
<section anchor="token-introspection"><name>Token Introspection</name>

<t>Token introspection is the credential validation path of Introspected
Integration.  The introspection endpoint is hosted by the OCM Server or,
when token issuance is delegated, by its Token Server; its URL,
<spanx style="verb">{introspectionEndPoint}</spanx>, is exchanged during pairing.  It is not
advertised in the OCM discovery document: like the Integration API, it
is invisible to the federation.</t>

<t>Note that a legacy credential is opaque and carries no issuer
information, so the Protocol Server has no way to determine which paired
OCM Server to introspect against; Introspected Integration therefore
cannot work in multi-tenant deployments, where one Protocol Server
serves more than one OCM Server through the same protocol endpoint.</t>

<section anchor="request"><name>Request</name>

<t>To validate a presented credential, the Protocol Server sends an HTTP
POST request to <spanx style="verb">{introspectionEndPoint}</spanx> as specified by [RFC7662]: the
request body is <spanx style="verb">application/x-www-form-urlencoded</spanx> with a <spanx style="verb">token</spanx>
parameter carrying the credential exactly as presented on the front
channel.  The credential MAY be a legacy <spanx style="verb">sharedSecret</spanx> or a JWT access
token; the endpoint MUST accept any credential that is valid for a Share
at this OCM Server.</t>

<t>The request MUST be made over TLS and MUST be signed with an HTTP
Message Signature [RFC9421] carrying the label <spanx style="verb">ocm</spanx>, with the same
covered components and <spanx style="verb">created</spanx> rules as Integration API requests.  The
<spanx style="verb">keyid</spanx> MUST identify a key in the Protocol Server's own JWKS,
published at the JWKS URL exchanged during pairing
(<spanx style="verb">{protocolServerJwksUri}</spanx>) [RFC7517].
The introspection endpoint MUST verify that the <spanx style="verb">keyid</spanx> domain belongs
to a paired Protocol Server and MUST verify the signature against that
domain's JWKS before evaluating the credential; unauthenticated or
unpaired requests MUST be rejected without revealing whether the
presented credential is valid.  This authentication requirement is what
keeps the endpoint from acting as a credential-validity oracle (Section
4 of [RFC7662]).</t>

</section>
<section anchor="response-2"><name>Response</name>

<t>The response is an [RFC7662] introspection response.  For an unknown,
expired or revoked credential the endpoint MUST respond with <spanx style="verb">{"active":
false}</spanx> and no other members.  For a valid credential the response
object MUST contain:</t>

<t><list style="symbols">
  <t><spanx style="verb">active</spanx> (boolean) - <spanx style="verb">true</spanx>.</t>
  <t><spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>, <spanx style="verb">aud</spanx> (strings) - with the claim semantics this document
defines for access tokens (see Token Issuance by the OCM Server).</t>
  <t><spanx style="verb">exp</spanx> (integer) - for a JWT, the token's own <spanx style="verb">exp</spanx>; for a legacy
<spanx style="verb">sharedSecret</spanx>, the time until which the Protocol Server may rely on
this response.  The endpoint MUST set a short horizon (on the order of
minutes), since <spanx style="verb">exp</spanx> also bounds revocation latency.</t>
  <t><spanx style="verb">client_id</spanx> (string) - the Share's <spanx style="verb">providerId</spanx>, when the Share is
provisioned to the calling Protocol Server.</t>
  <t><spanx style="verb">ocm_ip</spanx> (object) - the Share information as defined for the <spanx style="verb">ocm_ip</spanx>
claim, when the Share is not provisioned to the calling Protocol Server.</t>
</list></t>

<t>The Protocol Server uses exactly one of these: a <spanx style="verb">client_id</spanx> naming a
Share Record, or the <spanx style="verb">ocm_ip</spanx> member, as described in Token
Verification.</t>

<t>The Protocol Server MAY cache a positive response until its <spanx style="verb">exp</spanx> and
MUST NOT rely on it beyond that.  Negative responses SHOULD NOT be
cached for more than a brief interval.</t>

</section>
</section>
<section anchor="front-channel-resource-access"><name>Front Channel: Resource Access</name>

<section anchor="token-issuance-by-the-ocm-server"><name>Token Issuance by the OCM Server</name>

<t>Token issuance follows the Code Flow of [OCM]: the Receiving Server
exchanges the <spanx style="verb">sharedSecret</spanx> from the Share Creation Notification for an
access token at the OCM Server's <spanx style="verb">tokenEndPoint</spanx>.  [OCM] treats the
issued <spanx style="verb">access_token</spanx> as an opaque bearer credential and leaves its
format at the issuer's discretion.  This document profiles that format.</t>

<t>For every Share in Provisioned or Self-Contained Integration, the
<spanx style="verb">access_token</spanx> MUST be a JWT conforming to the JWT Profile for OAuth 2.0
Access Tokens [RFC9068].  The JOSE header MUST include <spanx style="verb">typ</spanx> with the
value set to <spanx style="verb">at+jwt</spanx> and MUST include a <spanx style="verb">kid</spanx> parameter identifying
the OCM Server's signatory key, advertised in the JWK Set located via
the <spanx style="verb">jwksUri</spanx> field of its Discovery response, and
MUST NOT use <spanx style="verb">none</spanx> as the <spanx style="verb">alg</spanx>.  The JWT MUST be signed with the
private key corresponding to that signatory key, allowing anyone with
access to the corresponding public key, including a Protocol Server, to
verify the token independently.  The <spanx style="verb">expires_in</spanx> value of the token
response MUST agree with the <spanx style="verb">exp</spanx> claim.  Receiving Servers are
unaffected: they continue to treat the token as opaque, per [OCM].</t>

<t>The JWT Claims Set MUST include the claims required by [RFC9068], with
the following OCM-specific semantics, on which the Protocol Server
relies:</t>

<t><list style="symbols">
  <t><spanx style="verb">iss</spanx> - the Sending Server identifier, derived from the scheme and
authority of the signatory keyId.</t>
  <t><spanx style="verb">sub</spanx> - the Share owner on the Sending Server.</t>
  <t><spanx style="verb">aud</spanx> - the OCM principal authorized by the token, i.e. the
<spanx style="verb">shareWith</spanx> value of the Share.  Per Section 4.1.3 of [RFC7519] the
interpretation of audience values is application-specific, and this
document defines that interpretation.</t>
  <t><spanx style="verb">client_id</spanx> - as defined in Section 4.3 of [RFC8693], which forwards
to Section 2.2 of [RFC6749].  Verifiers MUST NOT assume a particular
size or format beyond what this document specifies per integration
mode.</t>
  <t><spanx style="verb">iat</spanx>, <spanx style="verb">exp</spanx>, <spanx style="verb">jti</spanx> - as in [RFC9068].</t>
</list></t>

<t>Further requirements apply per integration mode.</t>

<t>For a Share in Provisioned Integration:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">client_id</spanx> claim MUST equal the <spanx style="verb">providerId</spanx> of the Share.</t>
  <t>The token MUST NOT carry the <spanx style="verb">ocm_ip</spanx> claim.  Mixing the modes for a
single Share would allow a self-contained token to outlive the
revocation of the Share Record (see Security Considerations).</t>
</list></t>

<t>For a Share in Self-Contained Integration:</t>

<t><list style="symbols">
  <t>The token MUST carry the <spanx style="verb">ocm_ip</spanx> claim described in the next section.</t>
  <t>The <spanx style="verb">exp</spanx> claim MUST NOT be later than the Share's <spanx style="verb">expiration</spanx>, when
the Share has one.</t>
  <t>The token SHOULD be short-lived: the RECOMMENDED lifetime is on the
order of minutes or for special use-cases, hours, relying on the
Receiving Server to re-exchange the <spanx style="verb">sharedSecret</spanx> for a fresh token per
[OCM].  Because no revocation signal exists in this mode, the remaining
lifetime of the longest-lived valid token is exactly how long access
survives the end of the Share.</t>
  <t>Once the Share ends, the OCM Server MUST NOT issue further tokens for
it.  This holds in all modes, but in Self-Contained Integration it is
the only revocation mechanism.</t>
</list></t>

<t>For a Share in Introspected Integration, no additional issuance
requirements apply.  Typically no token is issued at all, since this
mode serves Receiving Servers that present the legacy <spanx style="verb">sharedSecret</spanx>
directly.  Should such a Share nevertheless be exchanged for tokens, the
Protocol Server can validate those tokens through the same introspection
endpoint.</t>

</section>
<section anchor="the-ocmip-claim"><name>The ocm_ip Claim</name>

<t>The value of the <spanx style="verb">ocm_ip</spanx> claim is a JSON object carrying the Share
information that the Share Provisioning Request carries in Provisioned
Integration.  The Share's parties are deliberately not part of the
claim: the owner and the Receiving Party are already bound by the <spanx style="verb">sub</spanx>,
<spanx style="verb">iss</spanx> and <spanx style="verb">aud</spanx> claims of the enclosing token.</t>

<t>Fields:</t>

<t><list style="symbols">
  <t>REQUIRED <spanx style="verb">protocol</spanx> (object) - as the <spanx style="verb">protocol</spanx> object of [OCM],
restricted to the protocol entries this token grants access to.  It MUST
NOT contain <spanx style="verb">sharedSecret</spanx> fields.</t>
  <t>REQUIRED <spanx style="verb">providerId</spanx> (string) - as in [OCM]; opaque identifier of the
Share at the OCM Server, useful for logging and correlation.</t>
  <t>REQUIRED <spanx style="verb">resourceType</spanx> (string) - as in [OCM].</t>
  <t>OPTIONAL <spanx style="verb">name</spanx> (string) - as in [OCM].</t>
  <t>OPTIONAL <spanx style="verb">shareType</spanx> (string) - as in [OCM].</t>
  <t>OPTIONAL <spanx style="verb">expiration</spanx> (integer) - as in [OCM].</t>
</list></t>

<t>Fields in the <spanx style="verb">ocm_ip</spanx> claim that the Protocol Server does not
understand MUST be ignored.</t>

</section>
<section anchor="token-verification-by-the-protocol-server"><name>Token Verification by the Protocol Server</name>

<t>When a front-channel request presents a credential, the Protocol Server
MUST authorize it as follows:</t>

<t><list style="numbers" type="1">
  <t>If the credential parses as a JWT, extract the <spanx style="verb">iss</spanx> claim without
trusting it; reject the credential if <spanx style="verb">iss</spanx> is missing or is not an
<spanx style="verb">https</spanx> URL, and continue with step 2.  If it does not parse as a JWT,
or when the Protocol Server prefers introspection over local
verification, validate the credential through Token Introspection
instead: an <spanx style="verb">active</spanx> response supplies the fields (<spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>, <spanx style="verb">aud</spanx>,
<spanx style="verb">exp</spanx>, <spanx style="verb">client_id</spanx>, <spanx style="verb">ocm_ip</spanx>) used in steps 4 to 6, and steps 2 and 3
are skipped; an inactive response means the request is rejected.</t>
  <t>Resolve the signing key: fetch (or use a cached copy of) the OCM
Server's Discovery document at <spanx style="verb">https://&lt;iss-host&gt;/.well-known/ocm</spanx>,
read its <spanx style="verb">jwksUri</spanx> field, fetch the JWK Set from that URL, and select
the key matching the token's <spanx style="verb">kid</spanx> header parameter.</t>
  <t>Verify the token signature and validity per [RFC9068]: the algorithm
MUST be an asymmetric algorithm matching the key, MUST NOT be <spanx style="verb">none</spanx>,
and the <spanx style="verb">exp</spanx> claim MUST be in the future.  The claims <spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>,
<spanx style="verb">aud</spanx>, <spanx style="verb">exp</spanx> and <spanx style="verb">client_id</spanx> MUST all be present.</t>
  <t>Determine the integration mode:
  <list style="symbols">
      <t>If a Share Record exists for the pair (host part of <spanx style="verb">iss</spanx>,
<spanx style="verb">client_id</spanx> claim), the token is authorized against that record
(Provisioned Integration).  Any <spanx style="verb">ocm_ip</spanx> claim in the token MUST be
ignored.</t>
      <t>Otherwise, if the verified token carries an <spanx style="verb">ocm_ip</spanx> claim and the
host part of <spanx style="verb">iss</spanx> is paired for Self-Contained Integration, or the
introspection response carries an <spanx style="verb">ocm_ip</spanx> member, the credential is
authorized against those claims.</t>
      <t>Otherwise, reject the request.  Because Share Records only come
into existence through signed back-channel requests from paired OCM
Servers, the <spanx style="verb">ocm_ip</spanx> claim is only honored for paired issuers, and
introspection only ever consults paired endpoints, credentials from
unrelated issuers, however validly signed, grant nothing.</t>
    </list></t>
  <t>Perform identity binding (next section).</t>
  <t>Serve the request according to the protocol entry of the Share Record
or of the <spanx style="verb">ocm_ip</spanx> claim or member, honoring its permissions (e.g.
<spanx style="verb">protocol.webdav.permissions</spanx>), its <spanx style="verb">expiration</spanx> if present, and any
protocol-specific restrictions.</t>
</list></t>

<t>The token's <spanx style="verb">exp</spanx> claim is authoritative for token lifetime.  Any expiry
hint delivered alongside the token on the front channel (such as the
<spanx style="verb">access_token_ttl</spanx> form field used by WOPI-style web applications) MUST
agree with the <spanx style="verb">exp</spanx> claim, otherwise the access MUST be rejected.</t>

<t>The Protocol Server MAY cache JWKS documents.  It SHOULD bound the cache
lifetime so that key rotation and key revocation at the OCM Server take
effect within a reasonable time.</t>

</section>
<section anchor="identity-binding"><name>Identity Binding</name>

<t>In Provisioned Integration, a valid signature and a matching Share
Record are not sufficient: the token MUST also be bound to the
identities stored in the record.  The Protocol Server MUST verify that:</t>

<t><list style="symbols">
  <t>the OCM Address formed as <spanx style="verb">&lt;sub&gt;@&lt;iss-host&gt;</spanx> equals the Share Record's
<spanx style="verb">owner</spanx>, and</t>
  <t>the <spanx style="verb">aud</spanx> claim equals the Share Record's <spanx style="verb">shareWith</spanx>.</t>
</list></t>

<t>Comparison of OCM Addresses SHOULD be performed after canonicalising the
host part (lowercasing, removing any stray scheme prefix or trailing
slash); the identifier part is opaque and MUST be compared byte for
byte.</t>

<t>These checks ensure that an access token can only be used for the exact
Share it was issued for: a token legitimately issued to one Receiving
Party for one Resource cannot be replayed against a Share Record
involving any other party or Resource, even at the same Protocol Server
and from the same OCM Server.  The same checks apply when the fields
come from an introspection response that names a Share Record via
<spanx style="verb">client_id</spanx>.</t>

<t>In Self-Contained Integration, and when serving from the <spanx style="verb">ocm_ip</spanx> member
of an introspection response, there is no stored record to compare
against: the credential itself is the authority, and the owner and the
Receiving Party are read directly from <spanx style="verb">&lt;sub&gt;@&lt;iss-host&gt;</spanx> and <spanx style="verb">aud</spanx>.
The cross-checks above therefore do not apply; what remains is to
enforce the scope of the <spanx style="verb">ocm_ip</spanx> claim (protocol entries, permissions,
expiration) and, where the protocol concerned authenticates the
Receiving Party, to derive that identity from <spanx style="verb">aud</spanx> using the same
canonicalisation rules.</t>

</section>
<section anchor="token-presentation-per-protocol"><name>Token Presentation per Protocol</name>

<t>How the access token reaches the Protocol Server depends on the access
protocol, and follows [OCM] and its protocol-specific companion
specifications.  Non-normative summary:</t>

<t><list style="symbols">
  <t><spanx style="verb">webdav</spanx> - the Receiving Server acts as the API client and presents
the token in the <spanx style="verb">Authorization: Bearer</spanx> header of its WebDAV requests
to the advertised <spanx style="verb">webdav</spanx> endpoint.</t>
  <t><spanx style="verb">webapp</spanx> - the Receiving Server delivers the token to the Receiving
Party's user agent, which presents it to the advertised <spanx style="verb">webapp</spanx>
endpoint via a form POST (<spanx style="verb">access_token</spanx> field), keeping the token out
of URLs.  The Protocol Server typically responds by establishing a
session (e.g. a cookie scoped to the application) and serving the
application.</t>
  <t><spanx style="verb">ssh</spanx> - SSH access is authenticated with the recipient's public key
per [OCM] rather than with a bearer token.  An SSH/SFTP Protocol Server
uses the Share Provisioning Request to learn which key material and
paths to authorize, and the Share Revocation Request to withdraw that
authorization.  The token verification rules of this section do not
apply to the SSH data channel itself, and Self-Contained Integration is
consequently not applicable to <spanx style="verb">ssh</spanx>: there is no token presentation
through which an <spanx style="verb">ocm_ip</spanx> claim could travel.</t>
</list></t>

</section>
</section>
<section anchor="lifecycle"><name>Lifecycle</name>

<section anchor="ordering"><name>Ordering</name>

<t>In Provisioned Integration, the OCM Server MUST send the Share
Provisioning Request, and receive a success response, before sending the
Share Creation Notification to the Receiving Server.  If provisioning
fails, the OCM Server MUST NOT create the Share: otherwise the Receiving
Party would be notified of a Share whose Resource access cannot work.</t>

</section>
<section anchor="revocation-and-expiration"><name>Revocation and Expiration</name>

<t>The OCM Server SHOULD send a Share Revocation Request whenever a Share
ends, whatever the cause: unshared by the Sending Party, declined by the
Receiving Party (e.g. on receipt of a <spanx style="verb">SHARE_DECLINED</spanx> notification), or
administratively removed.</t>

<t>Revocation is deliberately fire-and-forget: because it is idempotent on
the Protocol Server side, the OCM Server MAY retry it at any time, and a
failure to deliver it MUST NOT block the unshare operation on the OCM
Server.</t>

<t>The Protocol Server SHOULD apply its own bounds on Share Record lifetime
as a backstop against missed revocations:</t>

<t><list style="symbols">
  <t>If the provisioned Share carries an <spanx style="verb">expiration</spanx>, the Protocol Server
SHOULD stop serving the Share at that time.</t>
  <t>The Protocol Server MAY additionally expire Share Records after an
implementation-defined maximum lifetime; an OCM Server can always
re-provision (idempotently) to extend it.</t>
</list></t>

<t>Note that token expiry alone already limits the damage of a missed
revocation on bearer-token protocols: once the OCM Server stops issuing
fresh tokens for a Share, access ends when the last issued token
expires.</t>

</section>
<section anchor="lifecycle-in-self-contained-integration"><name>Lifecycle in Self-Contained Integration</name>

<t>Self-Contained Integration has no provisioning step and no revocation
push.  The Share's lifecycle is enforced entirely at token issuance:</t>

<t><list style="symbols">
  <t>The OCM Server MUST stop issuing tokens for a Share when it ends,
whatever the cause: unshared by the Sending Party, declined by the
Receiving Party, expired, or administratively removed.</t>
  <t>Until the last issued token expires, the Protocol Server will continue
to honor it.  Revocation latency is therefore bounded by the maximum
token lifetime, which is why the issuance rules require short-lived
tokens in this mode.</t>
</list></t>

<t>Because the Protocol Server keeps no per-share state, there is nothing
for it to expire or reap.  Protocols that do allocate per-share state
are steered to Provisioned Integration (see Integration Modes); a
Protocol Server that nevertheless creates transient state in this mode
(such as login sessions) SHOULD bound its lifetime independently of the
tokens that created it.</t>

</section>
<section anchor="lifecycle-in-introspected-integration"><name>Lifecycle in Introspected Integration</name>

<t>Introspected Integration needs neither provisioning nor a revocation
push for credential validity: every authorization consults the OCM
Server, modulo response caching, so a revoked or expired Share stops
being served as soon as cached introspection responses expire.
Revocation latency is bounded by the <spanx style="verb">exp</spanx> horizon of the responses,
which the introspection endpoint MUST keep short (see Token
Introspection).</t>

<t>Note that introspection only validates credentials.  If the Protocol
Server allocates per-share resources, it still needs the Share
Revocation Request of Provisioned Integration to release them, which is
one reason the two modes compose.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="threat-model"><name>Threat Model</name>

<t>The threat model follows the Internet threat model described in
[RFC3552] and inherits the trust assumptions of [OCM].  It assumes that
the Sending and Receiving OCM Servers, paired Protocol Servers, and any
delegated Token Server have not been compromised and correctly enforce
the protocol and their local authorization policies.  Their
administrative interfaces, host operating systems, private keys,
credentials, and underlying storage are part of the trusted endpoints.
Compromise of an endpoint or its trusted infrastructure is outside the
scope of this specification.</t>

<t>An attacker is assumed to have extensive control of the communication
channel and may observe, block, replay, insert, modify, delay, or
reorder traffic.  TLS, HTTP Message Signatures, JWT signatures, and
authenticated introspection provide the protections described in this
specification against such an attacker.</t>

<t>An attacker may operate an OCM Server or Protocol Server of their own,
control a remote user, steal a bearer credential, or submit malformed
back-channel or front-channel requests.  An unpaired server can make
assertions under its own identity, but must not thereby gain access to a
pairing, a Share Record, or a Resource.  Implementations are expected to
verify pairing, authentication, identity binding, permissions, and
Resource scope independently.</t>

<t>Pairing creates an explicit administrative trust relationship.  A
paired OCM Server is trusted to provision authorized Shares, issue
tokens for valid grants, and provide truthful Share information.  A
Protocol Server is part of the Sending Server's trusted computing base
for every protocol it serves and is trusted to enforce identity
bindings, permissions, and protocol restrictions.  A delegated Token
Server is trusted with token-signing authority and with the Share and
identity information needed to issue credentials.</t>

<t>Provisioned and Introspected Integration disclose the full Share
Creation Notification payload to the Protocol Server with every
<spanx style="verb">sharedSecret</spanx> removed.  Depending on the Share, this can include the
sender, owner, Receiving Party, display names, Resource name and
description, Resource and Share types, protocol endpoints, permissions,
expiration, and extension metadata.  Provisioned Integration transfers
this information over the signed back channel before Resource access
and normally stores it as a Share Record.  Introspected Integration
transfers it through the additional introspection exchange and permits
the resulting response to be cached until its stated expiration.  In
addition to the Share information returned by introspection, the
Protocol Server receives the presented <spanx style="verb">sharedSecret</spanx> itself and may use
or retain it as permitted under Secret Handling.</t>

<t>Self-Contained Integration discloses slightly less information.  The
JWT presented to the Protocol Server contains the <spanx style="verb">ocm_ip</spanx> claim with
the protocol details, <spanx style="verb">providerId</spanx>, Resource type, and selected optional
Share metadata, while the enclosing JWT claims identify the issuer,
owner, and Receiving Party.  The same JWT form is used by Introspected
Integration, but Self-Contained Integration performs no additional
introspection request.  The <spanx style="verb">ocm_ip</spanx> contents are visible to the
Protocol Server and to every other holder of the JWT, including a
Receiving Party's user agent for applicable protocols.</t>

<t>Bearer tokens grant access to their holder until they expire or cease
to be accepted and therefore need to remain confidential.  The
cryptographic mechanisms authenticate assertions and protect exchanges
in transit; they do not establish that Resource content is safe.</t>

<t>The three modes make different availability and revocation trade-offs.
Provisioned Integration depends on delivery of lifecycle requests.
Self-Contained Integration cannot revoke an issued token before expiry.
Introspected Integration depends on availability of the introspection
endpoint and permits revocation only after cached positive responses
expire.  No mode prevents a required OCM Server or Protocol Server from
selectively or completely denying service.</t>

</section>
<section anchor="secret-handling"><name>Secret Handling</name>

<t>Provisioned and Self-Contained Integration avoid transferring the
Share's <spanx style="verb">sharedSecret</spanx> to the Protocol Server.  Introspected Integration
necessarily exposes the presented credential to the Protocol Server and
therefore has different secret-handling requirements:</t>

<t><list style="symbols">
  <t>The Integration API strips every <spanx style="verb">sharedSecret</spanx> from the provisioning
payload, and the <spanx style="verb">ocm_ip</spanx> claim does not contain one.  A Protocol Server
therefore receives no <spanx style="verb">sharedSecret</spanx> through either of those mechanisms.</t>
  <t>In Introspected Integration, the Receiving Server may present a legacy
<spanx style="verb">sharedSecret</spanx> on the front channel.  The Protocol Server MUST
successfully introspect the credential before relying on it.</t>
  <t>After successful introspection, the Protocol Server MAY use the
presented <spanx style="verb">sharedSecret</spanx> to access another protocol entry of the same
Share when this is necessary to serve the requested protocol.  For
example, a web application Protocol Server may use it to access a WebDAV
entry in the same multi-protocol Share, whether that entry is served by
another Protocol Server or by the OCM Server.</t>
  <t>Such use MUST remain within the Resource, protocols, permissions, and
parties identified by the successful introspection response.  The
credential MUST NOT be used for another Share or retained beyond the
period during which the introspection response may be relied upon.
Continued use after that period requires a new successful introspection.</t>
  <t>A Protocol Server that retains a <spanx style="verb">sharedSecret</spanx> for this purpose MUST
protect it as a bearer credential.  It MUST NOT place it in URLs or logs
and MUST delete it when it is no longer needed.</t>
  <t>No pairing secret exists; the back channel is authenticated by HTTP
Message Signatures against published keys, the front channel by JWT
signatures against the same keys, and introspection requests by HTTP
Message Signatures against the Protocol Server's published keys.</t>
  <t>The Protocol Server holds no signing keys for this protocol, with two
exceptions: a Protocol Server using Introspected Integration holds a
request-signing key, published at the JWKS URL exchanged during
pairing, and
a delegated Token Server (sketched in the note on delegating the token
endpoint) holds its own token-signing key, whose public part is
published through the OCM Server's JWKS.</t>
</list></t>

<t>The Protocol Server does handle bearer access tokens on the front
channel.  These MUST be treated as confidential, MUST NOT be placed in
URLs, and SHOULD NOT be logged or persisted beyond their lifetime,
consistent with the Code Flow considerations of [OCM].</t>

</section>
<section anchor="legacy-shared-secret-access-requires-introspection"><name>Legacy Shared-Secret Access Requires Introspection</name>

<t>Without the Code Flow, the only credential is the long-lived
<spanx style="verb">sharedSecret</spanx> itself, which the Receiving Server presents directly on
the front channel.  The Protocol Server cannot validate it on its own.
A Protocol Server MUST NOT accept a front-channel credential other than
a verifiable access token or a credential validated through Token
Introspection, except for the SSH public-key mechanism of [OCM].</t>

<t>Successful introspection authorizes the Protocol Server to rely on the
credential until the <spanx style="verb">exp</spanx> horizon of the introspection response.  This
includes using the credential for another protocol entry of the same
Share as described under Secret Handling.</t>

<t>Introspected Integration therefore reintroduces, deliberately and only
for compatibility, the per-request coupling to the OCM Server that the
other modes remove.  Deployments that do not need to serve legacy
Receiving Servers SHOULD NOT enable it.</t>

<t>The introspection endpoint is a sensitive interface: left
unauthenticated, it would let anyone test guessed or stolen credentials
for validity (Section 4 of [RFC7662]).  The signature and pairing
requirements of the Token Introspection section are therefore mandatory,
and the endpoint SHOULD additionally rate-limit failed introspections
per caller.</t>

</section>
<section anchor="trust-granted-to-the-paired-ocm-server"><name>Trust Granted to the Paired OCM Server</name>

<t>Pairing grants the OCM Server significant power over the Protocol
Server: every accepted Share Provisioning Request may consume resources
(storage, compute sessions) and instructs the Protocol Server to serve
content to third parties.  The allowlist is therefore REQUIRED, and an
empty allowlist means the Integration API rejects all requests.</t>

<t>The Protocol Server SHOULD apply resource limits per paired OCM Server
(number of Share Records, concurrent sessions, storage) so that requests
from one pairing, including excessive requests caused by malfunction or
an unexpectedly large workload, cannot exhaust it.</t>

<t>Conversely, the OCM Server places trust in the Protocol Server to
enforce the permissions and identity bindings of this document.
Operators SHOULD treat the Protocol Server as part of the Sending
Server's trusted computing base for the protocols it serves.</t>

</section>
<section anchor="self-contained-tokens"><name>Self-Contained Tokens</name>

<t>Self-Contained Integration shifts all authority into the token, with
three major consequences:</t>

<t><list style="symbols">
  <t>Revocation latency.  An issued token cannot be withdrawn; it can only
expire.  The normative cap on token lifetime in the issuance rules is
what keeps "unshare" meaningful in this mode, and implementations MUST
NOT relax it by issuing long-lived self-contained tokens for
convenience.</t>
  <t>Metadata exposure.  The <spanx style="verb">ocm_ip</spanx> claim is readable by anyone who holds
the token.  For <spanx style="verb">webapp</spanx> Shares in particular, the token transits the
Receiving Party's user agent, so the embedded Share metadata is visible
to the Receiving Party.  The OCM Server MUST NOT place information in
the <spanx style="verb">ocm_ip</spanx> claim that the Receiving Party is not entitled to see, and
SHOULD keep the claim minimal.</t>
  <t>Allowlist is mandatory.  In Provisioned Integration, pairing is
implicitly enforced by the existence of the Share Record.  In
Self-Contained Integration the issuer allowlist is the only thing
standing between any internet-hosted JWKS and Resource access; the
requirement to check the token's issuer against the pairing allowlist
before honoring an <spanx style="verb">ocm_ip</spanx> MUST be enforced.</t>
</list></t>

<t>Provisioned and Self-Contained Integration MUST NOT be mixed for a
single Share.  If a provisioned Share's tokens also carried <spanx style="verb">ocm_ip</spanx>
claims, a token issued before a Share Revocation Request would continue
to grant access through the self-contained path until it expired,
silently surviving the revocation.  This is why the issuance rules
forbid the <spanx style="verb">ocm_ip</spanx> claim on tokens for provisioned Shares, and why
verification gives an existing Share Record precedence over the claim.
Introspected Integration, by contrast, composes safely with Provisioned
Integration: the introspection response names the Share Record via
<spanx style="verb">client_id</spanx>, and revocation of the record takes effect immediately.</t>

</section>
<section anchor="signature-and-token-verification-considerations"><name>Signature and Token Verification Considerations</name>

<t>All the verification rules of [OCM] for HTTP Message Signatures apply to
the back channel, in particular: exactly one <spanx style="verb">ocm</spanx>-labeled signature,
required covered components, <spanx style="verb">created</spanx> freshness, <spanx style="verb">keyid</spanx> domain
matching the sender domain, and rejection of symmetric algorithms.  Two
considerations deserve emphasis in the Protocol Server context:</t>

<t><list style="symbols">
  <t>Reverse proxies: when TLS terminates in front of the Protocol Server,
the internally observed URI differs from the signed <spanx style="verb">@target-uri</spanx>.  The
Protocol Server MUST reconstruct the public URL for verification, and
MUST only trust forwarding headers set by its own proxy.</t>
  <t>Issuer/key binding: on the front channel, the key used to verify a
token MUST be fetched from the JWKS of the token's own <spanx style="verb">iss</spanx> host, and
the Share Record lookup MUST use that same host.  An implementation that
verifies against one domain's keys but looks up records under another's
would allow cross-tenant confusion on multi-tenant Protocol Servers.</t>
</list></t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<t>The Integration API performs the allowlist check before fetching any
keys, so unsolicited requests from arbitrary servers are rejected
without outbound traffic.  Front-channel token verification does fetch
JWKS documents from token-asserted issuers; implementations SHOULD
rate-limit verification failures and SHOULD restrict JWKS fetching to
the domains of paired OCM Servers, since no unpaired issuer's credential
can ever be honored in any integration mode.  In Introspected
Integration the Protocol Server additionally generates one introspection
request per uncached front-channel credential; implementations SHOULD
apply negative caching with a short lifetime so that a flood of invalid
credentials does not translate into a flood of introspection traffic
towards the OCM Server.</t>

</section>
<section anchor="underlying-security-specifications"><name>Underlying Security Specifications</name>

<t>This specification relies on the base Open Cloud Mesh protocol [OCM],
HTTP Message Signatures [RFC9421], JSON Web Keys and JWK Sets [RFC7517],
Digest Fields [RFC9530], JSON Web Tokens [RFC7519], OAuth 2.0 Token
Introspection [RFC7662], and the JWT Profile for OAuth 2.0 Access Tokens
[RFC9068].  All security considerations in those specifications apply
to implementations of OCM-IP.</t>

<t>These specifications need to be considered together.  A signature or
token is only as trustworthy as the provenance and protection of its
key, a signed <spanx style="verb">Content-Digest</spanx> provides content integrity only when both
the signature and digest are validated, and an active introspection
response grants authority only within the authenticated pairing and
until its stated expiration.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="json-web-token-claims-registry"><name>JSON Web Token Claims Registry</name>

<t>The following claim is to be registered in the "JSON Web Token Claims"
registry (using the template from [RFC7519]): Claim Name: ocm_ip Claim
Description: Open Cloud Mesh Share information for self-contained
Protocol Server integration Change Controller: IETF Specification
Document(s): the present Draft, once in RFC form</t>

</section>
<section anchor="oauth-token-introspection-response-registry"><name>OAuth Token Introspection Response Registry</name>

<t>The following member is to be registered in the "OAuth Token
Introspection Response" registry established by [RFC7662]: Name: ocm_ip
Description: Open Cloud Mesh Share information for Protocol Server
integration Change Controller: IETF Specification Document(s): the
present Draft, once in RFC form</t>

<t>No other IANA actions are required.  Neither the Integration API nor the
introspection endpoint is exposed at a Well-Known URI; their locations
are exchanged during pairing.</t>

</section>
</section>
<section anchor="copying-conditions"><name>Copying conditions</name>

<t>The author(s) agree to grant third parties the irrevocable right to
copy, use and distribute the work, with or without modification, in any
medium, without royalty, provided that, unless separate permission is
granted, redistributed modified works do not contain misleading author,
version, name of work, or endorsement information.</t>

</section>
<section anchor="references"><name>References</name>

<section anchor="normative-references"><name>Normative References</name>

<t>[OCM] Lo Presti, G., de Jong, M.B., Baghbani, M. and Nordin, M.  "<eref target="https://datatracker.ietf.org/doc/draft-ietf-ocm-open-cloud-mesh/">Open
Cloud Mesh</eref>", Work
in Progress.</t>

<t>[RFC2119] Bradner, S. "<eref target="https://datatracker.ietf.org/doc/html/rfc2119">Key words for use in RFCs to Indicate
Requirement Levels</eref>",
March 1997.</t>

<t>[RFC7517] Jones, M., "<eref target="https://datatracker.ietf.org/doc/html/rfc7517">JSON Web Key (JWK)</eref>", May 2015.</t>

<t>[RFC7519] Jones, M., Bradley, J., Sakimura, N., "<eref target="https://datatracker.ietf.org/doc/html/rfc7519">JSON Web Token
(JWT)</eref>", May 2015.</t>

<t>[RFC7662] Richer, J. (ed), "<eref target="https://datatracker.ietf.org/doc/html/rfc7662">OAuth 2.0 Token Introspection</eref>", October 2015.</t>

<t>[RFC8174] Leiba, B. "<eref target="https://datatracker.ietf.org/html/rfc8174">Ambiguity of Uppercase vs Lowercase in RFC 2119
Key Words</eref>", May 2017.</t>

<t>[RFC8615] Nottingham, M. "<eref target="https://datatracker.ietf.org/doc/html/rfc8615">Well-Known Uniform Resource Identifiers
(URIs)</eref>", May 2019.</t>

<t>[RFC9068] Bertocci, V., "<eref target="https://datatracker.ietf.org/doc/html/rfc9068">JSON Web Token (JWT) Profile for OAuth 2.0
Access Tokens</eref>", October
2021.</t>

<t>[RFC9421] Backman, A., Richer, J. and Sporny, M. "<eref target="https://tools.ietf.org/html/rfc9421">HTTP Message
Signatures</eref>", February 2024.</t>

<t>[RFC9530] Polli, R., Marwood, D., "<eref target="https://datatracker.ietf.org/doc/html/rfc9530">Digest Fields</eref>", February 2024.</t>

</section>
<section anchor="informative-references"><name>Informative References</name>

<t>[RFC3552] Rescorla, E. and Korver, B.  "<eref target="https://datatracker.ietf.org/doc/html/rfc3552">Guidelines for Writing RFC Text
on Security
Considerations</eref>", BCP 72,
July 2003.</t>

<t>[RFC4918] Dusseault, L. M. "<eref target="https://datatracker.ietf.org/html/rfc4918/">HTTP Extensions for Web Distributed
Authoring and Versioning</eref>",
June 2007.</t>

<t>[RFC6749] Hardt, D. (ed), "<eref target="https://datatracker.ietf.org/html/rfc6749">The OAuth 2.0 Authorization Framework</eref>", October 2012.</t>

<t>[RFC8693] Jones, M., Nadalin, A., Campbell, B., Bradley, J. and
Mortimore, C., "<eref target="https://datatracker.ietf.org/doc/html/rfc8693">OAuth 2.0 Token Exchange</eref>", January 2020.</t>

</section>
</section>
<section anchor="appendix-a-examples"><name>Appendix A: Examples</name>

<t>The first set of examples shows Provisioned Integration:
<spanx style="verb">cloud.example.org</spanx> is the OCM Server and <spanx style="verb">hub.example.org</spanx> is a
Protocol Server running a computational notebook platform, paired with
<spanx style="verb">cloud.example.org</spanx> and serving the <spanx style="verb">webapp</spanx> protocol.  Alice
(<spanx style="verb">alice@cloud.example.org</spanx>) shares a notebook with Bob
(<spanx style="verb">bob@receiver.example.org</spanx>).  Self-Contained and Introspected
Integration examples follow at the end.</t>

<section anchor="share-provisioning-request-1"><name>Share Provisioning Request</name>

<t>The OCM Server pushes the Share to the Protocol Server before notifying
the Receiving Server.  The body is the Share Creation Notification with
every <spanx style="verb">sharedSecret</spanx> removed (line breaks in the signature headers for
display purposes only):</t>

<sourcecode type="http">
POST /services/ocm/shares HTTP/1.1
Host: hub.example.org
Date: Wed, 10 Jun 2026 14:00:00 GMT
Content-Type: application/json
Content-Digest: sha-256=:hj3LWOIuryd4XbzFhoHa6YMUbhtzMdMT3e9Bxpu2Lm0=:
Content-Length: 542
"@signature-params": ("@method" "@target-uri" "content-digest" \
  "content-length");created=1781186400;\
  keyid="cloud.example.org#key1";alg="ed25519";tag="ocm"
Signature: ocm=:[signature-value]:

{
  "shareWith": "bob@receiver.example.org",
  "name": "analysis.ipynb",
  "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
  "owner": "alice@cloud.example.org",
  "sender": "alice@cloud.example.org",
  "shareType": "user",
  "resourceType": "file",
  "protocol": {
    "name": "multi",
    "webdav": {
      "uri": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
      "permissions": [
        "read",
        "write"
      ]
    },
    "webapp": {
      "uri": "https://hub.example.org/services/ocm/open",
      "viewMode": "write"
    }
  }
}
</sourcecode>

<t>The Protocol Server stores the Share Record under (<spanx style="verb">cloud.example.org</spanx>,
<spanx style="verb">7c084226-d9a1-11e6-bf26-cec0c932ce01</spanx>) and responds:</t>

<figure type="http"><artwork><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json

{ "status": "stored" }
]]></artwork></figure>

<t>The OCM Server then sends the Share Creation Notification to
<spanx style="verb">receiver.example.org</spanx> per [OCM], with <spanx style="verb">must-exchange-token</spanx> in the
protocol requirements and with the <spanx style="verb">webapp</spanx> entry pointing at the
Protocol Server (and a fresh <spanx style="verb">sharedSecret</spanx>, which only the Receiving
Server learns).</t>

</section>
<section anchor="access-token"><name>Access Token</name>

<t>When the Receiving Server performs the Code Flow at
<spanx style="verb">https://cloud.example.org/ocm/token</spanx>, the issued JWT carries the JOSE
header:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "typ": "at+jwt",
  "alg": "EdDSA",
  "kid": "cloud.example.org#key1"
}
]]></sourcecode></figure>

<t>and the Claims Set:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "iss": "https://cloud.example.org",
  "sub": "alice",
  "aud": "bob@receiver.example.org",
  "client_id": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
  "iat": 1781186460,
  "exp": 1781190060,
  "jti": "f3b9c0aa-2f6e-4d57-9d24-6f0a1f6d9b11"
}
]]></sourcecode></figure>

</section>
<section anchor="front-channel-access"><name>Front-Channel Access</name>

<t>Bob's user agent form-POSTs the token to the advertised <spanx style="verb">webapp</spanx>
endpoint:</t>

<figure type="http"><artwork><![CDATA[
POST /services/ocm/open HTTP/1.1
Host: hub.example.org
Content-Type: application/x-www-form-urlencoded

access_token=eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFZERTQSIs...
]]></artwork></figure>

<t>The Protocol Server verifies the JWT against the JWK Set advertised
at the <spanx style="verb">jwksUri</spanx> of <spanx style="verb">https://cloud.example.org/.well-known/ocm</spanx>, looks
up the Share Record by (<spanx style="verb">cloud.example.org</spanx>,
<spanx style="verb">7c084226-d9a1-11e6-bf26-cec0c932ce01</spanx>), checks that
<spanx style="verb">alice@cloud.example.org</spanx> equals the stored <spanx style="verb">owner</spanx> and that
<spanx style="verb">bob@receiver.example.org</spanx> equals the stored <spanx style="verb">shareWith</spanx>, and then
starts (or resumes) the notebook session for the Share.</t>

</section>
<section anchor="share-revocation-request-1"><name>Share Revocation Request</name>

<t>When Alice unshares the notebook (body shown without the signature
headers, which are as in the provisioning example):</t>

<figure type="http"><artwork><![CDATA[
POST /services/ocm/revoke HTTP/1.1
Host: hub.example.org
Content-Type: application/json

{
  "sender": "alice@cloud.example.org",
  "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01"
}
]]></artwork></figure>

<figure type="http"><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{ "status": "revoked" }
]]></artwork></figure>

<t>A repeated revocation for the same <spanx style="verb">providerId</spanx> returns <spanx style="verb">{ "status":
"gone" }</spanx> with HTTP status 200.</t>

</section>
<section anchor="self-contained-integration"><name>Self-Contained Integration</name>

<t><spanx style="verb">dav.example.org</spanx> is a stateless WebDAV gateway in front of an existing
storage system, paired with <spanx style="verb">cloud.example.org</spanx> for Self-Contained
Integration.  No provisioning takes place; the gateway exposes no
Integration API and keeps no Share Records.  Alice shares a folder with
Bob, and the OCM Server advertises a <spanx style="verb">webdav</spanx> endpoint at the gateway in
the Share Creation Notification.</t>

<t>When the Receiving Server performs the Code Flow at
<spanx style="verb">https://cloud.example.org/ocm/token</spanx>, the issued JWT carries:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "iss": "https://cloud.example.org",
  "sub": "alice",
  "aud": "bob@receiver.example.org",
  "client_id": "receiver.example.org",
  "iat": 1781186460,
  "exp": 1781186760,
  "jti": "0d9e3c4b-5a6f-4e21-8c37-2b1a9f8e7d65",
  "ocm_ip": {
    "providerId": "9b2e41d7-aa31-4a02-9f0d-3c5e8b7a6f10",
    "resourceType": "folder",
    "name": "dataset-2026",
    "protocol": {
      "webdav": {
        "uri": "9b2e41d7-aa31-4a02-9f0d-3c5e8b7a6f10",
        "permissions": ["read"]
      }
    }
  }
}
]]></sourcecode></figure>

<t>Note the short lifetime (300 seconds): the Receiving Server re-exchanges
the <spanx style="verb">sharedSecret</spanx> at the <spanx style="verb">tokenEndPoint</spanx> for a fresh token before each
expiry, per [OCM], and unsharing takes effect within at most that
lifetime.</t>

<t>The Receiving Server accesses the Resource directly:</t>

<figure type="http"><artwork><![CDATA[
PROPFIND /dav/9b2e41d7-aa31-4a02-9f0d-3c5e8b7a6f10 HTTP/1.1
Host: dav.example.org
Authorization: Bearer eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFZERTQSIs...
Depth: 1
]]></artwork></figure>

<t>The gateway verifies the JWT against the JWK Set advertised at the
<spanx style="verb">jwksUri</spanx> of <spanx style="verb">https://cloud.example.org/.well-known/ocm</spanx>, finds no
Share Record for (<spanx style="verb">cloud.example.org</spanx>, <spanx style="verb">receiver.example.org</spanx>),
confirms that
<spanx style="verb">cloud.example.org</spanx> is paired for Self-Contained Integration, and serves
the PROPFIND read-only, scoped to the <spanx style="verb">uri</spanx> in the <spanx style="verb">ocm_ip</spanx> claim.</t>

</section>
<section anchor="introspected-integration"><name>Introspected Integration</name>

<t><spanx style="verb">legacy.example.com</spanx> is a Receiving Server that does not support the
<spanx style="verb">exchange-token</spanx> capability.  Alice shares the same kind of folder with
Carol (<spanx style="verb">carol@legacy.example.com</spanx>).  The Share Creation Notification is
a legacy [OCM] share: the <spanx style="verb">webdav</spanx> entry points at <spanx style="verb">dav.example.org</spanx> and
carries a <spanx style="verb">sharedSecret</spanx>, with no <spanx style="verb">must-exchange-token</spanx> requirement.
<spanx style="verb">dav.example.org</spanx> is paired with <spanx style="verb">cloud.example.org</spanx> for Introspected
Integration and holds a request-signing key published at the JWKS URL
exchanged during pairing (<spanx style="verb">https://dav.example.org/jwks</spanx>).</t>

<t>The Receiving Server presents the secret directly, per the legacy
resource access flow of [OCM]:</t>

<figure type="http"><artwork><![CDATA[
PROPFIND /dav/4f6a2c81-77b0-4c0e-9e64-1d2f3a5b6c7d HTTP/1.1
Host: dav.example.org
Authorization: Bearer shr-9wq4xkz7vmd2
Depth: 1
]]></artwork></figure>

<t>The credential does not parse as a JWT, so the gateway introspects it
(signature headers as in the provisioning example, but signed by the
gateway with keyid="dav.example.org#key1"):</t>

<figure type="http"><artwork><![CDATA[
POST /ocm/introspect HTTP/1.1
Host: cloud.example.org
Content-Type: application/x-www-form-urlencoded

token=shr-9wq4xkz7vmd2
]]></artwork></figure>

<figure type="http"><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "iss": "https://cloud.example.org",
  "sub": "alice",
  "aud": "carol@legacy.example.com",
  "exp": 1781186760,
  "ocm_ip": {
    "providerId": "4f6a2c81-77b0-4c0e-9e64-1d2f3a5b6c7d",
    "resourceType": "folder",
    "name": "dataset-2026",
    "protocol": {
      "webdav": {
        "uri": "4f6a2c81-77b0-4c0e-9e64-1d2f3a5b6c7d",
        "permissions": [
          "read"
        ]
      }
    }
  }
}
]]></artwork></figure>

<t>The gateway serves the PROPFIND read-only and MAY cache this response
until <spanx style="verb">exp</spanx>.  When Alice unshares the folder, introspection starts
returning <spanx style="verb">{"active": false}</spanx>, and Carol's access ends as soon as the
cached response expires.</t>

</section>
</section>
<section anchor="changes"><name>Changes</name>

<t>This section collects the changes with respect to the previous version
in the IETF datatracker.  It is meant to ease the review process and it
shall be removed when going to RFC last call.</t>

<section anchor="version-00"><name>Version 00</name>

<t><list style="symbols">
  <t>Initial version.</t>
</list></t>

</section>
</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>This protocol generalizes a working integration between Nextcloud and
JupyterHub developed at SUNET, and builds directly on the Code Flow, JWT
access token, and HTTP Message Signature work in the Open Cloud Mesh
specification.  Thanks to the OCM community for the discussions that
shaped the webapp sharing design this document extends, and in
particular to Enrique Pérez Arnaud and Matthias Kraus who helped shape
the format of this protocol.</t>

<t>Work on this document has been funded by [Sovereign Tech Agency][sta]
through the <eref target="https://www.sovereign.tech/programs/fund">Tech Fund</eref>, with a specific <eref target="https://www.sovereign.tech/tech/open-cloud-mesh">project</eref>.</t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+2963bbVpYu+n89BYbqR6RqkJbkWyxX1YhjO4lTvrXlVPbe
OR4mSIIiYhBgA6BlVXXV+5znOC+253XdAFBSus7u02d0RnclIglgYV3m9Zvf
nEwmpiu6Mj9LvnqzzavkaVnvlsmrvF0nL6ouv2iyrqir5G1Td/WiLr8yy3pR
ZRv4/bLJVt2kqptlUU3qxWZSuN9PtvL7yfGJWWTwed1cnSVttzSm2DZnSdfs
2u70+PjR8anJmjw7S55st2WxoKvbJKuWybs8Kyfvi01uPuVXl/CYMxpRU+Xd
5Bk+25i2gx9+zMq6gvFc5S18APfawA+fv//OmGzXrevmzCTJJCmq9ix5NU1e
03jhoyTh13hVLD7l/sd1c5FVxV9pJGfJ+U+vn7+nz/NNVpRnyaesqr9pdzCK
aZvTF7umOEvWXbdtz+7cWdTLfNpu6hJ/ALe6s8H7GzeG76fJyxrmM2+7whvG
98WuzbfbPPoyHMzT5+9e+2O5kIumZb2la75ZwPxMF+uBcfEXd/SXJpiVb7OL
9Rwe5M9Ltl4W4RfhYN7W1TJvkvN61yxyf1QbvPKbLX3d0rc4Ef0hBb9Y1Btj
zGQySbI5rGK2gOV9v86Tm2zK5PDN01eTF2+PkmW+Kqq8Tdb1Jewhuth4F+Pv
jpLzvPkMA1/AD3TL5km7227rpiuqi6Sl79sUPlusk6w15+c/3Dn/7v1b981l
Pk8yt2GTbZl1q7rZwFd1k9C2nNC2TH7O58+e/MXYK7s62eYN/jaxZ6Td5oti
VSwS2OWfErhd0bXJPF9n5WpqDL8bzOoneLGiS7Z12xbzMk/gJkn+pWhp0PAr
ebEWn1GvVmWdLe0zjH0GvjJOL50z+KU/WDtKvPNnmPhisy3zTV51dP8MDqYp
i4t1d5nj/8rvk26ddckablPCCOuqvIJPcrpimzXwKvUqyWBptmV9hfc6M8ui
XdRw5RXM8RqOf7KAY4sjwvn5hM9t211WLXISBG1xUcErTpPkSXXVreE/TW/q
7GLRmHBCVgWNBsfHa5DiZHwulvglrKjJFou85XdtdhU+IZEdQdPzOY9XOaUt
M8/pVfMlzjEM1+DEwT02NbyH3ZG6FHrnvGzzy3Xe5Kmu31VSw0aArbdMLotu
DXOyWsH3MNVtveoucVbw5WE3uG+KatVkcDp2i27X5G5v6Lbv1k2eJ54chlEt
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
L4Z/yKwNXuWGFwfz9y/B7N3gyY+mmg7nh2YXCKjpbjzsIMD+489/Pk9v8c4l
5rR228AvS296MVuGpBs9HfbvpPEokVXtwCnB+CdGyjGVmzvsSZAnEachs5+q
upDIo2+3ZS2OLsg0kVNtER+egmWgkLqdQ0HyKIgJd1Y/ayToKYgVWzlw6CdW
6tUR+VQus0IQQQeMkcj33emgl0X7oJBEltoaraJbUo4m++n7JFFfmvINi09V
fVnmywuMUt8bmQ3nIQ5muvS9fePDzj3YpWSOY30A4zH9BWDX0e4FC6U0fYBQ
5T+RY5iHzthvCMGbofMGFh7d8svVkRnGpk/N/ekwiJofksegH95xGQbKdlk5
NQ9GLlfTsR2ABSUDsCCcqJ5vhqAs+vZ5tXyL7zlLvRS4s0Q1NDQ1D3vrRuG6
1tYGUMx0AI8048jMx2I5o32M7nwCmygr5Q1c8mCm3gpvhG2AduG81unUfD0y
MYd1MzSlUeiRvS/ZQHUQgNAtchQiGIJ3io6fwirMoxscnVCQxguC4wlQTG1K
crAlbLSdFDlY4KIfMopLkzDGm+ijNCFA62Sxzhef+OkFefeE62NsC6x67cbF
6XUPidivX+qBfNDL2OOe/bej8f9RR+P/R6bv3f83Td97/zVN3/sDpu9thk0W
pyTFSFz/p9jND/5r2s0P/zPtZhL3gu7VJMst7eat2J2y/jd+Mqn1+B/P6F5x
YMuqPfrbotLQhlvk2y6x+HxXKeq0v7lPWTTVp2GKIJUwrlzft/c8QLix5oRY
eSM23GjWAWvdBBFMkDpKCkXbNU3Wdcnlib7qloxMmWcNFj+tDKVd+RcWdsZh
5aJpO4croWi6Ak+nmhgcjmj+t+r9b9Vr/ziULIbvKhzd5OL/qno7uvjeP0OT
+JN304tvqUnuq7nxIsi19X858mS1Ug7ZITsKvtx38X8sovoAzQ1KpP6LF8i+
+bD9jPCtnrxnQ97syf6foLdDBXibi+kt4jW7xcVabxR95bTnvsiI02VU5SuH
nREdtGsxk2oCxRkGDfwKbkEcwG82u7abREnT1MzzRYZY9UEAkKS71nVFumpY
fRqXgWY9PZyA9uaTwZG9GIY55PjdfXqBB0ccbLKA/yBaZUFLwTLZOi+CM4+o
UsLpI75F674Hk2qrWjAj2UZW64yDSpQFlAkL94hddPbMNUzQR2Cqz4/RJ8/J
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
dsKibkrYuc95Hv5cM/HBtyRBv98ViPLQtrM/g9VLqXPYue/zL52pK+vOmdB6
vcW64UjwBb59+jZ5eJqaH3clvsTxXZm5e49OYEM927Vtnu1K0G0vp94yPddK
NhkibLFnTqUZ4f6Tavi/sL6CPz8cJjc6a/hwFPswKvDhYVR62qh/WfIDeLwd
LqEVOZTScl5cUOL+HZLlo4q8bn316fiQSOyc2tP+6G4gd19nS+wZzbv7abbZ
znPs9/NtKJI5qgjeWIENTuGH0yE5+VxMpNvsQxwQjvXHrNJteEzq/smWKia/
JE/O4MaE1RajalU0WNKdUzRWYNwthi0u2/HmaTPSx1P5OQ5jpjkwL5VIhKLr
3bz3uz5rSrOruI5VkuiZ1A8i0HJe158wG9nhQbK0CZTlHhpHRGbo0q4eZP1J
iXHCw1mG//6mf5OjpOUcbeZGQKbht/UcLpvX82+kgKEJr8MOTGHGLK6cDcJX
dr7Zl1G8KiyVpDZGITM9pjckXAkyLSPlJBLqJII124x0gAYPbz+vl8oWtLd7
La3FYD2J1OwmhyjAkjlc/cnmEVxMQMPomIvXclwBf3MM4+jMmD+wvlwgWBNL
D/94gMfi4E+GWDbvSE1Qi0047sjqoXC6czI9MT/USKwbbUXzDCy/M5BWIP9P
jhMQLnheHiQn986Oj+H/ku9fvTca9sDuPWd+XcOdX1vwdMOoyBlum8np/Qd/
PFv/evflz29e7Jqr5b3/Mf/rd+v6h+zB/3z103zd/fXV8tX7u/mjb79sd6cv
N8d/PLO3eZlXF936LLl/79QcfGMnaEItPtqDs+Tw4JtNDuJseZAceAkP+EvC
MBOOrRwk/5dJ3Icl3ffg6LFkk/548vDrk5OvH9w7Pn6MP6R80h8Pegfhd/DF
ycHjrLz440G+PL0Ppt/B4y6Dv2CWD5xaJpf4j2e/uBFTc68PsGx/w3FY5m94
hYOx03OAfTUO0IvBX2Vw/K/aAjT89qqa83euDhV/8XBx/PW909MHk+Wj7GRy
cpI/mMxX8CfskePFo7uni/z4hK+jSlK66fB5519x5uz6n2kzJ/wlYjH4Y79/
FH6DRpUdNZ1A+BQnw3tHym7Qj+BDZra1P4JPcGFv8550kYeFgot/kY9pgNnS
/gyfBxZDfiB/f6B//90NBXb6wFBUEUUnKTx86LC58Xwu8kvk58HLvUf+3eD/
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
3iJKMtu0d/CnxkwmE6paNP8bVfiEWiorAQA=

-->

</rfc>

