Internet-Draft Owner-Proffered Terms September 2026
Gamb & Maler Expires 15 March 2027 [Page]
Workgroup:
Network Working Group
Internet-Draft:
draft-gamb-uma4agents-terms-00
Published:
Intended Status:
Standards Track
Expires:
Authors:
N. Gamb
MindGarden LLC
E. Maler
Venn Factory

Owner-Proffered Terms for User-Managed Access (UMA) 2.0

Abstract

This document extends the claims-gathering loop of the User-Managed Access (UMA) 2.0 Grant so that the authorization server proffers the content of the claim it requires, rather than only naming acceptable claim formats.

The resource owner's authorization server publishes a terms document — purpose, scope, duration and prohibitions — at a persistent, dereferenceable URI. The requesting side echoes that document, signs it with the key it will later prove possession of, and presents it as the claim token. The grant returns a receipt, counter-signed by the authorization server, embedding the signed agreement, so that both parties hold identical records of what was agreed.

Status of This Memo

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 15 March 2027.

Table of Contents

1. Introduction

[UMAGrant] Section 3.3.4 lets an authorization server tell a client what claims it needs by naming claim types and acceptable formats. The client then gathers those claims from wherever it can and presents them. The authorization server asks what can you tell me about yourself.

This extension adds the other direction. The authorization server proffers a document stating what the resource owner requires of anyone who wants this access, and the claim the requesting side returns is that document, signed. The authorization server asks will you agree to this.

The pattern is that of [IEEE7012], in which an individual proffers machine-readable terms as first party and a counterparty's agent agrees to them as second party. This document extends it from privacy terms to terms of access, and carries the agreement inside a grant so that the terms are conditions on an authorization rather than a record kept beside one. It is also a direct descendant of UMA's own 2010 work [UMAClaims2010], which defined a "requesting party policy" claim for exactly this purpose and which the 2.0 specifications did not carry forward.

1.1. Relationship to the Set

This document extends [UMAGrant] and is REQUIRED to implement alongside [U4ACore]. It is separable: a UMA deployment with no agents in it can adopt this extension on its own, and nothing here depends on the requesting side being autonomous.

Its identifying URI, for the uma_profiles_supported metadata of [UMAGrant] Section 4, is https://u4a.ai/spec/terms/1.0.

1.2. Notational Conventions

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.

The notation s256(x) is as defined in [U4ACore].

2. The Terms Document

An authorization server implementing this extension MUST serve, for each set of terms it proffers, a document at a URI that resolves for as long as the authorization server serves the owner whose terms they are.

A terms document MUST carry:

template_id:

REQUIRED. A stable identifier for this version of these terms, namespaced by owner.

purpose:

REQUIRED. What the access is for, in the owner's words.

scope:

REQUIRED. An array of scope strings the terms cover.

expires_in:

REQUIRED. The maximum lifetime, in seconds, of access granted under these terms.

prohibited:

REQUIRED. An array of identifiers naming what the requesting side undertakes not to do. MAY be empty.

proffered_by:

REQUIRED. The issuer identifier of the authorization server that proffers them.

A terms document MAY carry any other member; a member this document does not define is an undertaking the requesting side signs, not a control the enforcement point applies. One member is defined here:

per_operation:

OPTIONAL. Boolean. Where true, a grant under these terms is bound to one operation and spent once, as [U4ACore] Section 7.2, and the agreement MUST name the operation proposed.

2.1. Versions Are Immutable

The content of a terms document at a given template_id MUST NOT change. An authorization server that changes the owner's terms MUST issue a new template_id and MUST continue to serve every previous version.

An agreement is a signature over a document. A document that can change after it is signed makes every agreement over it unverifiable later, which removes the only property that distinguishes this from a consent dialog.

2.2. Representations

An authorization server MUST serve a terms document as JSON, and MUST serve, at the same URI, a plain-language representation intended for a person, selected by HTTP content negotiation. It SHOULD additionally serve a representation in a rights expression language such as [ODRL].

The three representations satisfy [IEEE7012] Sections 4.4.1 and 4.4.2. The requirement that they share a URI is what makes the human-readable statement and the machine-readable one the same terms rather than two documents that may drift.

3. Proffering

Where the authorization server requires agreement to terms before it will decide, it responds to a ticket presentation with need_info as [UMAGrant] Section 3.3.6, carrying a required claim whose claim_type is urn:uma4agents:claim:myterms-agreement and whose claim_token_format array includes urn:uma4agents:format:myterms-agreement-v1+jws.

The required claim MUST additionally carry a terms_template member: the terms document of Section 2, plus

terms_uri:

REQUIRED. The URI at which this version of this document is served.

nonce:

REQUIRED. A value the authorization server has not previously used, to be echoed in the agreement.

family:

REQUIRED. The identifier of this negotiation, stable across ticket rotations.

resource_id:

REQUIRED. The resource the terms are being proffered over.

{
  "error": "need_info",
  "ticket": "MWRlNzE4ZjgtMGY0OS00NDg2",
  "required_claims": [{
    "claim_type": "urn:uma4agents:claim:myterms-agreement",
    "claim_token_format": [
      "urn:uma4agents:format:myterms-agreement-v1+jws"
    ],
    "friendly_name": "Alice's terms: Holdings summary",
    "terms_template": {
      "template_id": "alice/advisor/v2",
      "terms_uri": "https://alice-as.example/terms/alice/advisor/v2",
      "proffered_by": "https://alice-as.example",
      "purpose": "Suitability review for advisory onboarding",
      "scope": ["positions:read"],
      "expires_in": 172800,
      "prohibited": ["retention-after-review", "marketing"],
      "resource_id": "alice-vault/get_positions",
      "family": "fam_8f3aQ2Xc",
      "nonce": "n5Kd2pQrTgWs"
    }
  }]
}
Figure 1: A need_info response proffering terms.

The authorization server MUST offer exactly one set of terms per demand. There is no counter-offer and no negotiation beyond the single choice of agreeing or not, per [IEEE7012] Section 5.2.2. A protocol that let the requesting side propose amendments would make the owner a party to a conversation she is not present for.

4. The Agreement

The requesting side agrees by presenting a claim token whose claim_token_format is urn:uma4agents:format:myterms-agreement-v1+jws and whose value is the base64url encoding of a JWS [RFC7515] in compact serialization with a typ of myterms-agreement-v1+jws.

4.1. The Signing Key

The JWS protected header MUST carry exactly one of:

jwk:

A public JWK [RFC7517], where the requesting side is pseudonymous.

agent_token:

A credential from an issuer that asserts the requesting agent's identity and names the signing key, where the requesting side is identified.

The authorization server MUST verify the JWS against the key so named, and MUST refuse an agreement carrying neither. The key that signs the agreement is the key that is confirmed in the grant, so that the party that agreed and the party that later acts are provably the same.

4.2. Claims

The agreement MUST echo, unchanged, the template_id, terms_uri, purpose, nonce and family of the proffered template, and MUST carry an aud naming the authorization server that proffered them.

It MUST carry an expires_in no greater than the template's, and a prohibited array that is a superset of the template's.

Where the template's per_operation is true, the agreement MUST carry an operation member naming the operation proposed and the parameters proposed for it.

{
  "iss": "agent:6cR6qTmCj6s0S95M",
  "aud": "https://alice-as.example",
  "iat": 1789430000,
  "template_id": "alice/advisor/v2",
  "terms_uri": "https://alice-as.example/terms/alice/advisor/v2",
  "purpose": "Suitability review for advisory onboarding",
  "scope": ["positions:read"],
  "expires_in": 172800,
  "prohibited": ["retention-after-review", "marketing"],
  "family": "fam_8f3aQ2Xc",
  "nonce": "n5Kd2pQrTgWs",

  "reason": "Suitability review before Thursday's client meeting.",
  "mission": {
    "approver": "https://ps.example",
    "s256": "s256:mNTA0Zjg1YTBkYzQxZWY4YjkyMWM4ZGIy"
  }
}
Figure 2: An agreement. Everything above the blank line is the owner's template, echoed.

The superset test on prohibited is deliberate: binding yourself to more than was asked is agreement, and refusing it would make the honest case fail. Every other echoed member is compared for equality, because a requesting side that can alter the purpose it signed up to has signed a different document from the one the owner published.

4.3. What the Requesting Side May Author

The agreement MAY carry the following, and MUST NOT carry anything else that affects the decision:

reason:

OPTIONAL. A string stating why the access is wanted. The authorization server MUST bound its length, MUST record it, and MUST NOT parse it, compare it to the purpose in the terms, or let its content affect the decision.

mission:

OPTIONAL. An object citing a mandate the requesting side is acting under, with an approver member that is an https URL and an s256 member that is a content digest. The authorization server MUST record the citation and MUST NOT dereference it.

Policy MAY read the absence of either. It MUST NOT read the content of either. See [U4APolicy].

An authority that reads a stated reason and rules on whether it is plausible has put a judgement about natural language inside an authorization decision: the same request becomes answerable two ways, and the requesting side learns to write whatever gets through. Bound it, record it, show it to the owner, and let policy do exactly one thing with it — notice when it is missing.

A mission citation is recorded rather than dereferenced because the issuers that serve missions serve them to their own administrators. A relying party in another trust domain has nothing to fetch, so an agent citing a real mandate and one inventing a digest are indistinguishable to it. That is why the citation is a record for the owner to read and never an input to the decision.

5. The Receipt

On issuing a grant against an agreement, the authorization server MUST return a receipt alongside the token, as a member named receipt in the token endpoint response.

The receipt MUST be a JWS signed by the authorization server with a typ of myterms-receipt+jws, and MUST carry:

terms_uri:

REQUIRED. The document that was agreed to.

template_id:

REQUIRED. The version that was agreed to.

agreement:

REQUIRED. s256 over the octets of the agreement as transmitted.

agreement_jws:

REQUIRED. The complete agreement JWS, as received.

family:

REQUIRED. The negotiation this receipt completes.

{
  "iss": "https://alice-as.example",
  "sub": "jkt:RnJ0c2FmZS1hZ2VudC1rZXktdGh1bWI",
  "iat": 1789430010,
  "family": "fam_8f3aQ2Xc",
  "terms_uri": "https://alice-as.example/terms/alice/advisor/v2",
  "template_id": "alice/advisor/v2",
  "agreement": "s256:mNTA0Zjg1YTBkYzQxZWY4YjkyMWM4ZGIy",
  "agreement_jws": "eyJ0eXAiOiJteXRlcm1zLWFncmVlbWVudC12MStqd3Mi..."
}
Figure 3: A receipt's claims.

Embedding the whole agreement rather than a reference to it is what makes the two records identical: the owner's side retains it with her decision record and the requesting side retains the receipt, and neither has to ask the other for the half it is missing. This satisfies [IEEE7012] Sections 5.2.2 and 5.4.4.

6. Declining

A requesting side that will not agree to the proffered terms MUST be able to say so. An authorization server MUST accept a decline parameter with the value true at the token endpoint while a negotiation is awaiting a claim, MUST end the negotiation, and MUST record the refusal against the terms that were declined.

A refusal is a record too, per [IEEE7012] Section 5.2.4. It is also the only signal an owner has that her terms are the reason nobody uses a resource she has published.

A declining requesting side has signed nothing, so there is no key and no identity to file the record under. An authorization server MUST record such a refusal without attributing it to a party. An implementation that invents an attribution here is asserting something it does not know.

7. Security Considerations

7.1. The Agreement Binds the Key That Will Act

See Section 4.1. If the agreement could be signed by one key and the grant confirmed to another, the party that agreed and the party that acts would be different parties, and the agreement would say nothing about the requests made under it.

7.2. The Digest Is Over the Transmitted Octets

The agreement member of the receipt, and any digest of the agreement recorded with the grant, MUST be computed over the agreement exactly as transmitted, not over a re-serialization of its claims. A digest over re-serialized JSON is a digest of the verifier's serializer, and two conforming implementations will disagree about it.

7.3. Terms Are Not a Sandbox

An owner's prohibitions divide into two kinds, and an implementation SHOULD be able to say which is which for each one it supports. A prohibition on something that must cross the owner's boundary to happen — placing an order outside approved parameters, reusing an approval for a second action — can be refused at the enforcement point. A prohibition on what happens afterwards on the requesting side's own systems — retention, onward sharing, training — cannot.

Both belong in the terms, and only one is a control. The second is what the dually-signed record exists for: it makes the undertaking checkable against conduct rather than preventing the conduct. Describing the second kind as enforcement is the overstatement this section exists to prevent.

8. Privacy Considerations

8.1. The Roster Is the Owner's

[IEEE7012] Section 4.2 places the roster of proffered terms with a neutral non-profit, so that an individual chooses from a small set of well-understood agreements rather than authoring her own. This document places it with the owner's own authorization server, because the terms here are conditions inside a grant that server issues and it has to be able to serve them for as long as the grant is checkable.

The divergence is real and has a cost: terms nobody else proffers are terms nobody else has read. A deployment SHOULD proffer terms drawn from a published roster where one exists for its domain, and the template_id namespacing in Section 2 is designed so that a roster identifier can be used directly.

8.2. The Terms Document Is Public

A terms document is dereferenced by a requesting side that holds no token, so its content is public to anyone who can guess or observe its URI. It states what the owner requires, which is a statement about her. An authorization server MUST NOT place anything in a terms document that identifies the owner beyond what the resource identifier already discloses.

Where a layer above the owner has narrowed her terms, the narrowing appears in the document, which is deliberate — see [U4AMultiParty]. An agent reads the document before it signs, and that is the only moment at which "these terms are not hers alone" is information it can act on.

9. IANA Considerations

9.1. Media Type Registration

IANA is asked to register the following in the "Media Types" registry.

Type name:

application

Subtype name:

myterms-agreement-v1+jws

Required parameters:

N/A

Optional parameters:

N/A

Encoding considerations:

binary; a JWS in compact serialization

Security considerations:

See Section 7 of this document

Interoperability considerations:

N/A

Published specification:

Section 4 of this document

Applications that use this media type:

Applications implementing UMA 2.0 with this extension

Change controller:

IETF

IANA is asked to register application/myterms-receipt+jws in the same registry, with the same considerations and with Section 5 of this document as its published specification.

9.2. URN Sub-namespace Registration

IANA is asked to record the following identifiers, which are defined by this document within the urn:uma4agents: namespace:

Table 1: Identifiers defined by this document.
Identifier Defined in
urn:uma4agents:claim:myterms-agreement Section 3
urn:uma4agents:format:myterms-agreement-v1+jws Section 4

10. References

10.1. Normative References

[IEEE7012]
"IEEE Standard for Machine Readable Personal Privacy Terms", IEEE Std 7012-2025, , <https://standards.ieee.org/ieee/7012/7192/>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC7515]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Signature (JWS)", RFC 7515, DOI 10.17487/RFC7515, , <https://www.rfc-editor.org/rfc/rfc7515>.
[RFC7517]
Jones, M., "JSON Web Key (JWK)", RFC 7517, DOI 10.17487/RFC7517, , <https://www.rfc-editor.org/rfc/rfc7517>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.
[U4ACore]
Gamb, N. and E. Maler, "User-Managed Access (UMA) 2.0 Profile for Autonomous Agents", Work in Progress, Internet-Draft, draft-gamb-uma4agents-core-00, , <https://u4a.ai/spec/draft-gamb-uma4agents-core-00.html>.
[UMAGrant]
Maler, E., Machulak, M., and J. Richer, "User-Managed Access (UMA) 2.0 Grant for OAuth 2.0 Authorization", Kantara Recommendation, , <https://docs.kantarainitiative.org/uma/wg/rec-oauth-uma-grant-2.0.html>.

10.2. Informative References

[ODRL]
Iannella, R. and S. Villata, "ODRL Information Model 2.2", W3C Recommendation, , <https://www.w3.org/TR/odrl-model/>.
[RFC7942]
Sheffer, Y. and A. Farrel, "Improving Awareness of Running Code: The Implementation Status Section", BCP 205, RFC 7942, DOI 10.17487/RFC7942, , <https://www.rfc-editor.org/rfc/rfc7942>.
[U4ALAB]
Gamb, N. and E. Maler, "UMA for Agents: a reference implementation", , <https://github.com/nickgamb/uma4agents>.
[U4AMultiParty]
Gamb, N. and E. Maler, "Multi-Party Authorization for User-Managed Access (UMA) 2.0", Work in Progress, Internet-Draft, draft-gamb-uma4agents-multiparty-00, , <https://u4a.ai/spec/draft-gamb-uma4agents-multiparty-00.html>.
[U4APolicy]
Gamb, N. and E. Maler, "Owner Policy, Assurance and Attention for User-Managed Access (UMA) 2.0", Work in Progress, Internet-Draft, draft-gamb-uma4agents-policy-00, , <https://u4a.ai/spec/draft-gamb-uma4agents-policy-00.html>.
[UMAClaims2010]
Maler, E. and P. Bryan, "Simple Access Authorization Claims", .

Appendix A. Implementation Status

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] described in [U4ACore] implements this extension in full, including all three representations of Section 2.2, the immutability requirement of Section 2.1, the receipt of Section 5 and the unattributed refusal record of Section 6. It was checked clause by clause against [IEEE7012]; the divergences found are the ones stated in this document rather than a longer list kept elsewhere.

Acknowledgments

The direction this extension reverses — an authorization server that proffers rather than demands — is the "requesting party policy" claim of [UMAClaims2010], and this document is its descendant. [IEEE7012] supplied the pattern, the three representations, the single-choice rule and the dual-record requirement, and the divergences in Section 8 are stated in its terms rather than around them.

Authors' Addresses

Nick Gamb
MindGarden LLC
Eve Maler
Venn Factory