| Internet-Draft | Multi-Party Authorization | September 2026 |
| Gamb & Maler | Expires 19 March 2027 | [Page] |
User-Managed Access (UMA) 2.0 has one deciding party per protected resource. That holds while a resource has one owner and fails in two directions.¶
Part I of this document specifies a layer above the resource owner: an organization that shares a resource with its members publishes a charter, each member's authorization server narrows her terms to the charter's envelope on write, and the organization is asked once per request over a resource it claims. It may only narrow. Its role model carries one field UMA has no place for — whose agent may act on a shared resource.¶
Part II specifies owners of equal standing: a mandate naming who is entitled to be counted and how many it takes, a signed verdict from each owner's authorization server bound to one negotiation and one agreement, and a tally that folds the owners' terms into the single document the agent signs and issues a grant carrying the verdicts. The enforcement point re-verifies every verdict and re-runs the count, so the counting party is unable to lie rather than trusted.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 19 March 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
[UMAGrant] names a resource rights administrator — someone who administers access to resources she does not necessarily own — and gives the role no wire surface. [PP2PI] lays out four states of co-administration of one person's records and a mechanism for none of them. And nothing in UMA expresses "these parties must both agree", nor lets a relying party check that they did.¶
The agent era makes both gaps urgent rather than academic. The moment a resource is shared, "may her agent touch it" is a question about parties — about whose agent, acting for whom, under whose ceiling — and there is nowhere in UMA 2.0 to put the answer.¶
This document adds two arrangements. In both, the four beats of [U4ACore] are untouched: the challenge, the ticket, the proffered terms, the agreement and the grant are the same on a shared resource as on a personal one. A client cannot tell the difference and does not need to. Everything added is either a document one party publishes or a question asked of a party that already existed.¶
This document is an OPTIONAL extension of [U4ACore] and depends on
[U4ATerms], [U4AFedAuthz] and [U4APolicy]. Its identifying URI is
https://u4a.ai/spec/multiparty/1.0. An implementation MAY implement Part I,
Part II, or both.¶
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.¶
Throughout, a policy unit is as defined in [U4APolicy] Section 2.¶
A party that holds resources and shares administration of them with its members. It publishes a charter, answers a decision endpoint, and signs documents its members' authorization servers verify against keys it publishes.¶
A resource owner under [U4ACore] who has enrolled with an organization. Her authorization server is hers; the organization is a party it consults.¶
The organization and the member's user agent have no relationship, and this document does not invent one. Every message from the organization is addressed to the member's authorization server.¶
An organization MUST publish a metadata document at the path
/.well-known/u4a-organization under its issuer identifier. It is public:
an authorization server whose owner is not a member has to be able to learn
that a resource is claimed, and nothing in it is a member's. It carries:¶
REQUIRED. The organization's issuer identifier, an https URL.¶
REQUIRED. The keys it signs membership credentials, notices, clearances and break-glass grants with.¶
REQUIRED. Where a member's authorization server enrols her (Section 2.9).¶
REQUIRED. Where a member's authorization server reads the envelope in force (Section 2.5).¶
REQUIRED. Where a member's authorization server asks about a request (Section 2.6).¶
REQUIRED where the charter enables break-glass. Where an enforcement point introspects, and spends, a grant the organization signed (Section 2.10).¶
REQUIRED. The charter's claims.¶
REQUIRED. The version of the charter in force.¶
An organization MUST publish a charter, versioned, carrying:¶
REQUIRED. Patterns naming the resources the organization holds. A pattern MUST name a namespace: it MUST NOT place a wildcard in the segment that identifies whose resource it is, since such a claim would reach a member's own resources and jointly held ones alike.¶
REQUIRED. Named roles, each with grants (patterns within claims the role
may reach) and delegation (Section 2.4).¶
OPTIONAL. A ceiling on the terms a member may write over claimed resources (Section 2.5).¶
OPTIONAL. Whether and over which claimed resources the organization may reach past a member (Section 2.10).¶
The pattern language MUST be segment-wise, with a wildcard matching one segment and never crossing a separator, and MUST offer neither alternation nor a recursive wildcard. Four evaluators have to agree on what a pattern matches — the organization's service, the member's authorization server, the enforcement point, and any policy engine the organization runs — and a language small enough to be checked by reading is the only kind that can be.¶
Each role MUST carry a delegation value, one of:¶
none:The member may reach the resource herself. No agent acting for her may.¶
first-party-only:An agent the member activated herself ([U4APolicy] Section 5) may be granted access under her terms. An agent somebody else runs may not, whatever her own terms say.¶
any-agent:Any agent, subject to her terms and the charter.¶
delegation does not say what may be accessed. It says whose agent may do
the accessing, on behalf of which person. That is a statement about parties
rather than permissions, and it is only expressible because the member's
authorization server can already distinguish an agent she activated from one
somebody else operates.¶
An envelope MAY carry:¶
A member's expires_in over claimed resources comes down to this.¶
Scopes not in it are removed from her terms.¶
Prohibitions missing from her terms are added.¶
Patterns over which her policy units are set to ask her every time.¶
Claims the organization must be able to attest about the member before an agent may act on claimed resources, each naming the values that satisfy it. Combined with any requirement the member wrote by intersection, so the ceiling may add a claim and narrow an accepted value and MUST NOT remove a requirement she wrote. See [U4APolicy].¶
Every envelope field moves a member's terms in one direction only. There MUST be no field that lengthens an expiry, adds a scope, removes a prohibition, or turns off an ask.¶
A member's authorization server MUST apply the envelope when a policy unit over a claimed resource is written, and again whenever the charter changes, by issuing a new version of the unit's terms document through the same path as one of her own edits. It MUST NOT apply the envelope only at grant time.¶
The clamp is applied on write so that the ceiling appears in the terms document
the requesting side dereferences and signs, rather than being applied invisibly
at the door. A terms document MUST state that a layer above the owner is in
force over its resources, in its organization member ([U4ATerms]
Section 2): an agent reads the document before it signs anything,
and that is the only moment at which "these terms are not hers alone" is
information it can act on.¶
An enforcement point MAY also check a grant over a claimed resource against the
ceiling, as a second line behind the clamp. One that does refuses a grant that
exceeds it with the refusal value organization_envelope_exceeded, status 403,
which is terminal: the authority that answered is issuing more than the
organization permits, and negotiating again reproduces that exactly.¶
For each request over a resource the charter claims, the member's authorization
server MUST ask the organization's decision endpoint once, presenting the facts
of the request, and MUST fold the answer into its own. The facts are a JSON
object carrying resource_id, the scopes attempted, the policy unit as
tier, the expires_in, purpose, reason, mission and operation of the
agreement, and the assurance and standing facts of [U4APolicy]; the
member's authorization server presents its membership credential with them,
as a POST to the organization's decision_endpoint.¶
The organization answers with a JSON object whose effect is allow, ask or
refuse, whose because is an array of its reasons in sentences, and which
carries governed (whether the charter claims the resource) and the
charter_version it decided under. allow means
the organization has no objection, not that the request is granted. The
composition rule is one sentence: both layers must allow, and either may
refuse. An organization's ask raises the member's auto to ask, and the
member MUST be shown the organization's reasons separately from her own.¶
An organization's decision MUST NOT widen what the member's policy would decide. Where the organization cannot be reached, the member's authorization server MUST refuse requests over claimed resources; a ceiling nobody can read is not a ceiling.¶
A request over a resource the charter does not claim MUST NOT be sent to the organization.¶
An organization MAY be given a view of a member's pending requests, connections, operators and record, filtered by the member's authorization server to entries concerning resources the charter claims. It MUST NOT be able to read the member's policy; at most it may be told which of its envelope fields bound and whether her units are within the envelope.¶
The filtering is the member's authorization server's, applied before it answers, and is not the organization's to respect.¶
An organization MAY answer a pending request on a member's behalf, and MAY end an agent's reach to claimed resources. When it does:¶
the record MUST name the organization's administrator, and MUST NOT record the decision as the member's ([U4APolicy] Section 8.4);¶
an agent shut out by the organization loses its reach to claimed resources only, held in the membership record so that it ends when the membership does, and its standing with the member over her own resources is untouched;¶
an introspection response for a grant so affected carries error of
organization_revoked, which is terminal ([U4AFedAuthz] Section 5).¶
The organization conveys each such action to the member's authorization server
as a short-lived JWT with typ of u4a-org-admin+jwt, signed by the
organization, naming the member as sub, the organization as org and the
acting administrator as admin. The member's authorization server verifies it
against the keys of the organization she enrolled with, and refuses one that
does not name her.¶
A member's authorization server MUST NOT enrol her with an organization without her explicit agreement to a specific charter version, and MUST show her, before she agrees, what enrolling would change about terms she has already written. The enrolment request MUST name that version, and the organization MUST refuse one that names none or names a version no longer in force.¶
How a joiner is entitled to enrol is the organization's to decide, and the mechanisms differ in what they establish. An invitation addressed to one person, or the organization's own identity provider vouching for her, establishes who is joining. A code shared with a group establishes only that the joiner holds it: whoever does may enrol under any name not already enrolled. An organization offering one SHOULD offer it only for onboarding a group it trusts, and SHOULD NOT make it the only mechanism.¶
The organization issues a membership credential to her authorization server at
enrolment — a JWT with typ of u4a-membership+jwt, signed by the
organization, naming the member as sub and the organization as org —
and that server presents it as a bearer credential on every call to the
organization. The organization MUST be able to end a membership and MUST
notify the member's authorization server when it does, when her role changes,
or when the charter changes. A notice is a JWT with typ of
u4a-org-notice+jwt, signed by the organization and verified by the member's
server against the keys it publishes, whose kind is one of
membership_ended, role_changed, charter_changed, break_glass_opened,
break_glass or break_glass_used.¶
Each notice MUST carry its own unique jti, and a member's authorization server
MUST act on a given jti once. An identifier shared by several notices — the
break-glass family of Section 2.10 is three notices about one override — MUST
travel in a member of its own rather than in jti. Where the two are conflated,
the second notice about one override is indistinguishable from a replay of the
first, and the stage an owner most needs to be told about is the one that is
silently dropped.¶
Leaving MUST withdraw the member's access to claimed resources and the ceiling over her, and MUST leave every narrowing the ceiling applied in place. Her terms were narrowed with her agreement and republished under a new version; undoing that would silently widen what agents holding agreements over those versions are held to.¶
Where the charter enables it, the organization MAY reach a claimed resource
without the member's authorization server, by issuing a grant it signs itself.
Such a grant MUST be single-use, bound to a key, short-lived, bound to one
operation, and over a resource the charter both claims and names for this
purpose. The organization MUST compute the operation's params_s256 itself, as
[U4ACore] defines it, over the tool and parameters the request names, and
MUST refuse a request that names none. The enforcement point MUST recognise it
by issuer and MUST introspect it with the organization rather than with the
member's authorization server. It MUST honour it only at a resource the
organization owns, and only for the member the introspection response names
in owner; an enforcement point that also checks the organization's ceiling
over an owner's own resources MUST NOT take that as licence to honour the
organization's own grants there.¶
The grant is a JWT access token [RFC9068] with typ of at+jwt, signed with
a key at the organization's jwks_uri. It carries iss (the organization's
issuer identifier), sub and client_id (the thumbprint handle of the key in
cnf), owner, aud, jti, iat, exp, cnf, permissions, single_use
of true, operation, and break_glass: an object
naming the org, the stated reason, what authorised_by it — a voucher an
administrator opened, or an operator the charter lists — and the
charter_version it was issued under. The enforcement point introspects it at
the organization's introspection_endpoint, whose answers are those of
[U4AFedAuthz] Section 5 with the grant's owner added, and spends it at the
organization's consumption_endpoint, as the last step of [U4ACore] Section
8.2. Both are authenticated with the credential the organization provisioned
for that enforcement point (Section 4).¶
The member MUST be notified at the moment the window opens, before any data moves. Break-glass cannot be a flag on an ordinary grant: it has to be a grant the organization signs, checked with the organization, bounded by a clause the member was shown before she joined, and unable to be quiet.¶
A resource owner under [U4ACore] who holds a resource jointly with others. Each holder has her own authorization server.¶
A party that publishes the mandate, folds the holders' terms into one document, collects verdicts, and issues a grant carrying them. It speaks the authorization-server surface of [U4ACore] to the client, which cannot tell it from an authorization server and does not need to.¶
With no party above the holders, the decision cannot be put anywhere without privileging the place it is put. The tally is that place, and the rest of Part II is what makes it unable to lie rather than trusted.¶
The tally MUST publish, for each jointly held resource, a mandate, at the URI
its authorization server metadata names as u4a_mandate_endpoint — a template
in which {account} names the jointly held account. The mandate carries:¶
REQUIRED. At least one resource identifier or pattern.¶
REQUIRED. At least two, each with owner, an https issuer naming her
authorization server, and an integer weight of at least one. An owner MUST NOT appear twice.¶
REQUIRED. kind of all, any or threshold, normalised to a numeric
threshold: the total weight for all, the lightest holder's weight for
any, and a stated value between one and the total for threshold.¶
A holder's authorization server MUST store the mandate she agreed to, MUST re-ask her when the published mandate differs from it in holders, threshold or resources, and MUST refuse to count a holder who has written no terms over the resource.¶
A deployment MAY fix a floor below which no mandate's threshold may go. The interesting real-world version of this is not a group choosing its own quorum; it is a regulator or an account agreement fixing one, and a floor set from outside answers the question a self-chosen quorum cannot.¶
Authoring a mandate is where "who decides who decides" lives, and this document leaves it to configuration.¶
When a client presents a ticket for a jointly held resource, the tally MUST obtain each holder's terms over it from her authorization server and MUST fold them into one terms document: the shortest expiry, the intersection of scopes, the union of prohibitions, and ask-me if any holder asks. It proffers that document under [U4ATerms], and the agent signs it once.¶
The fold is the clamp of Section 2.5 applied sideways: each holder's terms are a ceiling on the running document. An implementation SHOULD use one implementation of the narrowing for both, since two would be two chances to disagree about what "narrower" means in the two places where disagreeing is worst.¶
Each holder's authorization server, asked by the tally about one negotiation,
MUST answer with a verdict: a JWS [RFC7515] signed by that server with a typ
of u4a-verdict+jwt, carrying:¶
REQUIRED. The holder.¶
REQUIRED. The jointly held resource.¶
REQUIRED. The negotiation identifier this verdict answers.¶
REQUIRED. The resource the negotiation is over, as the tally named it when it asked.¶
REQUIRED. The digest of the agreement the agent signed, as [U4ATerms].¶
REQUIRED. allow or refuse.¶
OPTIONAL. Reasons, for a refusal.¶
REQUIRED. No earlier than the agreement the verdict is about would end, so that a grant within that lifetime can carry it.¶
REQUIRED in an allow. jkt(k), as [U4ACore] defines it, of the key k
that signed the agreement.¶
REQUIRED in an allow. The scopes the agreement carries.¶
REQUIRED in an allow. The lifetime the agreement carries.¶
REQUIRED in an allow whose agreement names an operation. Its tool and
params_s256, as in the operation claim of [U4ACore].¶
REQUIRED in an allow. The digest of the mandate the holder agreed to, as
Section 3.5.¶
REQUIRED in an allow where the resource declares one for the operation.
The consequence class of [U4ACore] the holder's authorization server read
when it answered.¶
An allow verdict MUST carry cnf_jkt, scope, expires_in and
mandate_s256, and MUST carry operation where the agreement names one and
consequence where the resource declares one. The tally's grant MUST carry the
most severe consequence any allow verdict it carries names. A
verdict that said only "yes, to this agreement" could be carried inside any grant
the tally chose to issue beside it, because the enforcement point checks
verdicts against the grant and never sees the agreement. Stating the grant's
material facts as the holder's authority verified them is what lets the
enforcement point refuse a grant that is not the one agreed to.¶
A holder's authorization server that has recorded the owner's approval of one
agreement MUST NOT issue an allow verdict about a different agreement, or a
different resource, under the same negotiation. The tally asks again with
whatever it holds, and matching on the negotiation alone would turn her approval
of one document into an approval of any.¶
A verdict is bound to one negotiation and one agreement so that it cannot carry
a later request. Before answering allow, a holder's authorization server MUST
compare the folded document the agent signed against the terms she published,
and MUST refuse on any difference in the direction of more: a longer expiry,
an extra scope, a dropped prohibition. Differences in the direction of less
are expected, since another holder's terms were folded in. This is what lets the
folding party be untrusted.¶
{
"iss": "https://alice-as.example",
"holder": "alice",
"account": "joint-brokerage-1",
"negotiation": "fam_8f3aQ2Xc",
"resource_id": "joint-brokerage-1/get_positions",
"contract": "s256:RqgXOcbufB1e0ITn3oQ6fteUNc1EVRPk3VxOWsOV-0s",
"effect": "allow",
"cnf_jkt": "jkt:ESqNMeKw-z8gcDH-8y96ckX3h7TU6FtF9lqluDQ1Now",
"scope": ["positions:read"],
"expires_in": 3600,
"mandate_s256": "s256:2Vm2OGY_mn3mY6G-N-Obxdgg49uzoxsK8brUPgw5_Gk",
"iat": 1789430000,
"exp": 1789430300
}
The digest of a mandate is s256 as [U4ACore] defines it: s256: followed by
the base64url encoding, without padding, of the SHA-256 hash of the [RFC8785]
serialization of an object with exactly three members:¶
Each holder reduced to owner, issuer with any trailing slash removed, and
weight, ordered by owner.¶
The mandate's resources, sorted.¶
kind, and the numeric threshold that kind implies.¶
Holders' authorization servers and enforcement points MUST compute the digest this way. It covers what decides a count and nothing else, so a tally that publishes a summary beside the mandate, or lists holders in another order, publishes the same digest, while one that moves a weight, swaps an issuer or changes the rule does not.¶
Where the holder's policy asks her, the verdict is withheld until she answers,
and the tally holds the negotiation pending as [UMAGrant] request_submitted.¶
A verdict MUST travel from the holder's authorization server to the tally. It MUST NOT be gathered by the client and presented as a claim.¶
A claim the requesting party gathers is a claim it can decline to gather. A holder's refusal has to reach the decision point without the cooperation of the party it refuses, and claims-gathering cannot carry it. The general boundary: claims work when the requesting party is the only one who holds the fact, and fail when the fact may be adverse to it.¶
The tally MUST sum the weight of holders whose verdict is allow and compare it
to the threshold. It MUST refuse the moment the weight still outstanding cannot
carry the request over the threshold — under all, the first refusal ends it —
rather than waiting for every holder. Silence and unreachability MUST both fail
closed; only the record distinguishes them.¶
A grant the tally issues MUST carry a joint claim with:¶
REQUIRED. The jointly held resource.¶
REQUIRED. The mandate as the tally holds it.¶
REQUIRED. Every verdict received, as issued.¶
OPTIONAL. The tally's own count, for display.¶
The grant MUST also carry, as a family claim, the negotiation identifier its
verdicts name, and the tally's introspection response MUST return it. Without it
the enforcement point cannot establish which negotiation the grant was issued
for, and a verdict about one negotiation would be as good as a verdict about
any.¶
{
"joint": {
"account": "joint-brokerage-1",
"mandate": {
"holders": [
{"owner": "alice", "issuer": "https://alice-as.example",
"weight": 1},
{"owner": "carol", "issuer": "https://carol-as.example",
"weight": 1}
],
"rule": {"kind": "all", "threshold": 2},
"resources": ["joint-brokerage-1/*"]
},
"verdicts": ["eyJ0eXAiOiJ1NGEtdmVyZGljdCtqd3Qi...",
"eyJ0eXAiOiJ1NGEtdmVyZGljdCtqd3Qi..."],
"tally": {"effect": "allow", "for": 2, "threshold": 2}
}
}
An enforcement point protecting a jointly held resource MUST, before allowing a call under such a grant:¶
fetch the mandate from where the tally publishes it, and MUST NOT use the copy embedded in the grant, and refuse unless it covers the resource being accessed;¶
verify each verdict, including its exp, against the keys published by the
authorization server the enforcement point is itself configured to know
speaks for that holder, and refuse where the published mandate names a
holder it knows no authorization server for, or names a different one;¶
establish that each verdict names this negotiation, this agreement and the resource being accessed;¶
establish, for each allow verdict, that its mandate_s256 is the digest of
the published mandate, and that the grant is bound to the key cnf_jkt
names, carries no scope beyond scope, lasts no longer than expires_in,
declares no lighter consequence than the verdict names, and, where the
verdict names an operation, is single-use and bound to that operation;¶
re-run the count of Section 3.7 and refuse unless it allows.¶
A refusal under this list carries the refusal value joint_mandate_unsatisfied,
status 403, which is terminal. Where the mandate or a holder's keys cannot be
fetched, the enforcement point answers temporarily_unavailable instead: that
is a party it could not ask, not a decision anybody made.¶
The tally member of the grant is for display and MUST NOT be trusted.¶
An enforcement point protecting a jointly held resource MUST refuse a grant that
carries no joint claim.¶
The holders' authorization servers come from the enforcement point's own
configuration for the same reason the mandate does not come from the grant: the
mandate is published by the tally, and a tally that could name the issuer each
verdict is checked against could name issuers it controls, sign verdicts for
holders it invented, and have every signature verify. The tally MUST NOT issue a
grant that outlives any allow verdict it carries.¶
Reading the mandate from the grant would let the party being checked supply the standard it is checked against: a single genuine verdict beside a rewritten threshold would pass with every signature verifying. Reading it from where the tally publishes it is safe only because every verdict names the digest of the mandate its holder agreed to; a published mandate with a different electorate is one no verdict was given under. The tally issues its grant from the agreement, bounded by the folded terms, so that an honest grant is always one step 4 can re-derive. Carrying the verdicts in the grant and re-verifying them at the resource is what makes the tally an ordinary service rather than a ledger — there is no ordered history here to agree on and no long-lived state a fork could damage.¶
A charter claim MUST NOT match a jointly held resource, and a holder's authorization server MUST refuse to apply an organization's envelope or decision to one regardless. A jointly held resource MUST NOT share a policy unit with any other resource, since a ceiling applies to a whole unit once it reaches any resource in it. A holder's authorization server MUST compare a resource against the mandate's resources as patterns, as it compares charter claims.¶
The protection runs one way. A holder's authorization server MUST refuse to agree to a mandate covering a resource an organization she belongs to claims, and MUST NOT treat such a mandate as taking that resource out of the organization's reach: otherwise a member could lift her organization's ceiling off its own resource by joining a mandate any party could publish.¶
Peers compose horizontally; an authority above them clamps vertically. The two are orthogonal rather than rival, and this document keeps them apart.¶
This section fixes the messages the sections above name. Every exchange is HTTPS with JSON bodies unless stated. Each endpoint is at the path shown, relative to the receiving party's issuer identifier, and is advertised in that party's metadata under the member shown, so that a party configured with an issuer can reach it, and one that reads metadata finds the same URL.¶
Three credentials are used, and each authenticates exactly one direction:¶
A JWT with typ of u4a-membership+jwt, issued by the organization at
enrolment and carrying iss, sub (the member), org, iat and jti. A
member's authorization server presents it as a bearer token on every
organization endpoint marked member below. The organization MUST refuse one
whose jti is not the one it recorded when that member last enrolled, so that
a credential from before she left, or before she rejoined, opens nothing.¶
A JWT signed with a key at the sender's jwks_uri and verified by the
receiver against the keys of the party its own records name: the organization
the owner enrolled with, or the tally the mandate names. It MUST carry iss,
iat, exp and the typ stated for the exchange, and the receiver MUST
refuse one of another typ.¶
A credential the organization or tally provisioned for an enforcement point, presented as a bearer token. Both run as infrastructure for the same deployment, so a provisioned credential is the honest shape; a member's authorization server is never reached this way.¶
| Exchange | Request | Metadata member, path | Authentication |
|---|---|---|---|
| Preview |
POST, {"code"}
|
enrolment_preview_endpoint, /member/preview
|
the enrolment code |
| Invitation |
GET, ?owner=
|
invitation_endpoint, /member/invitation
|
none |
| Decline |
POST, {"owner", "code"}
|
invitation_endpoint + /decline
|
the invitation's code |
| Enrol |
POST, see below |
enrolment_endpoint, /member/join
|
a code, an invitation or an assertion (Section 2.9) |
| Envelope |
GET
|
envelope_endpoint, /member/envelope
|
member |
| Decision |
POST, the request facts |
decision_endpoint, /decision
|
member |
| Clearance |
GET
|
clearance_endpoint, /member/clearance
|
member |
| Compliance |
POST, see below |
compliance_endpoint, /member/compliance
|
member |
| Leave |
POST
|
leave_endpoint, /member/leave
|
member |
The enrolment request carries owner (REQUIRED), as_uri (REQUIRED, the
member's authorization server, to which notices and administrator actions will
be sent), charter_version (REQUIRED, Section 2.9), and whichever of code
and assertion the organization's enrolment path requires. The response
carries membership_token, the membership credential, beside the members of an
envelope document.¶
An envelope document carries org, name, issuer, charter_version,
published_at, the envelope fields of Section 2.5 in force for this member,
and her role as role, role_name, grants and delegation. The preview and
envelope exchanges answer with one.¶
A decision request carries the facts of Section 2.6, at least resource_id.
The answer carries effect (allow, ask or refuse), because (an array of
sentences the member is shown), governed (whether the charter claims the
resource) and charter_version.¶
A clearance answer carries clearance, a JWT with typ of u4a-clearance+jwt
([U4APolicy]), and expires_in. Where the organization holds no attestation
for the member it MUST answer 404, which her authority treats as unmet rather
than as an error.¶
A compliance report carries charter_version, resources_governed,
tiers_governed, clamped_fields (the names of the envelope fields that
narrowed her terms) and within. It MUST NOT carry any value from her policy.¶
A notice is POSTed to the member's authorization server's
org_notice_endpoint (/org/notice) as {"notice": <JWT>}, a signed message
with typ of u4a-org-notice+jwt carrying sub (the member), org, jti, an
exp no more than five minutes after iat, and kind:¶
| Kind | Further members | The member's authorization server |
|---|---|---|
charter_changed
|
charter_version
|
re-reads the envelope and re-applies it |
role_changed
|
role, by
|
re-reads the envelope and records the change |
membership_ended
|
by
|
ends the enrolment as Section 2.9 |
break_glass_opened, break_glass, break_glass_used
|
reason, resource_id, authorised_by or by, the operation's tool, as applicable |
records it and tells the member (Section 2.10) |
The member's authorization server MUST act on a notice's jti once until its
exp, across every replica, and MUST answer 409 to a second presentation.
A kind it does not recognise it MUST accept without acting on it.¶
An administrator's action (Section 2.8) is sent to
org_admin_endpoint (/org/admin) followed by /{owner}/ and one of
pending, pending/{family}/decision, connections, connections/revoke,
connections/restore, operators, operators/{action} or ledger, with a
signed message of typ u4a-org-admin+jwt as the bearer token. It carries
sub (the member), org, admin and an exp no more than two minutes after
iat. The bodies and answers are those of the owner's own API for the same
operation ([U4AOwner]), narrowed to what Section 2.7 allows.¶
| Exchange | Request | Metadata member, path |
|---|---|---|
| Membership |
GET
|
membership_endpoint + /{owner}, /membership/{owner}
|
| Introspection |
POST, form token=
|
introspection_endpoint, /introspect
|
| Consumption |
POST, form token=
|
consumption_endpoint, /consume
|
| Access report |
POST
|
audit_endpoint, /audit/access
|
Each is authenticated with the enforcement point credential. A membership answer
is {"member": false}, or "member": true with since and the members of an
envelope document. A consumption answer carries consumed and, where false,
error from the vocabulary of [U4AFedAuthz] Section 5.¶
The tally asks with a signed message of typ u4a-tally-req+jwt, POSTed as
{"request": <JWT>}. Every request carries owner (the holder, as her
authorization server names her) and account.¶
A quote, at joint_quote_endpoint (/joint/quote), adds resource_id. The
answer carries owner, tier_id and tier (her terms over the resource as
Section 3.3 reads them), or tier of null with because where she has written
none.¶
A verdict request, at joint_verdict_endpoint (/joint/verdict), adds
negotiation, resource_id, contract (the agreement's digest) and
agreement (the agreement JWS, so that her authority verifies it itself). The
answer carries verdict, a verdict as Section 3.4, or pending of true with
family while she has not answered.¶
A holder's authorization server MUST refuse a request from a tally other than the one the mandate she agreed to names, and MUST answer about her alone.¶
See Section 2.5 and Section 2.6. The one-directionality of every envelope field and of the decision's effect on the member's own result is the property the whole of Part I rests on. An implementation SHOULD be able to demonstrate over its full envelope that no combination of envelope and terms produces wider terms than it started with.¶
See Section 2.7 and Section 2.8. Everything the organization can see or do stops at the resources its charter claims, and the scoping is applied by the member's authorization server before it answers. An organization given a member's whole record because it is easier has been given her relationships with parties that have nothing to do with it.¶
See Section 2.8. "The owner personally approved" may relax a rule under [U4APolicy]; a decision taken for her must not produce that fact.¶
See Section 3.9. This is the single check that makes the tally untrusted.¶
See Section 3.7. A holder who has not answered and a holder who cannot be reached both count for nothing.¶
See Section 2.10. An emergency path that can be exercised quietly is an ordinary path with a better name.¶
Under Part I, an organization's view of one member is filtered to claimed resources and says nothing about any other member. Under Part II, a holder's authorization server MUST NOT expose another holder's pending queue, decisions or record; each holder sees her own verdicts and the count.¶
Section 2.5 requires that a terms document state when a layer above the owner is in force. That discloses to the requesting side that the owner is a member of some organization, which is a fact about her. The alternative — a ceiling applied invisibly — asks the agent to sign terms that are not the terms it will be held to, and this document prefers the disclosure.¶
This document has no IANA actions. The identifiers it uses are listed in Appendix A.¶
This appendix lists the identifiers this document defines. It is informative and requests no registration.¶
| Identifier | Kind | Defined in |
|---|---|---|
application/u4a-verdict+jwt
|
Media type | Section 3.4 |
application/u4a-membership+jwt
|
Media type | Section 2.9 |
application/u4a-org-notice+jwt
|
Media type | Section 2.9 |
application/u4a-org-admin+jwt
|
Media type | Section 2.8 |
joint
|
JWT claim [RFC7519] | Section 3.8 |
family
|
JWT claim [RFC7519] | Section 3.8 |
break_glass
|
JWT claim [RFC7519] | Section 2.10 |
/.well-known/u4a-organization
|
Well-known URI | Section 2.2 |
enrolment_endpoint, envelope_endpoint, decision_endpoint, enrolment_preview_endpoint, invitation_endpoint, leave_endpoint, clearance_endpoint, compliance_endpoint, membership_endpoint, introspection_endpoint, consumption_endpoint, audit_endpoint
|
Organization metadata member | Section 2.2, Section 4 |
org_notice_endpoint, org_admin_endpoint, joint_quote_endpoint, joint_verdict_endpoint
|
Authorization server metadata member | Section 4 |
application/u4a-tally-req+jwt
|
Media type | Section 4.4 |
u4a_mandate_endpoint
|
Authorization server metadata member | Section 3.2 |
org
|
JWT claim [RFC7519] | Section 2.9, Section 2.8 |
kind
|
JWT claim [RFC7519] | Section 2.9 |
admin
|
JWT claim [RFC7519] | Section 2.8 |
This section records the status of known implementations in the sense of [RFC7942], and is to be removed before publication as an RFC.¶
The reference implementation [U4ALAB] implements both parts. The clamp of
Section 2.5 is tested exhaustively for one-directionality over every
combination of envelope field and terms. The fold, the mandate validator and the
count are tested in isolation; the full arrangement — two holders on two
authorization servers, a tally, and an enforcement point re-verifying against
the published mandate — runs end to end, including refusal of a grant whose
embedded mandate rewrites who was entitled to be counted. Part I runs end to end
including enrolment by invitation, the ceiling appearing in signed terms,
first-party-only refusing a third party's agent, the organization's scoped
view, administrator decisions not counting as the member's, break-glass, and
leaving.¶
[PP2PI] supplied the four states of co-administration that Part I answers and the observation, made in [UMAGrant]'s own terminology, that the resource rights administrator had been named and never mechanised. The metadata of [RFC9728] is what lets one resource server name a different authority for a shared, a personal and a jointly held resource at three paths.¶