| Internet-Draft | OAuth Grant Catalog | November 2026 |
| McGuinness | Expires 6 May 2027 | [Page] |
This specification defines the OAuth Authorization Grant Catalog: an authenticated, relationship-specific description of the authorization grants that a Resource Authorization Server is prepared to accept from a Grant Issuer. A Grant Issuer is an authorization server, such as an identity provider, that issues grants for redemption at the Resource Authorization Server. For each eligible target tenant, a catalog describes the protected resources, scope values, authorization details types, claims, subject identifier formats, and grant binding methods that the Resource Authorization Server accepts. The Grant Issuer uses the catalog as input to the policy under which it issues grants; the catalog is not an authorization decision. The data model is independent of grant encoding and retrieval protocol. This specification applies it only to the Identity Assertion JWT Authorization Grant (ID-JAG), and defines an OAuth retrieval protocol that delivers the complete catalog in one response.¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://mcguinness.github.io/draft-mcguinness-oauth-grant-catalog/draft-mcguinness-oauth-grant-catalog.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-mcguinness-oauth-grant-catalog/.¶
Discussion of this document takes place on the Web Authorization Protocol Working Group mailing list (mailto:oauth@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/oauth/. Subscribe at https://www.ietf.org/mailman/listinfo/oauth/.¶
Source for this draft and an issue tracker can be found at https://github.com/mcguinness/draft-mcguinness-oauth-grant-catalog.¶
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 6 May 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.¶
Several OAuth specifications define authorization grants that one authorization server issues for a client to present to another authorization server, typically in another trust domain. The Identity Assertion JWT Authorization Grant (ID-JAG) [ID-JAG], which an identity provider issues, is one example.¶
In this specification, the issuing authorization server is called the Grant Issuer, and the receiving authorization server is called the Resource Authorization Server. The Grant Issuer has to know which tenants, protected resources, scope values, authorization details types [RFC9396], claims, subject identifiers, and grant bindings the Resource Authorization Server accepts from it.¶
Public metadata does not convey this information. OAuth 2.0 Authorization Server Metadata [RFC8414] and OAuth 2.0 Protected Resource Metadata [RFC9728]:¶
are retrieved without authentication;¶
are generally not specific to a tenant; and¶
describe what a server implements, not what it accepts from a particular Grant Issuer.¶
Publishing this information would advertise issuer-specific trust
relationships, which Section 9.7 of [ID-JAG] warns can disclose
deployment-sensitive information. That section also prohibits using the
authorization_grant_profiles_supported metadata member to disclose
issuer allow lists. Deployments therefore communicate these values
through documentation or implementation-specific configuration, and
administrators of a Grant Issuer copy them into local configuration by
hand.¶
This specification defines a common, authenticated representation of that configuration, called the catalog. A Resource Authorization Server publishes the catalog, and a Grant Issuer uses it to configure issuance and to detect changes.¶
The Resource Authorization Server publishes entries that describe the grants it accepts from one Grant Issuer. An administrator of the Grant Issuer approves a subset of each entry that the Grant Issuer uses, and the Grant Issuer issues grants within that subset. A revision on each entry lets the Grant Issuer detect changes that need review.¶
The catalog supports configuration and grant construction. It does not establish trust between the servers or register clients. It is input to policy authoring, not an authorization decision: the Resource Authorization Server applies its current policy to every grant it processes, whether or not the grant was issued using a catalog.¶
A grant constructed from an entry can still be rejected, for example because of the client, the subject, the contents of authorization details objects, or the Resource Authorization Server's current policy. The catalog states how to construct a grant that avoids preventable failures, not whether a particular request will succeed.¶
An enterprise uses its identity provider for single sign-on to a software-as-a-service application. It wants an AI assistant, a client registered at the application, to use ID-JAG to read messages through the application's Messages API on behalf of employees.¶
Today, an administrator of the identity provider reads the application's documentation and enters the following by hand:¶
the application's issuer identifier;¶
the enterprise's tenant identifier at the application;¶
the resource identifier of the Messages API;¶
the scope value messages.read; and¶
the requirement that each ID-JAG be bound to a DPoP key.¶
A mistake surfaces only when the application rejects an ID-JAG, after the ID-JAG has disclosed its claims to the client.¶
With a catalog, the identity provider retrieves a Relationship View under its relationship with the application. The Relationship View lists the enterprise's tenant and one entry stating these values (Figure 2). The administrator approves the entry instead of typing its values.¶
When the application later changes the entry, the identity provider detects the new revision and stops issuing under the old approval until an administrator reviews the change. When the application removes the tenant, the identity provider stops issuing for it. Copied values would instead go on being used after they no longer match.¶
Appendix B shows a richer case, with scope values that cannot be combined in one grant.¶
The catalog replaces copied grant configuration. The rest of the integration is unchanged:¶
establishing the relationship (the Onboarding Arrangement);¶
registering the client at the application and mapping its client identifier;¶
mapping subjects;¶
learning any restrictions the application applies to that particular client;¶
deciding which employees and clients may use the integration; and¶
making the application's runtime authorization decisions.¶
Approving an entry constrains what grants contain. What a scope value permits, and whether a request is allowed, remain decisions of the application (Section 9.1, Section 9.2).¶
Each source of information used to issue a grant answers a different question:¶
| Source | Question It Answers |
|---|---|
| Authorization Server Metadata [RFC8414] | Where are the Resource Authorization Server's endpoints, and which protocol features does it support? |
| Protected Resource Metadata [RFC9728] | Which authorization servers and capabilities does a protected resource advertise? |
| Authorization details types metadata [RAR-METADATA] | What structure does an authorization details object of a given type have? |
| Authority metadata [AUTHORITY-METADATA] | What does a scope value or authorization details type authorize? |
| Relationship View | Which grants does the Resource Authorization Server offer to this Issuer Relationship? |
| Grant Issuer approval | Which of those grants may the Grant Issuer issue? |
| Runtime authorization | Is this request allowed now? |
Section 5.2, Section 5.3, and Section 5.6 define how a Grant Issuer combines these sources.¶
This specification applies to authorization grants whose content a Grant Issuer determines and that a Resource Authorization Server validates at redemption. JWT authorization grants [RFC7523] and their profiles have this form. This specification does not apply to grants that an authorization server issues for redemption at itself, such as authorization codes, device codes, and refresh tokens, because no other party determines what such a grant contains.¶
This specification defines a catalog data model and keeps it separate from grant encoding and from retrieval:¶
The data model (Section 4) has an Authorization Envelope (Section 4.6) and processing rules (Section 5) stated in terms of the inputs a grant conveys.¶
Each Grant Profile Definition specifies how grants of its Grant Profile convey those inputs (Section 8.1). This specification provides one only for ID-JAG (Section 7).¶
A retrieval protocol authenticates the relationship and delivers the catalog (Section 6). This specification defines an OAuth retrieval protocol.¶
The following are outside the scope of this specification:¶
Enumeration or registration of application clients, and establishment of client identifier mappings (Section 5.4.1).¶
Constraints on the values within an authorization details object (Section 4.5.3).¶
Paging, change notification, delta retrieval, and push delivery of catalogs.¶
Automatic reconciliation of Grant Issuer policy with a changed entry (Section 5.5).¶
A mechanism by which a client discovers whether a grant from a particular Grant Issuer would be accepted (Section 9.7 of [ID-JAG]), which is an open issue (Appendix "Open Issues").¶
Establishment of an Onboarding Arrangement (Section 6.2).¶
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.¶
This specification uses the following terms:¶
"access token", "authorization grant", "authorization server", "client", "resource server", and "scope" defined by OAuth 2.0 [RFC6749];¶
"authorization details" and "authorization details type" defined by [RFC9396];¶
"trust domain" as defined in Section 2.2 of [ID-JAG].¶
In this specification, "grant" means an authorization grant that a Grant Issuer issues for a client to present to a Resource Authorization Server, and "client" means that client, the application client. Where the Grant Issuer itself acts as a client of the Resource Authorization Server (Section 6.5), the text says so.¶
The issuer tenant of a grant is the tenant of the Grant Issuer that issues it, and its target tenant is the Resource Authorization Server tenant for which it is issued.¶
This specification defines the following terms:¶
An administrative boundary within an issuer, such as a customer organization, that scopes subjects, clients, and policy (Section 2.2 of [ID-JAG]). An issuer is multi-tenant when one issuer identifier hosts several tenants (Section 6.1 of [ID-JAG]).¶
A string that, together with an issuer identifier, identifies exactly one tenant of that issuer. A tenant identifier is not reassigned by the issuer to a different tenant and is compared using simple string comparison (Section 6.2.1 of [RFC3986]).¶
An authorization server that consumes a Relationship View and issues grants.¶
An authorization server that accepts grants issued by a Grant Issuer and publishes Relationship Views. This specification uses the term as Section 2.1 of [ID-JAG] does, for any Grant Profile.¶
A profile of an authorization grant, identified by a URI as used in
the authorization_grant_profiles_supported metadata member
(Section 7.2 of [ID-JAG]), such as
urn:ietf:params:oauth:grant-profile:id-jag.¶
A specification that defines how catalog entries apply to a Grant Profile (Section 8.1).¶
The relationship under which a Resource Authorization Server discloses catalog content to a Grant Issuer, identified by the Grant Issuer's issuer identifier and, when that issuer is multi-tenant, an issuer tenant identifier (Section 6.1).¶
The agreement, established outside this protocol, under which a Resource Authorization Server discloses catalog content to an Issuer Relationship and determines the Resource Authorization Server tenants eligible for it (Section 6.2).¶
The complete set of Tenant Objects, and the Grant Catalogs they reference, that a Resource Authorization Server makes available to one Issuer Relationship at a point in time (Section 4.2).¶
An object that binds one Resource Authorization Server tenant eligible for an Issuer Relationship to exactly one Grant Catalog (Section 4.3).¶
A complete set of entries identified by a stable identifier (Section 4.4).¶
A member of a Grant Catalog that describes the grants of one Grant Profile that the Resource Authorization Server accepts for one protected resource (Section 4.5).¶
The set of grants that an entry, or an approved subset of an entry, permits (Section 4.6).¶
Figure 1 shows the protocol flow.¶
+---------+ +---------------+ | |---(A) Retrieve public metadata -->| | | | | Resource | | |---(B) Authenticate relationship ->| Authorization | | | | Server | | |<--(C) Relationship View ----------| | | Grant | +---------------+ | Issuer | ^ | | (D) Validate, compose, and install | | | (E) Administrator approves a subset | | | | | | +--------+ | | |---(F) Grant ---->| Client |---(G) Grant -+ +---------+ +--------+
The Grant Issuer retrieves the Resource Authorization Server's public metadata, which includes the location of the catalog for a retrieval protocol.¶
The Grant Issuer authenticates an Issuer Relationship to the Resource Authorization Server using a retrieval protocol. The Resource Authorization Server verifies that an Onboarding Arrangement authorizes that relationship (Section 6.2).¶
The Resource Authorization Server returns the Relationship View for that Issuer Relationship.¶
The Grant Issuer validates the Relationship View, composes each entry with public metadata, and installs the result (Section 5).¶
An administrator of the Grant Issuer approves a subset of one or more entries for use by its clients and subjects (Section 5.3).¶
When a client requests a grant, the Grant Issuer authenticates the client and the subject, applies its policy, and issues a grant within the approved subset of one entry (Section 5.4).¶
The client presents the grant to the Resource Authorization Server, which validates it and applies its current policy as specified by the Grant Profile.¶
Steps (A) through (E) occur when the Grant Issuer is configured and when it refreshes the catalog, not for each grant.¶
With the OAuth retrieval protocol (Section 6), the Grant Issuer:¶
signs a catalog access assertion;¶
exchanges the assertion at the Resource Authorization Server's token endpoint for a catalog access token; and¶
uses that token to retrieve one complete Relationship View.¶
This exchange is separate from the grants that clients later request in step (F).¶
The design rests on the following principles, each stated normatively in the sections cited:¶
The Resource Authorization Server determines a Relationship View solely from the authenticated Issuer Relationship (Section 6.2).¶
The Grant Issuer installs all of a Relationship View or none of it (Section 5.5).¶
A grant is issued using one Tenant Object and one entry. The grant conveys an input that the entry governs only as the entry permits. Every claim in the grant is either reserved by the Grant Profile or listed in the entry (Section 4.6, Section 4.5.4, Section 5.4).¶
Approval and runtime policy only narrow an entry. A new or changed entry, public metadata, and authority metadata never broaden an approval. An entry cannot enable a value that public metadata excludes (Section 5.3, Section 5.2, Section 5.5, Section 5.6).¶
When the revision of an entry or the grant_catalog of a Tenant
Object changes, issuance under approvals made for the previous value
stops. Issuance resumes only under an approval made for the new value
(Section 5.5).¶
A Grant Issuer ignores members it does not understand. A specification that defines a restrictive member also defines a mechanism that prevents Grant Issuers that do not implement that member from using the entry (Section 8).¶
The objects in this section describe what a Resource Authorization Server accepts in grants from one Issuer Relationship. The Tenant Objects of a Relationship View identify the Resource Authorization Server tenants eligible for that relationship, and the Grant Catalogs of the Relationship View contain the entries. Several Tenant Objects can reference one Grant Catalog, so tenants that are offered the same grants share entries. Each approval remains specific to one Tenant Object (Section 5.3).¶
Figure 2 shows a complete Relationship View with one Tenant
Object and one Grant Catalog. The Tenant Object references the Grant
Catalog read-only, whose single entry permits ID-JAGs for the Messages
API. Grants issued using this entry contain the scope value
messages.read and are bound to a DPoP key. An administrator of the
Grant Issuer still approves a subset before the entry is used
(Section 5.3).¶
{
"authorization_server": "https://ras.example/",
"grant_issuer": {
"issuer": "https://idp.example/",
"tenant": "org-acme"
},
"tenants": [
{
"tenant_id": "customer-acme",
"grant_catalog": "read-only"
}
],
"grant_catalogs": [
{
"id": "read-only",
"entries": [
{
"id": "messages-read",
"revision": "1",
"profile": "urn:ietf:params:oauth:grant-profile:id-jag",
"resource": "https://api.example/messages",
"scope": {
"requirement": "required",
"values": [{"scope": "messages.read"}]
},
"grant_binding": {
"requirement": "required",
"methods": ["dpop"]
}
}
]
}
]
}
Figure 3 shows the object structure, without the display and
description members. Appendix A provides a fuller example of
the inputs that an entry can govern.¶
Relationship View
|-- authorization_server
|-- grant_issuer
|-- tenants[]: Tenant Object
| |-- tenant_id
| `-- grant_catalog (the id of a Grant Catalog)
`-- grant_catalogs[]: Grant Catalog
|-- id
`-- entries[]: entry
|-- id, revision
|-- profile, resource
`-- scope, authorization_details, claims,
sub_id, grant_binding
Every object defined in this section is a JSON object [RFC8259]. A document that carries these objects MUST conform to I-JSON [RFC7493]. A Grant Issuer MUST ignore members it does not understand (Section 8).¶
Each object is defined by a table of its members. In these tables,
"string", "object", and "array" denote JSON types, and the JSON value
null has none of these types.¶
The following members are used by several objects:¶
id:A stable identifier for the object. The value is a non-empty JSON string of at most 255 octets when encoded in UTF-8. Identifiers are opaque and case-sensitive, and are compared using simple string comparison (Section 6.2.1 of [RFC3986]). The length limit bounds the Grant Catalog and entry identifiers that a Grant Issuer retains with each approval (Section 5.5). Grant Catalog identifiers are unique within a Relationship View, and entry identifiers are unique within a Grant Catalog.¶
display:OPTIONAL. A JSON string containing a short, human-readable name for the object, intended for presentation to an administrator.¶
description:OPTIONAL. A JSON string containing a human-readable explanation of the object, such as what a scope value permits, intended for an administrator deciding what to approve.¶
The values of display and description have no effect on processing.
Language negotiation for these values is outside the scope of this
specification.¶
Where this specification describes a member as an array of unique values, the array MUST NOT contain the same value twice. Within an entry, each of the following values is unique and identifies an item:¶
a scope value within a values array;¶
a type value within a types array; and¶
a claim value within a claims array.¶
Members that carry protocol values, such as authorization_server,
tenant_id, profile, resource, scope, type, claim, and the
names in formats and methods, are compared using simple string
comparison (Section 6.2.1 of [RFC3986]).¶
A Relationship View is a JSON object with the following members:¶
| Member | Status | Description |
|---|---|---|
authorization_server
|
REQUIRED | String; the issuer identifier of the Resource Authorization Server |
grant_issuer
|
REQUIRED | Object; identifies the Issuer Relationship that the Relationship View serves |
tenants
|
REQUIRED | Array containing every Tenant Object (Section 4.3) eligible for the Issuer Relationship |
grant_catalogs
|
REQUIRED | Array containing each Grant Catalog (Section 4.4) that a Tenant Object references, each exactly once |
The issuer member of grant_issuer is REQUIRED and contains the
issuer identifier of the Grant Issuer. The tenant member of
grant_issuer contains the issuer tenant identifier, and is present if
and only if the Issuer Relationship has one (Section 6.1).¶
The Resource Authorization Server derives grant_issuer from the Issuer
Relationship that it used to select the Relationship View. Comparing
grant_issuer with the Issuer Relationship for which the Grant Issuer
retrieved the Relationship View (Section 5.1) detects errors in
routing, caching, or the association of responses with requests. The
comparison does not show that the Resource Authorization Server
selected the content of the Relationship View correctly.¶
A Relationship View is complete and is not paged. If the Issuer Relationship has no eligible tenants, both arrays are empty.¶
A Tenant Object binds one Resource Authorization Server tenant that is eligible for an Issuer Relationship to the Grant Catalog that applies to that tenant.¶
| Member | Status | Description |
|---|---|---|
tenant_id
|
OPTIONAL | String; the exact tenant identifier (Section 2) of the Resource Authorization Server tenant, which a grant issued for this tenant conveys as its target tenant (Section 4.6) |
display, description
|
OPTIONAL | See Section 4.1 |
grant_catalog
|
REQUIRED | String; the id of the Grant Catalog that applies to this tenant |
A Tenant Object is identified by its tenant_id or, if it has none, by
that absence. An ID-JAG conveys tenant_id in the aud_tenant claim
(Section 7.1).¶
The following requirements apply to tenant_id:¶
The Resource Authorization Server MUST include tenant_id unless its
issuer identifier alone identifies the target tenant.¶
A Relationship View MUST NOT contain more than one Tenant Object
without tenant_id, or two Tenant Objects with the same value of
tenant_id.¶
A Tenant Object that contains tenant_id is usable only with
entries whose Grant Profile can convey a target tenant (Section 4.6,
Section 5.4).¶
Several Tenant Objects can reference the same Grant Catalog. Tenant Objects for tenants that differ in any input that an entry governs (Section 4.6) reference different Grant Catalogs. A Tenant Object has no default Grant Catalog, and Grant Catalogs have no inheritance, partial overrides, or merge rules.¶
Section 5.5 specifies how a change to grant_catalog affects
approvals. A Tenant Object with a different tenant_id is a different
Tenant Object.¶
The following is an example of a Tenant Object:¶
{
"tenant_id": "customer-acme",
"display": "Acme",
"grant_catalog": "read-only"
}
¶
A Grant Catalog is a complete set of entries and is never paged or assembled from parts.¶
| Member | Status | Description |
|---|---|---|
id
|
REQUIRED | Identifier (Section 4.1) |
display, description
|
OPTIONAL | See Section 4.1 |
entries
|
REQUIRED | Array of entries (Section 4.5) |
An empty entries array indicates that the Resource Authorization
Server offers no grants for the tenants whose Tenant Objects reference
this Grant Catalog. A Grant Catalog can contain entries for several
Grant Profiles.¶
An entry describes the grants of one Grant Profile that the Resource Authorization Server accepts for one protected resource.¶
| Member | Status | Description |
|---|---|---|
id
|
REQUIRED | Identifier (Section 4.1) |
revision
|
REQUIRED | String of at most 255 octets in UTF-8; the version of the entry's normative semantics (Section 4.7) |
display, description
|
OPTIONAL | See Section 4.1 |
profile
|
REQUIRED | String; the identifier of the Grant Profile of the grants the entry describes |
resource
|
REQUIRED | String; the resource indicator (Section 2 of [RFC8707]) of the protected resource |
scope
|
OPTIONAL | Object; permitted scope values (Section 4.5.2) |
authorization_details
|
OPTIONAL | Object; permitted authorization details types (Section 4.5.3) |
claims
|
OPTIONAL | Non-empty array of claim objects (Section 4.5.4) |
sub_id
|
OPTIONAL | Object; permitted subject identifier formats (Section 4.5.5) |
grant_binding
|
OPTIONAL | Object; permitted grant binding methods (Section 4.5.6) |
The value of resource is an absolute URI [RFC3986] and MUST NOT
contain a fragment component.¶
Section 4.6 specifies the grants that the scope,
authorization_details, claims, sub_id, and grant_binding members
permit, including when they are absent.¶
The profile member identifies the Grant Profile, not the grant type
used to redeem the grant, because several Grant Profiles share the JWT
bearer grant type urn:ietf:params:oauth:grant-type:jwt-bearer
[RFC7523].¶
A Grant Catalog can contain entries for several resources, and several entries can name the same resource when they describe different grants (Section 4.6). A client that needs access to several resources obtains a separate grant for each.¶
The scope, authorization_details, sub_id, and grant_binding
members of an entry each contain a requirement member, called the
presence requirement, that states whether a grant conveys the input at
all. Scope value objects, authorization details type objects, and claim
objects each contain an OPTIONAL requirement member, called the item
requirement, that states whether a grant conveys that item.¶
The value of a requirement member is the JSON string required or
optional. An absent item requirement is treated as optional.¶
For a member with items A and B, the two levels permit the following selections:¶
| Presence | Item Requirements | Permitted Selections |
|---|---|---|
optional
|
A and B optional
|
None, A, B, or both |
required
|
A and B optional
|
A, B, or both |
required
|
A required, B optional
|
A, or both |
A member whose presence requirement is optional MUST NOT contain an
item whose item requirement is required.¶
The formats of the sub_id member and the methods of the
grant_binding member are alternatives and have no item requirement.
For these members, a presence requirement of required means that a
grant uses one of them (Section 4.6).¶
The scope member of an entry is a JSON object with the following
members:¶
| Member | Status | Description |
|---|---|---|
requirement
|
REQUIRED | The presence requirement (Section 4.5.1) |
values
|
REQUIRED | Non-empty array of scope value objects |
A scope value object has the following members:¶
| Member | Status | Description |
|---|---|---|
scope
|
REQUIRED | String; one scope token (Section 3.3 of [RFC6749]) |
requirement
|
OPTIONAL | The item requirement (Section 4.5.1) |
display, description
|
OPTIONAL | See Section 4.1 |
An entry distinguishes two kinds of claims that a grant conveys:¶
Claims whose presence and values the Grant Profile or other members of the catalog determine, such as the issuer, audience, or target tenant of a grant, and claims that the Grant Profile requires in every grant. The Grant Profile Definition lists them.¶
All other claims, including claims that the Grant Profile defines but does not require, such as an authentication context claim or an email address, and claims such as a department or group membership. A grant issued using an entry conveys a Catalog-Governed Claim only if the entry lists that claim.¶
Every claim that a grant issued using an entry conveys is either a reserved claim of its Grant Profile or a claim that the entry lists.¶
A claim object has the following members:¶
| Member | Status | Description |
|---|---|---|
claim
|
REQUIRED | String; a claim name in the namespace that the Grant Profile Definition specifies, which for JWT authorization grants is a JWT claim name (Section 4 of [RFC7519]) |
requirement
|
OPTIONAL | The item requirement (Section 4.5.1) |
definition_uri
|
OPTIONAL | String; an absolute https URI of the definition of the claim |
display, description
|
OPTIONAL | See Section 4.1 |
The claim member of a claim object MUST NOT be a reserved claim name
of the entry's Grant Profile.¶
A claim object has the following limits:¶
Listing a claim does not change the syntax or semantics that the Grant Profile or the claim's definition specifies for it.¶
Claim objects carry no constraints on claim values. An entry that
lists an authentication context claim as required requires the
claim to be present, not a particular value.¶
The definition_uri member is descriptive and does not establish the
truth or provenance of a claim.¶
The sub_id member of an entry is a JSON object with the following
members:¶
| Member | Status | Description |
|---|---|---|
requirement
|
REQUIRED | The presence requirement (Section 4.5.1) |
formats
|
REQUIRED | Non-empty array of unique format names from the "Security Event Identifier Formats" registry (Section 8.1 of [RFC9493]), such as email or saml-nameid (Section 3.2.1 of [ID-JAG]) |
This member describes a subject identifier [RFC9493] conveyed in
addition to the subject of the grant; for an ID-JAG, it is the sub_id
claim (Section 7.1).¶
The grant_binding member of an entry is a JSON object with the
following members:¶
| Member | Status | Description |
|---|---|---|
requirement
|
REQUIRED | The presence requirement (Section 4.5.1) |
methods
|
REQUIRED | Non-empty array of unique grant binding method names, defined below or by other specifications (Section 8) |
This specification defines the following grant binding methods:¶
dpop:The grant is bound to a DPoP key [RFC9449], and the client demonstrates possession of that key when presenting the grant.¶
mtls:The grant is bound to an X.509 certificate [RFC8705], and the client presents that certificate when presenting the grant.¶
The catalog does not describe client authentication to the Resource Authorization Server or sender-constraining of the access token that server issues. Both are separate from grant binding.¶
An entry defines an Authorization Envelope: the set of grants that the Resource Authorization Server is prepared to accept for one protected resource from the Issuer Relationship. The inputs that an entry governs are the protected resource and the inputs listed in Table 14. Grant Issuer policy and the runtime request narrow the Authorization Envelope (Section 5.3).¶
A grant is within the Authorization Envelope of an entry, for a Tenant Object that references the Grant Catalog containing the entry, when all of the following are true:¶
The grant conveys, as its only audience, the authorization_server
of the Relationship View that contains the Grant Catalog.¶
If the Tenant Object contains tenant_id, the grant conveys that
value as its target tenant. Otherwise, the grant conveys no target
tenant.¶
The grant conveys the entry's resource as its only protected
resource.¶
If the entry has no member for the input, the grant conveys none of that input.¶
Otherwise, every item of the input that the grant conveys is listed
in the member, and the grant conveys every listed item whose item
requirement is required.¶
If the member's presence requirement is required, the grant
conveys at least one item. The claims member has no presence
requirement.¶
For grant binding, a bound grant uses exactly one method.¶
| Input (Member) | Item | Conveyed When the Grant |
|---|---|---|
Scope values (scope, Section 4.5.2) |
The scope of each scope value object |
Conveys that scope value |
Authorization details (authorization_details, Section 4.5.3) |
The type of each authorization details type object |
Conveys at least one authorization details object of that type |
Catalog-Governed Claims (claims, Section 4.5.4) |
The claim of each claim object |
Conveys that claim |
Subject identifier in addition to the subject (sub_id, Section 4.5.5) |
Each name in formats
|
Conveys a subject identifier in that format |
Grant binding (grant_binding, Section 4.5.6) |
Each name in methods
|
Is bound using that method |
The inputs are independent: any selection of items that one member permits is permitted together with any selection that each other member permits.¶
The catalog expresses no alternatives between sets of items, no exclusions, and no conditions, either within a member or between members. When the Resource Authorization Server accepts only some combinations, it publishes separate entries whose Authorization Envelopes each contain only accepted combinations (Appendix B). For example, it might accept one scope value or another but not both, or a scope value only together with a particular claim. A Grant Issuer does not infer a rule that an entry does not state.¶
The revision member is an opaque version identifier controlled by the
Resource Authorization Server.¶
The normative semantics of an entry comprise:¶
the profile and resource members;¶
the scope member, including its requirement and the scope and
requirement of each scope value object;¶
the authorization_details member, including its requirement and
the type and requirement of each authorization details type
object;¶
the claims member, including the claim and requirement of each
claim object;¶
the sub_id and grant_binding members; and¶
any member that the specification defining it declares part of the normative semantics of an entry (Section 8).¶
The Resource Authorization Server:¶
MUST change the revision of an entry whenever it changes the
normative semantics of the entry; and¶
MUST NOT use, in Relationship Views for the same Issuer Relationship,
a revision value it has previously used for that entry with
different normative semantics.¶
A counter that increases with each change, or a digest of the normative semantics, meets both requirements.¶
When normative semantics are compared:¶
the order of elements in the values, types, claims, formats,
and methods arrays is not significant;¶
an absent item requirement is equivalent to the value optional; and¶
a Grant Issuer compares only the members it understands.¶
A change limited to other members, such as display, description,
documentation_uri, or definition_uri, does not require a new
revision.¶
The combination of the Resource Authorization Server issuer identifier,
the Issuer Relationship, the Grant Catalog id, the entry id, and the
revision identifies one set of normative semantics (Section 5.1).
Grant Catalog identifiers are unique only within a Relationship View
(Section 4.1), so the Grant Catalogs offered to two Issuer
Relationships can share an identifier and differ in content.¶
The revision member provides no integrity guarantee. It
lets the Grant Issuer determine whether an approval made for an earlier
copy of an entry still applies (Section 5.5). The retrieval
protocol handles caching of representations.¶
Before installing any part of a Relationship View, the Grant Issuer MUST verify the following:¶
The authorization_server of the Relationship View, and any other
issuer identifier that the retrieval protocol conveys, are identical
to the issuer identifier of the Resource Authorization
Server with which the Grant Issuer associates the Issuer
Relationship, using simple string comparison
(Section 6.2.1 of [RFC3986]).¶
The grant_issuer of the Relationship View identifies the Issuer
Relationship for which the Grant Issuer retrieved the Relationship
View: the issuer of grant_issuer is identical to that
relationship's issuer identifier, and the tenant of grant_issuer
and that relationship's issuer tenant identifier are either identical
or both absent.¶
Every document conforms to I-JSON [RFC7493]. The Relationship View, the structures that the retrieval protocol defines, every Tenant Object, and every Grant Catalog other than the contents of its entries satisfy their definitions: every REQUIRED member is present, and every member defined by this specification has the specified JSON type and meets the constraints stated for it. Grant Catalog and entry identifiers satisfy Section 4.1.¶
The grant_catalog of every Tenant Object identifies a Grant Catalog
in the Relationship View, and every Grant Catalog in the Relationship
View is referenced by at least one Tenant Object.¶
At most one Tenant Object omits tenant_id, and no two Tenant
Objects have the same tenant_id.¶
No entry has a Resource Authorization Server issuer identifier,
Grant Catalog id, entry id, and revision that the Grant Issuer
has currently installed, for the same Issuer Relationship, with
different normative semantics (Section 4.7).¶
If any of these checks fails, the retrieval is incomplete, and the Grant Issuer MUST NOT install any part of the Relationship View obtained in it (Section 5.5).¶
In addition, the Grant Issuer MUST NOT use an entry for issuance if any of the following is true. Each of these conditions affects only that entry:¶
The Grant Issuer does not implement a Grant Profile Definition for
the Grant Profile identified by profile.¶
A member of the entry other than its id, or a member of an object
within the entry, does not satisfy its definition in Section 4.5 or
Section 4.1: a REQUIRED member is absent, a member has a
JSON type other than the one specified, or a constraint stated for
the member is not met.¶
The entry contains a member for an input (Section 4.6) that its Grant Profile Definition states the Grant Profile cannot convey (Section 8.1).¶
The entry conflicts with public metadata (Section 5.2).¶
An entry that requires an item the Grant Issuer cannot produce, such as a subject identifier format or a grant binding method that the Grant Issuer does not implement, is valid but cannot be used by that Grant Issuer.¶
A Grant Issuer SHOULD make available to its administrators the reason that a Relationship View was not installed or that an entry cannot be used for issuance.¶
Public metadata remains authoritative for what it describes, and an entry cannot enable a value that public metadata excludes. When it installs a Relationship View, the Grant Issuer composes each entry with public metadata as follows:¶
Retrieve and validate the Resource Authorization Server's
Authorization Server Metadata (Section 3.3 of [RFC8414]), and
verify that its issuer identifier is identical to the
authorization_server of the Relationship View.¶
If the entry's resource is a URL that uses the https scheme
(Section 1.2 of [RFC9728]), request its Protected Resource Metadata
using the oauth-protected-resource well-known URI suffix
(Section 3 of [RFC9728]); otherwise, this step has no effect. If
the response has HTTP status code 200 (OK), validate the metadata as
specified in Section 3.3 of [RFC9728]. Any other response, or no
response, leaves this step without effect, because publishing
Protected Resource Metadata is optional.¶
For each member in the following table that the Authorization Server Metadata or the validated Protected Resource Metadata contains, verify that the member's values include every corresponding value of the entry.¶
Perform the checks that the Grant Profile Definition specifies, such
as checks of grant_types_supported (Section 7.3).¶
| Member | Metadata | Entry Values Checked |
|---|---|---|
authorization_grant_profiles_supported (Section 7.2 of [ID-JAG]) |
Authorization Server |
profile
|
authorization_details_types_supported (Section 10 of [RFC9396]) |
Authorization Server | Each authorization details type
|
authorization_details_types_supported (Section 2 of [RFC9728]) |
Protected Resource | Each authorization details type
|
A Resource Authorization Server that publishes
authorization_grant_profiles_supported MUST include in it the Grant
Profile of every entry it publishes.¶
A specification that defines another metadata member listing the values supported for a Grant Profile, or for an input that an entry governs (Section 4.6), can specify that the member is checked in the same way.¶
A member is not checked if its defining specification permits a server
to omit supported values from it: the scope values of an entry need not
appear in scopes_supported (Section 2 of [RFC8414],
Section 2 of [RFC9728]), and an authorization_servers member of
Protected Resource Metadata that omits the Resource Authorization
Server's issuer identifier is not a conflict (Section 2 of [RFC9728]).¶
If a step fails, the entry conflicts with public metadata, and the Grant Issuer MUST NOT use the entry for issuance. Step 2 fails if Protected Resource Metadata is retrieved and fails validation. The Grant Issuer does not resolve a conflict by preferring catalog values over public metadata or by combining values from both.¶
An administrator of the Grant Issuer approves a subset of an entry for use with a Tenant Object that references the entry's Grant Catalog. An approved subset is an Authorization Envelope contained in the entry's Authorization Envelope. It retains every requirement of the entry and can add requirements of its own. An administrator can:¶
remove optional items;¶
remove subject identifier formats and binding methods; and¶
make an optional member or item required.¶
For example, for an entry whose grant_binding member has the
requirement optional and the methods dpop and mtls, an
administrator can approve a subset in which binding is required and
dpop is the only method.¶
How a Grant Issuer records approval, and whether it approves entries for particular clients or subjects, is a matter of Grant Issuer policy.¶
The rules in Section 5.4 that refer to what an entry requires or permits apply to the approved subset.¶
At runtime, the Grant Issuer applies subject, client, consent, and other local policy, and the client's request, to narrow the approved subset further. For an item that the approved subset requires:¶
if local policy excludes the item, the Grant Issuer MUST NOT issue a grant using that entry; and¶
if the client's request omits the item, the Grant Issuer either adds it, when its policy permits issuing values that the client did not request, or does not issue a grant using that entry.¶
For example:¶
Publicly advertised scopes: messages.read, messages.write,
messages.admin
Catalog entry: messages.read, messages.write
Approved by policy: messages.read
Requested by the client: messages.read, messages.write
Issued in the grant: messages.read
The Grant Issuer cannot issue messages.admin merely because public
metadata advertises it, and cannot issue messages.write merely because
the catalog permits it.¶
When a Grant Issuer issues a grant using an entry, the Grant Issuer MUST ensure that the grant is within the Authorization Envelope of the subset of that entry approved for the Tenant Object for which the grant is issued (Section 5.3). The Grant Issuer issues each grant using exactly one entry, and MUST NOT combine inputs permitted by different entries in one grant.¶
After authenticating the client and the subject and applying its policy, the Grant Issuer issues a grant as specified by the Grant Profile, using one approved Tenant Object and one approved entry.¶
The Grant Issuer selects the Tenant Object from the client's request and
its own configuration for the Issuer Relationship; the catalog defines
no parameter of the client's grant request for selecting a target tenant
(Section 8.1). The Grant Issuer selects an entry whose Grant
Profile matches the kind of grant the client requested and whose
resource is the requested protected resource.¶
When more than one approved Tenant Object or entry could satisfy a request, Grant Issuer policy selects one. The Grant Issuer issues a grant for a request that names several resources only if its policy reduces the request to one of them. It issues a grant for a request that names no resource only if its policy determines one (Section 4.6).¶
The Grant Issuer MUST NOT issue a grant using an entry obtained for an Issuer Relationship unless the grant identifies its issuer by the issuer identifier of that relationship and, when the relationship has an issuer tenant, identifies that issuer tenant, as the Grant Profile Definition specifies (Section 8.1).¶
The Grant Issuer MUST NOT derive a target tenant identifier from the number of Tenant Objects in a Relationship View or from the form of an issuer identifier.¶
The Grant Issuer decides whether it releases a claim value. If an entry requires a claim that the Grant Issuer's policy does not permit it to release for a subject, the Grant Issuer MUST NOT issue a grant using that entry for that subject.¶
An entry does not create a binding. The Grant Issuer binds a grant only to a key or certificate whose possession the client has demonstrated, and selects the binding as the Grant Profile Definition specifies. Where the Grant Profile allows a choice of method, the Grant Issuer chooses a method that the entry permits.¶
The Grant Issuer MUST NOT issue a grant using an entry in either of the following cases:¶
the entry requires binding and the client has not demonstrated possession using any listed method; or¶
the Grant Profile requires the Grant Issuer to bind the grant, and the entry permits none of the methods that would satisfy that requirement.¶
The Grant Issuer uses an entry with a Tenant Object only when all of the following hold:¶
The Relationship View that contains them is installed (Section 5.5).¶
The entry is usable for issuance (Section 5.1).¶
If the Tenant Object contains tenant_id, the entry's Grant
Profile can convey a target tenant (Section 4.3).¶
An approval for the entry and the Tenant Object applies (Section 5.5).¶
When the Grant Issuer does not issue a grant because no approved entry permits the request, it responds to the client as the Grant Profile Definition specifies.¶
The catalog does not enumerate or register application clients, or establish client identifier mappings. A Relationship View is relationship-wide and does not establish eligibility for a particular application client: a Resource Authorization Server can permit a grant configuration for one application client and reject an otherwise equivalent configuration for another.¶
When the grants of a Grant Profile identify the client by its client identifier at the Resource Authorization Server, its Grant Profile Definition specifies how the Grant Issuer obtains that identifier, as Section 7 does for ID-JAG. Such an identifier can be shared across trust domains [CIMD].¶
The following terms describe a retrieval:¶
A retrieval in which the Grant Issuer obtains and validates a complete Relationship View (Section 5.1), or in which the retrieval protocol confirms the installed one (Section 6.8).¶
A retrieval in which a transport failure occurs, a response is interrupted or fails validation, or the Resource Authorization Server rejects the Grant Issuer's credentials.¶
After a complete retrieval, the Grant Issuer replaces the installed
state for the Issuer Relationship with the new Relationship View. A
Tenant Object, Grant Catalog, or entry that the new Relationship View
omits, or contains with a different grant_catalog or revision, is
withdrawn.¶
A Grant Issuer retains the following with each approval:¶
the Resource Authorization Server issuer identifier;¶
the Issuer Relationship;¶
the Tenant Object's tenant_id, if any;¶
the Grant Catalog id;¶
the entry id and revision;¶
the approved subset; and¶
any client identifier mapping that the Grant Profile requires.¶
The items of the approved subset are identified by their protocol values. State that is specific to a retrieval protocol, such as a URI or an HTTP entity tag, is retained separately and is not part of an approval.¶
An approval applies while the installed Relationship View contains a
Tenant Object that has the approved tenant_id (or no tenant_id, if
the approved Tenant Object had none) and the approved grant_catalog,
and that Grant Catalog contains an entry with the approved id and
revision.¶
The Grant Issuer applies the rules in Table 16 after each retrieval.¶
| Event | Rule |
|---|---|
| A retrieval is incomplete | The Grant Issuer MUST NOT install any state from that retrieval, and does not treat it as a withdrawal. State installed from an earlier retrieval remains in force, subject to the maximum age below. |
| A Tenant Object or entry appears | The appearance of a new Tenant Object or entry MUST NOT, by itself, cause the Grant Issuer to issue grants using it. |
| An entry changes | A change to an entry MUST NOT, by itself, expand an existing approval. |
Only members outside the normative semantics of an entry change (Section 4.7), and every approved identifier, grant_catalog, and revision is unchanged |
Approvals that depend on the changed objects continue to apply. |
| A Tenant Object, Grant Catalog, or entry is withdrawn | The Grant Issuer MUST stop issuing grants that depend on it in its previous form, and suspends issuance under the approvals that depend on it. |
The grant_catalog of a Tenant Object, or the revision of an entry, changes |
The Grant Issuer MUST NOT issue grants under an approval made for the previous value. Issuance resumes only under an approval made for the new value. |
A later complete retrieval contains a withdrawn object again with the approved identifiers, grant_catalog, and revision
|
The approval applies again without new approval. |
A change of grant_catalog or revision also
withdraws the previous form of the object, so the withdrawal row applies
to it as well.¶
These rules apply to every change of revision, including a change that only narrows an entry, such as the removal of a scope value (Section 9.8). Whether to relax these rules is an open issue (Appendix "Open Issues").¶
The Grant Issuer SHOULD retrieve the Relationship View periodically and after administrative changes to the Issuer Relationship.¶
The Grant Issuer SHOULD stop issuing grants that depend on installed state it has not been able to refresh within a maximum age that it configures for the Issuer Relationship, such as one day. The maximum age is measured from the most recent complete retrieval. An incomplete retrieval, including one that results from the end of the Issuer Relationship, does not extend the maximum age (Section 9.7).¶
A Resource Authorization Server that needs issuance to stop sooner removes every eligible tenant from the relationship before ending it. The Grant Issuer observes that removal at its next refresh as a withdrawal.¶
A Grant Issuer can use other metadata to help administrators understand entries: authorization details types metadata [RAR-METADATA] describes the structure of an authorization details type, and authority metadata [AUTHORITY-METADATA] describes what a scope value or authorization details type authorizes.¶
Such metadata is advisory:¶
it cannot broaden an entry or an approval;¶
it does not cause an entry to conflict with public metadata; and¶
its absence, or a failure to retrieve it, does not affect the validity of an entry.¶
This specification does not define how a Grant Issuer uses schemas or authority descriptions to enforce or narrow policy.¶
The Grant Issuer MUST NOT send a credential obtained through a retrieval
protocol when dereferencing a schema_uri ([RAR-METADATA]),
documentation_uri, or definition_uri.¶
Before disclosing catalog content to a Grant Issuer, the Resource Authorization Server establishes, through a retrieval protocol (Section 8), which Issuer Relationship the disclosure serves. Section 6.1 and Section 6.2 apply to every retrieval protocol. The remaining subsections define the OAuth retrieval protocol, which requires only public metadata and an Onboarding Arrangement and is the same for every Grant Profile.¶
An Issuer Relationship is identified by the Grant Issuer's issuer identifier [RFC8414] and, when that issuer is multi-tenant, an issuer tenant identifier. An issuer tenant identifier is a tenant identifier (Section 2) of the Grant Issuer. Grants issued by the Grant Issuer identify their issuer and issuer tenant by these values.¶
Where a grant or a catalog access assertion conveys the issuer tenant
identifier in the tenant claim [OpenID.Enterprise], the value is the
stable, issuer-unique form of that claim. The values personal and
organization, which Section 2.2 of [OpenID.Enterprise] reserves for
categories of accounts, do not identify an issuer tenant.¶
An issuer tenant identifier is scoped by the issuer identifier. The Resource Authorization Server:¶
This specification defines the following Authorization Server Metadata [RFC8414] member for the OAuth retrieval protocol:¶
authorization_grant_catalog_endpoint:URL of the catalog endpoint, from which the Grant Issuer retrieves its Relationship View (Section 6.7). The URL:¶
A Resource Authorization Server that supports the OAuth retrieval protocol MUST publish this member. A Grant Issuer MUST NOT use the OAuth retrieval protocol with a Resource Authorization Server whose metadata omits this member.¶
The following is an example of Authorization Server Metadata for a Resource Authorization Server that supports ID-JAG and the OAuth retrieval protocol:¶
{
"issuer": "https://ras.example/",
"token_endpoint": "https://ras.example/oauth2/token",
"jwks_uri": "https://ras.example/oauth2/jwks",
"grant_types_supported": [
"urn:ietf:params:oauth:grant-type:jwt-bearer",
"urn:ietf:params:oauth:grant-type:jwt-dpop"
],
"authorization_grant_profiles_supported": [
"urn:ietf:params:oauth:grant-profile:id-jag"
],
"token_endpoint_auth_methods_supported": ["private_key_jwt"],
"dpop_signing_alg_values_supported": ["ES256"],
"authorization_grant_catalog_endpoint":
"https://ras.example/oauth2/grant-catalog"
}
¶
A catalog access assertion is a JWT that the Grant Issuer signs on its own behalf, not on behalf of an end user or a client. The Grant Issuer presents it as an authorization grant [RFC7523] to obtain a catalog access token. The assertion is not a grant in the sense of this specification (Section 2).¶
A catalog access assertion is a JWS [RFC7515] with the following JOSE header parameters:¶
typ:REQUIRED. The value oauth-grant-catalog-access+jwt
(Section 3.11 of [RFC8725]).¶
alg:REQUIRED. An asymmetric digital signature algorithm. The value MUST NOT be none or a MAC-based algorithm.¶
kid:OPTIONAL. The key identifier of the Grant Issuer's signing key.¶
The catalog access assertion contains the following claims:¶
iss:REQUIRED. The issuer identifier of the Grant Issuer (Section 6.1).¶
sub:REQUIRED. The same value as iss. Section 3 of [RFC7523] requires a
sub claim; for this assertion, the claim has no other meaning.¶
aud:REQUIRED. The issuer identifier of the Resource Authorization Server, as a JSON string. This narrows Section 3 of [RFC7523], which also permits the token endpoint URL.¶
tenant:REQUIRED if the Grant Issuer uses a multi-tenant issuer; otherwise, it
MUST be omitted. The issuer tenant identifier of the Issuer
Relationship (Section 6.1), conveyed in the tenant
claim [OpenID.Enterprise].¶
iat:REQUIRED. The time at which the assertion was issued (Section 4.1.6 of [RFC7519]).¶
exp:REQUIRED. The expiration time of the assertion
(Section 4.1.4 of [RFC7519]). The value MUST NOT be more than 300
seconds after the value of iat.¶
jti:REQUIRED. A unique identifier for the assertion (Section 4.1.7 of [RFC7519]).¶
cnf:OPTIONAL. A confirmation claim that binds the assertion to a DPoP key
that the Grant Issuer controls, as specified in
Section 3 of [JWT-DPOP]. A catalog access assertion that contains
this claim is DPoP-bound. The Grant Issuer MUST NOT include this claim
unless the grant_types_supported member of the Resource
Authorization Server's metadata includes
urn:ietf:params:oauth:grant-type:jwt-dpop.¶
The catalog access assertion identifies only the Issuer Relationship
and, when the assertion is DPoP-bound, the Grant Issuer's DPoP key. It
does not contain the aud_tenant claim or identify a Grant Profile,
target tenant, End-User, client, resource, scope, or authorization
details. Other claims MAY be present and are ignored unless understood.¶
The following is an example of the JOSE header and claims of a catalog access assertion:¶
{
"typ": "oauth-grant-catalog-access+jwt",
"alg": "ES256",
"kid": "issuer-key-1"
}
¶
{
"iss": "https://idp.example/",
"sub": "https://idp.example/",
"aud": "https://ras.example/",
"tenant": "acme-workforce",
"iat": 1788897600,
"exp": 1788897720,
"jti": "catalog-request-123"
}
¶
The Resource Authorization Server validates the catalog access assertion as specified in Section 3 of [RFC7523], and in addition MUST ensure the following:¶
The typ JOSE header parameter is oauth-grant-catalog-access+jwt.¶
The iss claim identifies a Grant Issuer for which an Onboarding
Arrangement exists. The signature verifies using a key of that issuer
obtained from the jwks_uri in the issuer's Authorization Server
Metadata (Section 3 of [RFC8414]) or provisioned under the
Onboarding Arrangement. The signature algorithm is an asymmetric
algorithm that the Resource Authorization Server allows for that
issuer (Section 3.1 of [RFC8725]).¶
The sub claim is identical to the iss claim.¶
The aud claim is a JSON string identical to the issuer identifier
of the Resource Authorization Server.¶
The iat claim is present and, subject to the Resource Authorization
Server's allowance for clock skew, is not later than the current
time, and exp is not more than 300 seconds after iat.¶
The jti claim is present and has not been used in a previously
accepted catalog access assertion from the same issuer. An assertion
is accepted when the Resource Authorization Server issues a catalog
access token in response to it. The Resource Authorization Server
retains each accepted jti value, across every instance of its token
endpoint, until the assertion's exp time plus the allowance for
clock skew has passed.¶
The pair of iss and, when present, tenant identifies an Issuer
Relationship that an Onboarding Arrangement currently authorizes
(Section 6.2). An assertion identifies no Issuer
Relationship if:¶
The Resource Authorization Server:¶
MUST NOT accept a JWT with a typ other than
oauth-grant-catalog-access+jwt as a catalog access assertion; and¶
MUST NOT accept a catalog access assertion as a grant of any Grant Profile or as a client assertion.¶
These rules apply whether or not a Grant Profile specifies a typ value
for its grants (Section 9.11).¶
The Grant Issuer requests a catalog access token by sending a token request (Section 2.1 of [RFC7523]) to the token endpoint of the Resource Authorization Server with the following parameters:¶
grant_type:REQUIRED. The value urn:ietf:params:oauth:grant-type:jwt-bearer or,
for a DPoP-bound catalog access assertion, the value
urn:ietf:params:oauth:grant-type:jwt-dpop
(Section 4.1 of [JWT-DPOP]).¶
assertion:REQUIRED. The catalog access assertion.¶
resource:REQUIRED. The value of the authorization_grant_catalog_endpoint
metadata member (Section 2 of [RFC8707]).¶
scope:REQUIRED. The value authorization_grant_catalog.read, the scope
value this specification defines for read access to the catalog.¶
A Resource Authorization Server that supports the OAuth
retrieval protocol and includes
urn:ietf:params:oauth:grant-type:jwt-dpop in grant_types_supported
MUST accept DPoP-bound catalog access assertions.¶
When the Onboarding Arrangement requires client authentication at the token endpoint (Section 3.1 of [RFC7523]), the Grant Issuer is a registered client of the Resource Authorization Server. The Grant Issuer authenticates using the method that the Onboarding Arrangement fixes, such as a JWT client assertion signed with a key of the Grant Issuer (Section 2.2 of [RFC7523]). The following rules apply to client assertions:¶
A Grant Issuer that authenticates with a JWT client assertion MUST
use the issuer identifier of the Resource Authorization Server as the
sole value of the client assertion's aud claim.¶
The Resource Authorization Server MUST reject a catalog access token request whose client assertion does not contain its issuer identifier as the sole audience value ([RFC7523BIS]).¶
The Grant Issuer MUST NOT use a catalog access assertion as a client assertion.¶
The Grant Issuer SHOULD sign client assertions with a key that it does not use to sign catalog access assertions or grants (Section 3.12 of [RFC8725]).¶
When client authentication is not required, the request contains no
client_id parameter.¶
The following is an example of a catalog access token request that uses client authentication, with both assertions abbreviated (line breaks for display purposes only):¶
The Resource Authorization Server processes the request as follows:¶
If the grant type is urn:ietf:params:oauth:grant-type:jwt-dpop, it
validates the DPoP proof (Section 5 of [JWT-DPOP]) before
validating the assertion, so that a request rejected for its proof or
nonce does not consume the assertion's jti
(Section 5.1 of [JWT-DPOP]).¶
It validates the catalog access assertion (Section 6.4.1).¶
It checks the assertion according to the grant type:¶
If the grant type is urn:ietf:params:oauth:grant-type:jwt-dpop,
it verifies that the assertion is bound to the key of the DPoP
proof (Section 5 of [JWT-DPOP]) and that its cnf claim
contains only the jkt member.¶
If the grant type is urn:ietf:params:oauth:grant-type:jwt-bearer,
it verifies that the assertion contains no cnf claim, whether or
not it supports the urn:ietf:params:oauth:grant-type:jwt-dpop
grant type (Section 7.1 of [JWT-DPOP]), and that the Onboarding
Arrangement does not require DPoP-bound catalog access
assertions.¶
It verifies that the resource parameter is identical to its
authorization_grant_catalog_endpoint metadata value.¶
It verifies that the scope parameter is
authorization_grant_catalog.read.¶
If the Onboarding Arrangement requires client authentication, it
authenticates the client and verifies that the Onboarding
Arrangement associates the authenticated client with the iss claim
of the catalog access assertion. It does not accept as a client
assertion any JWT whose typ is oauth-grant-catalog-access+jwt.¶
It records the assertion's jti value as accepted and issues the
catalog access token. It checks that the value is still unused and
records it in one atomic operation, so that two concurrent requests
that carry the same assertion cannot both obtain a catalog access
token, and a request rejected by an earlier step does not consume
the value.¶
When the Onboarding Arrangement requires client authentication, the Resource Authorization Server MUST NOT issue a catalog access token on the strength of the catalog access assertion alone.¶
Because the catalog is disclosed to the Issuer Relationship identified by the catalog access assertion, not to the authenticated client, a Grant Issuer that uses a multi-tenant issuer needs at most one client registration at each Resource Authorization Server. The Grant Issuer's client identifier can then equal its issuer identifier, as in the example above.¶
If the request is valid, the Resource Authorization Server responds as specified in Section 5.1 of [RFC6749]. The Resource Authorization Server:¶
MUST restrict the catalog access token to the catalog resource and
the authorization_grant_catalog.read scope; and¶
MUST associate the token with the Issuer Relationship identified by the catalog access assertion.¶
The Resource Authorization Server SHOULD issue catalog access tokens with a lifetime of a few minutes, and MUST NOT issue a refresh token; the Grant Issuer obtains a new catalog access token with a new catalog access assertion.¶
The Resource Authorization Server MUST NOT issue an access token for
the catalog resource, or with the authorization_grant_catalog.read
scope, in response to any token request other than one specified in
Section 6.5.¶
The following is an example of a catalog access token response:¶
When the catalog access assertion is DPoP-bound, the Resource
Authorization Server MUST issue a catalog access token bound to the same
key, with the token_type value DPoP (Section 6 of [JWT-DPOP]).
The catalog resource is a protected resource of the Resource
Authorization Server, so the exception in that section for protected
resources that do not support DPoP does not apply.¶
When the catalog access assertion is not DPoP-bound, the Resource Authorization Server MAY issue a DPoP-bound catalog access token ([RFC9449]) or a certificate-bound catalog access token ([RFC8705]) when the Grant Issuer uses those mechanisms.¶
The Grant Issuer retrieves its Relationship View by sending an HTTP GET
request to the authorization_grant_catalog_endpoint URL, presenting
the catalog access token as specified in Section 2.1 of [RFC6750] or,
for a DPoP-bound token, Section 7.1 of [RFC9449]. The Resource
Authorization Server verifies the DPoP proof for a DPoP-bound token and
rejects a DPoP-bound token presented as a bearer token
(Section 7.2 of [RFC9449]).¶
The Grant Issuer MUST send a catalog access token only to the
authorization_grant_catalog_endpoint URL from Authorization Server
Metadata it has validated (Section 3.3 of [RFC8414]), without further
resolution or normalization of that URL. The Grant Issuer MUST NOT
follow redirections in response to a request that carries a catalog
access token, and treats a redirection as an incomplete retrieval
(Section 5.5).¶
The Resource Authorization Server determines the Relationship View from
the Issuer Relationship associated with the catalog access token
(Section 6.2). It responds with HTTP status code 200
(OK) and a Relationship View document of media type
application/oauth-grant-catalog+json (Section 11.2), whose
content is the Relationship View (Section 4.2). The Resource
Authorization Server MUST construct the document from one consistent
state of the Issuer Relationship.¶
The Grant Issuer validates the document as specified in Section 5.1, and treats a response of any other media type as an incomplete retrieval (Section 5.5).¶
The following is an example of a Relationship View document request and
response for another Issuer Relationship, with the issuer tenant
acme-workforce and two eligible tenants. The
entries of each Grant Catalog are abbreviated; Appendix A
shows the Grant Catalog standard in full:¶
The Resource Authorization Server SHOULD include a strong entity tag
(Section 8.8.3 of [RFC9110]) in each Relationship View document
response, and SHOULD support conditional requests using If-None-Match
(Section 13.1.2 of [RFC9110]).¶
When the Grant Issuer holds an entity tag, it sends a conditional
request, and sends If-None-Match only with the entity tag of a
representation it has installed. A 304 (Not Modified) response
(Section 15.4.5 of [RFC9110]) confirms the installed Relationship View
and is a complete retrieval (Section 5.5).¶
A Relationship View document is specific to an Issuer Relationship. The
Resource Authorization Server MUST include Cache-Control: no-store
(Section 5.2.2.5 of [RFC9111]) in these responses. The Grant Issuer
retains the document and its entity tag as application state, keyed by
the Resource Authorization Server's issuer identifier and the Issuer
Relationship.¶
This retrieval protocol is designed for Relationship Views of up to
several thousand Tenant Objects in one response, not for unbounded
collections. The Grant Issuer SHOULD indicate support for content
codings using Accept-Encoding (Section 12.5.3 of [RFC9110]), and the
Resource Authorization Server SHOULD compress responses when the Grant
Issuer supports a content coding.¶
The token endpoint returns errors as specified in
Section 5.2 of [RFC6749] and, for the
urn:ietf:params:oauth:grant-type:jwt-dpop grant type,
Section 5 of [JWT-DPOP]. The Resource Authorization Server returns:¶
invalid_grant, if:¶
the catalog access assertion is invalid, expired, or replayed, or identifies no authorized Issuer Relationship;¶
a DPoP-bound assertion is presented with the
urn:ietf:params:oauth:grant-type:jwt-bearer grant type;¶
an assertion that is not DPoP-bound is presented when the Onboarding Arrangement requires one; or¶
the client that the Grant Issuer authenticated as is not associated with the assertion's issuer.¶
invalid_target (Section 2 of [RFC8707]), if the resource
parameter is missing or is not the catalog resource.¶
invalid_scope, if the scope parameter is missing or is not
authorization_grant_catalog.read.¶
The catalog endpoint returns errors as specified in Section 3 of [RFC6750], or Section 7.1 of [RFC9449] for a DPoP-bound token. The Resource Authorization Server responds with:¶
HTTP status code 401 (Unauthorized) and invalid_token, if the
Issuer Relationship associated with the catalog access token is no
longer authorized.¶
HTTP status code 403 (Forbidden) and insufficient_scope, if the
access token does not include the authorization_grant_catalog.read
scope (Section 3.1 of [RFC6750]).¶
An error response MUST NOT disclose whether another issuer, issuer tenant, Resource Authorization Server tenant, Grant Catalog, or entry exists.¶
In this Grant Profile Definition for [ID-JAG], the Grant Issuer is the IdP Authorization Server and grants are ID-JAGs. A Grant Profile Definition for another profile of the JWT authorization grant [RFC7523] can reuse the representation of inputs in Section 7.1.¶
urn:ietf:params:oauth:grant-profile:id-jag
(Section 7.2 of [ID-JAG]).¶
The IdP Authorization Server selects the binding as described in Section 9.11 of [ID-JAG]. When the client presents a valid DPoP proof, ID-JAG requires the IdP Authorization Server to bind the ID-JAG to the DPoP key or a client certificate (Section 9.11.1.1 of [ID-JAG]). Either method satisfies that requirement if the approved subset permits it (Section 5.4).¶
When the approved subset permits neither method, the IdP Authorization
Server does not issue an ID-JAG using the entry for a request with a
valid DPoP proof (Section 5.4), so a Resource Authorization Server
that verifies DPoP-bound ID-JAGs lists dpop in its entries.¶
ID-JAG does not require the resource parameter of the Token Exchange
request (Section 4.3 of [ID-JAG]); Section 5.4 specifies how the IdP
Authorization Server selects an entry when that parameter is absent.¶
The IdP Authorization Server selects the Tenant Object as it
determines the aud_tenant claim (Section 6.4 of [ID-JAG]).¶
When the IdP Authorization Server does not issue an ID-JAG because no
approved entry permits the request, it responds to the Token Exchange
request with the access_denied error code
(Section 4.3.4.3 of [ID-JAG]).¶
Catalog use narrows the following rules of [ID-JAG]:¶
An ID-JAG issued using an entry always contains the resource
claim with exactly one resource identifier.
Section 3.1 of [ID-JAG] makes the claim OPTIONAL and permits
several resource identifiers.¶
An ID-JAG issued using an entry contains a Catalog-Governed Claim
only if the entry lists it (Section 4.5.4).
Section 3.1 of [ID-JAG] allows any claim valid in an ID Token and
recommends the email and aud_sub claims for subject resolution.
A Resource Authorization Server that uses those claims lists them in
its entries.¶
Requiring tenant_id in a Tenant Object (Section 4.3) is
stricter than Section 4.4.1 of [ID-JAG], which also lets a
Resource Authorization Server identify the target tenant from its
trust relationship with the issuer.¶
The client_id claim carries the client's identifier at the Resource
Authorization Server. The IdP Authorization Server obtains this value
as described in Section 5.1 of [ID-JAG]; the catalog does not
provide it (Section 5.4.1).¶
The following is an example of the claims of an ID-JAG issued for the
Tenant Object customer-acme-eu in Section 6.7, using the entry
in Appendix A:¶
{
"iss": "https://idp.example/",
"sub": "user-123",
"tenant": "acme-workforce",
"aud": "https://ras.example/",
"aud_tenant": "customer-acme-eu",
"client_id": "ras-client-789",
"resource": "https://api.example/messages",
"scope": "messages.read",
"email": "user@acme.example",
"sub_id": {
"format": "saml-nameid",
"issuer": "https://idp.example/saml",
"nameid": "user@acme.example"
},
"cnf": {
"jkt": "0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I"
},
"iat": 1788897700,
"exp": 1788898000,
"jti": "grant-456"
}
¶
An ID-JAG conveys its issuer, its issuer tenant (Section 5.4), and the values that Section 4.6 constrains as follows.¶
| Input | JWT Representation |
|---|---|
| Issuer |
iss claim (Section 4.1.1 of [RFC7519]) |
| Issuer tenant |
tenant claim [OpenID.Enterprise] (Section 6.1 of [ID-JAG]) |
| Audience |
aud claim, as a string or an array of one string |
| Target tenant |
aud_tenant claim (Section 3.1 of [ID-JAG]) |
| Protected resource |
resource claim (Section 3.1 of [ID-JAG]), as a string or an array of one string |
| Scope values |
scope claim (Section 4.2 of [RFC8693]) |
| Authorization details |
authorization_details claim (Section 9.1 of [RFC9396]) |
| Catalog-Governed Claims | Claims named by the claim member of claim objects |
| Subject identifier |
sub_id claim (Section 4.1 of [RFC9493]) |
| Grant binding |
cnf claim (Section 3.1 of [RFC7800]) |
A cnf claim that represents a binding contains only the confirmation
member of one method:¶
dpop:The jkt confirmation member, containing the JWK SHA-256 Thumbprint
of the client's DPoP key (Section 6.1 of [RFC9449]), as specified in
Section 3 of [JWT-DPOP].¶
mtls:The x5t#S256 confirmation member, containing the SHA-256 thumbprint
of the client's X.509 certificate (Section 3.1 of [RFC8705]).¶
The reserved claim names of this Grant Profile are iss, sub, aud,
jti, exp, iat, nbf, tenant, aud_tenant, resource, scope,
authorization_details, sub_id, cnf, client_id
(Section 4.3 of [RFC8693]), and act (Section 4.1 of [RFC8693]).
The Grant Profile, not an entry, determines whether a grant conveys a
client identifier or an actor. The other claims that
Section 3.1 of [ID-JAG] defines (auth_time, acr, amr,
aud_sub, and email) are Catalog-Governed Claims.¶
An ID-JAG has the typ value oauth-id-jag+jwt
(Section 3.1 of [ID-JAG]); see Section 9.11.¶
A Resource Authorization Server that publishes entries for this Grant
Profile MUST include grant_types_supported in its Authorization Server
Metadata; if it lists this Grant Profile in
authorization_grant_profiles_supported, it also includes
urn:ietf:params:oauth:grant-type:jwt-bearer in grant_types_supported
(Section 7.2 of [ID-JAG]). For each such entry, the Grant Issuer
performs the following checks in step 4 of Section 5.2, interpreting
grant_types_supported with the default value defined in
Section 2 of [RFC8414]:¶
Unless the entry requires binding and lists dpop as its only method,
grant_types_supported includes
urn:ietf:params:oauth:grant-type:jwt-bearer.¶
If the entry lists dpop, grant_types_supported includes
urn:ietf:params:oauth:grant-type:jwt-dpop
(Section 4.1 of [JWT-DPOP]).¶
The extension points below are designed to preserve the principles in Section 3.¶
A specification can apply the catalog to another Grant Profile by providing a Grant Profile Definition (Section 8.1). A Grant Issuer that does not implement that Grant Profile Definition does not use that profile's entries (Section 5.1).¶
A specification can define additional members of the objects defined in this specification. A Grant Issuer ignores members it does not understand (Section 4.1). If the value of a member of an entry, or of an object within an entry, affects what an administrator approves or which grants the entry permits, the specification that defines the member declares that member part of the entry's normative semantics (Section 4.7).¶
An extension member is either advisory or restrictive:¶
An advisory member informs approval, for example by grouping entries for presentation to administrators. A Grant Issuer that ignores an advisory member still issues only grants within the entry's Authorization Envelope as this specification defines it.¶
A restrictive member narrows the grants that the Resource Authorization Server accepts below the entry's Authorization Envelope, for example by constraining the values in authorization details objects. A Grant Issuer that ignores a restrictive member issues grants that the Resource Authorization Server rejects, after their claims have been disclosed to the client.¶
A specification MUST NOT define a restrictive member unless it also defines a mechanism that prevents Grant Issuers that do not implement the member from using the entry, such as a distinct Grant Profile identifier. This specification defines no such mechanism (Appendix "Open Issues").¶
A specification can define additional grant binding methods. It states how the Grant Issuer binds a grant, how the Resource Authorization Server verifies the binding, and how a grant represents it.¶
A specification can define another retrieval protocol. That protocol:¶
defines error responses;¶
defines how the Grant Issuer locates the catalog;¶
authenticates the Issuer Relationship (Section 6.1) to the Resource Authorization Server;¶
authenticates the Resource Authorization Server to the Grant Issuer; and¶
delivers, unchanged, a complete Relationship View (Section 4.2) that reflects one consistent state of the Issuer Relationship.¶
A Grant Issuer does not combine objects obtained through different retrieval protocols.¶
A Grant Profile Definition specifies the following:¶
The Grant Profile identifier used in the profile member of an
entry.¶
How a grant of the profile conveys each input in Section 4.6. A Grant Profile to which the catalog applies conveys the audience and the protected resource. Where the profile cannot convey another input, the Grant Profile Definition says so; an entry for that profile then does not contain the corresponding member.¶
How a grant of the profile identifies its issuer and, for a multi-tenant issuer, its issuer tenant (Section 5.4).¶
The reserved claim names of the profile, including the claims the
profile requires in every grant (Section 4.5.4), and the namespace
of the claim member.¶
For each grant binding method the profile supports, how the binding is represented in a grant, when the profile requires the Grant Issuer to bind a grant, and how the Grant Issuer selects among methods (Section 5.4).¶
The composition checks against public metadata that apply to the profile, such as checks of the grant types used to redeem its grants (Section 5.2).¶
How the Grant Issuer selects a Tenant Object for a request, and how it responds when it does not issue a grant because no approved entry permits the request (Section 5.4).¶
Any rule of the Grant Profile that catalog use narrows, such as making an OPTIONAL element required.¶
For a profile whose grants identify the client by its client identifier at the Resource Authorization Server, how the Grant Issuer obtains that identifier (Section 5.4.1).¶
A Grant Profile Definition for a JWT authorization grant SHOULD specify
a typ value for the grants of the profile
(Section 3.11 of [RFC8725]), so that a Resource Authorization Server
that accepts them at the same token endpoint as catalog access
assertions can distinguish the two (Section 9.11).¶
The security considerations of [RFC7521], [RFC7523], [RFC8725], and [RFC9700], and of the Grant Profile of each entry, such as [ID-JAG], apply to this specification.¶
An entry does not state the authority that its scope values and
authorization details types represent at the protected resource, so an
approval bounds the grants that the Grant Issuer constructs, not what
those grants authorize. For example, if the protected resource changes
messages.write so that it also permits deleting messages, the entry
and its revision do not change, and approvals that include
messages.write continue to apply.¶
A Resource Authorization Server that changes the authority of an existing scope value can instead publish a new scope value, so that the change requires new approval. Authority metadata can reveal such a change (Section 5.6) but does not bind the protected resource.¶
Trust in a Grant Issuer's signing keys establishes that the Grant Issuer can issue grants, not that it is entitled to learn the Resource Authorization Server's configuration for every issuer tenant identifier it can name. An Onboarding Arrangement authorizes each Issuer Relationship separately (Section 6.2).¶
When a Resource Authorization Server accepts one signing key for several Issuer Relationships, as it can for a multi-tenant issuer, a compromise of that key or of the signing service that uses it discloses the catalogs of all those Issuer Relationships. This specification requires no particular arrangement of keys across tenants.¶
An Onboarding Arrangement authorizes an issuer tenant identifier, not the organization behind it. If an issuer reassigned a tenant identifier to another tenant, contrary to its definition (Section 2), the new tenant would receive the catalog content of the old one.¶
A Relationship View is disclosed to an Issuer Relationship, not to a client, so its retrieval is not the protected discovery mechanism of Section 9.7 of [ID-JAG], which requires client authentication. Whether to define that mechanism is an open issue (Appendix "Open Issues").¶
The Grant Issuer's signature on the catalog access assertion binds a response to the relationship, so client authentication at the token endpoint is required only when the Onboarding Arrangement requires it (Section 6.2, Section 6.5).¶
When the Onboarding Arrangement does not require client authentication, the catalog access assertion is the only credential the Grant Issuer presents. An assertion that is not DPoP-bound is then a bearer credential until the Resource Authorization Server accepts it. The replay check (Section 6.4.1) prevents reuse of the assertion but not its first use by a party that obtains it, and binding only the catalog access token does not prevent that use.¶
A DPoP-bound catalog access assertion cannot be used without the private
key that its cnf claim identifies (Section 6.5). DPoP binding
demonstrates possession of a key that the Grant Issuer names under its
own signature; it is not client authentication.¶
The assertion's short lifetime, its audience restriction, and TLS further limit the exposure. A Resource Authorization Server weighs the confidentiality of its catalog content when deciding whether its Onboarding Arrangements require client authentication or DPoP-bound catalog access assertions.¶
A disclosed catalog access token permits retrieval of the Relationship View until it expires or the relationship ends. The rules for where the Grant Issuer sends the token (Section 6.7) limit its disclosure. The token's restriction to the catalog resource and scope (Section 6.6) prevents its use at other protected resources of the Resource Authorization Server.¶
Relationship View documents are not signed. Their authenticity and integrity rest on TLS server authentication of the catalog resource and on validation of the Resource Authorization Server's metadata (Section 3.3 of [RFC8414]).¶
An attacker able to alter catalog responses can cause an administrator of the Grant Issuer to approve grants that the Resource Authorization Server did not offer, or to deny approval of grants that it did offer. The attacker cannot cause the Resource Authorization Server to accept a grant that its current policy rejects.¶
When the Resource Authorization Server narrows what it accepts, a Grant Issuer that has not refreshed issues grants that the Resource Authorization Server rejects after their claims have been disclosed to the client. Such grants affect availability and disclosure, not authorization.¶
After a relationship ends and disclosure stops (Section 6.2), the Grant Issuer can no longer refresh its installed state. The maximum age that it configures bounds how long it continues to issue grants under that state, but the Resource Authorization Server cannot enforce that bound.¶
To stop issuance at a known time, the Resource Authorization Server ends the relationship only after the Grant Issuer has observed the removal of every eligible tenant (Section 5.5).¶
A Resource Authorization Server that changes the normative semantics of an entry without changing its revision causes the Grant Issuer to continue issuing grants under an approval that no longer matches the entry. The Grant Issuer detects such a change only when it holds an earlier copy of the entry with the same revision (Section 5.1).¶
A revision does not bind the Resource Authorization Server to the meaning that the Grant Issuer approved, and a grant issued before a change can be redeemed after it.¶
Requiring an approval for the installed revision (Section 5.5) avoids relying on a Grant Issuer's comparison of two revisions to decide that a change only narrows an entry. An incorrect comparison would expand the approved subset.¶
If a Grant Issuer derived a grant's target tenant from the number of Tenant Objects in a Relationship View or the form of an issuer identifier, a grant intended for one tenant could be accepted for another (Section 5.4).¶
An entry obtained for one Issuer Relationship is used only for grants whose issuer and issuer tenant identify that relationship (Section 5.4), so that a catalog disclosed to one issuer tenant does not determine the grants issued for subjects of another.¶
If a Resource Authorization Server makes a tenant eligible for an Issuer
Relationship because an administrator of that tenant configured trust in
the Grant Issuer, anyone who controls a tenant at the Resource
Authorization Server can add a Tenant Object, with a display of their
choosing, to the Grant Issuer's Relationship View. If an administrator
of the Grant Issuer approves an entry for that Tenant Object, clients
obtain grants that disclose claims to that tenant.¶
A Resource Authorization Server SHOULD make a tenant eligible for an
Issuer Relationship only when the Onboarding Arrangement records
agreement on the Grant Issuer side, for example by an administrator of
the issuer tenant. An administrator of the Grant Issuer identifies a
Tenant Object by its tenant_id, not by its display
(Section 4.1).¶
A Resource Authorization Server that accepts JWT authorization grants
and catalog access assertions at the same token endpoint relies on the
typ JOSE header parameter to distinguish them
(Section 6.4.1, Section 8.1). Without that check,
a grant could be presented as a catalog access assertion, or a catalog
access assertion as a grant; their claims overlap, and the sub claim
of a catalog access assertion is an issuer identifier.¶
When the client identifier assigned to a Grant Issuer equals its issuer
identifier, a catalog access assertion also has the iss, sub, and
aud values of a client assertion (Section 3 of [RFC7523]). One
intercepted JWT could then serve as both the grant and the client
authentication of a request, and a validator of client assertions that
ignores typ does not prevent this.¶
Section 6.5 forbids using a catalog access assertion as a client assertion and recommends a separate key for client assertions. Section 2.8 of [RFC8725] describes this class of attack. For the same reason, an entry is used only for grants of its own Grant Profile (Section 5.4), even when the grants of another profile carry similar claims.¶
Entries and authorization details types metadata contain URIs that refer
to other servers: the documentation_uri, definition_uri, and
schema_uri members, and the resource of each entry, whose Protected
Resource Metadata the Grant Issuer requests during composition
(Section 5.2). A Resource Authorization Server, or an attacker that
can alter catalog responses, chooses these URIs
(Section 7.7 of [RFC9728]).¶
A Grant Issuer that dereferences these URIs:¶
sends no credential obtained through a retrieval protocol (Section 5.6, Section 6.7);¶
applies the protections against server-side request forgery that it applies to other URLs obtained from external parties; and¶
treats content retrieved from these URIs, which the retrieval protocol does not authenticate, as untrusted input, not as catalog content.¶
A Grant Issuer can cache Protected Resource Metadata and limit how many such requests one refresh makes.¶
A Grant Issuer presents display, description, documentation_uri,
and definition_uri to administrators as untrusted text. These members
can change without a new revision (Section 4.7), so an approval does
not cover later changes to them.¶
A Relationship View can be large. A Grant Issuer SHOULD limit the size of the responses it accepts, and treats a response that exceeds its limits as an incomplete retrieval (Section 5.5). A Resource Authorization Server can limit the rate at which it accepts catalog access assertions and requests to the catalog endpoint from an Issuer Relationship.¶
The privacy considerations of the Grant Profile of each entry, such as [ID-JAG], apply to this specification.¶
A catalog discloses business relationships: which Resource Authorization Server tenants are associated with an issuer tenant, and the names those tenants use. This specification:¶
limits that disclosure to an authenticated and authorized Issuer Relationship (Section 6.2);¶
requires that caches not store Relationship View documents (Section 6.8); and¶
prohibits error responses that reveal other issuers, tenants, or catalogs (Section 6.9).¶
Because an entry states the claims and subject identifier formats that the Resource Authorization Server requires or accepts (Section 4.5.4, Section 4.5.5), an administrator of the Grant Issuer decides before issuance which claims the Grant Issuer releases and to which Resource Authorization Server tenants. An entry that requires a claim does not cause the Grant Issuer to release it without approval (Section 5.4).¶
The Grant Issuer stores catalog content as configuration, protects it like other relationship-specific configuration, and makes it accessible only to administrators who manage the corresponding Issuer Relationship.¶
Dereferencing a URI contained in a catalog, such as a
documentation_uri or definition_uri, can reveal to the server
hosting it that the Grant Issuer has a relationship with the Resource
Authorization Server. A Grant Issuer can avoid such retrieval or perform
it through an intermediary.¶
This specification requests registration of the following value in the "OAuth Authorization Server Metadata" registry established by [RFC8414].¶
authorization_grant_catalog_endpoint¶
URL of the OAuth Authorization Grant Catalog endpoint, which is also the resource indicator for requesting a catalog access token¶
IETF¶
Section 6.3 of this specification¶
This specification requests registration of the following media types in the "Media Types" registry, in the manner described in [RFC6838].¶
application¶
oauth-grant-catalog+json¶
N/A¶
N/A¶
binary; a document of this type is a JSON object [RFC8259] encoded in UTF-8.¶
N/A¶
Section 4.2 and Section 6.7 of this specification¶
Authorization servers that publish an OAuth Authorization Grant Catalog, and authorization servers that retrieve one to issue grants.¶
The syntax and semantics of fragment identifiers specified for
+json in Section 3.1 of [RFC6839] apply.¶
Deprecated alias names for this type: N/A¶
Magic number(s): N/A¶
File extension(s): N/A¶
Macintosh file type code(s): N/A¶
Karl McGuinness, public@karlmcguinness.com¶
COMMON¶
none¶
Karl McGuinness, public@karlmcguinness.com¶
IETF¶
application¶
oauth-grant-catalog-access+jwt¶
N/A¶
N/A¶
binary; a catalog access assertion is a JWT, which is a sequence of base64url-encoded values separated by period (".") characters.¶
N/A¶
Section 6.4 of this specification¶
Authorization servers that request a catalog access token for an OAuth Authorization Grant Catalog, and authorization servers that issue one.¶
N/A¶
Deprecated alias names for this type: N/A¶
Magic number(s): N/A¶
File extension(s): N/A¶
Macintosh file type code(s): N/A¶
Karl McGuinness, public@karlmcguinness.com¶
COMMON¶
none¶
Karl McGuinness, public@karlmcguinness.com¶
IETF¶
The registration of application/oauth-grant-catalog-access+jwt
establishes the typ JOSE header parameter value
oauth-grant-catalog-access+jwt used by catalog access assertions
(Section 6.4).¶
No IANA registry exists for OAuth scope values, and this specification
requests no registration for authorization_grant_catalog.read
(Section 6.5).¶
The following Grant Catalog, from a Relationship View whose
authorization_server is https://ras.example/, has one entry for the
ID-JAG profile (Section 7). Every ID-JAG issued using the entry:¶
is bound to a DPoP key;¶
contains the scope value messages.read, the email claim, and a
sub_id claim in the saml-nameid format; and¶
can also contain the scope value messages.write and authorization
details objects of type message_channel.¶
{
"id": "standard",
"display": "Standard API access",
"entries": [
{
"id": "messages-api-id-jag",
"revision": "5",
"display": "Messages API using ID-JAG",
"profile": "urn:ietf:params:oauth:grant-profile:id-jag",
"resource": "https://api.example/messages",
"scope": {
"requirement": "required",
"values": [
{
"scope": "messages.read",
"requirement": "required",
"display": "Read messages",
"description": "Read messages available to the subject."
},
{
"scope": "messages.write",
"display": "Write messages",
"description": "Create messages as the subject."
}
]
},
"authorization_details": {
"requirement": "optional",
"types": [
{
"type": "message_channel",
"display": "Message channel",
"documentation_uri":
"https://docs.example/rar/message-channel"
}
]
},
"claims": [
{
"claim": "email",
"requirement": "required",
"display": "Email address"
}
],
"sub_id": {
"requirement": "required",
"formats": ["saml-nameid"]
},
"grant_binding": {
"requirement": "required",
"methods": ["dpop"]
}
}
]
}
¶
The Resource Authorization Server https://ras.example/ accepts ID-JAGs
for the protected resource https://api.example/reports that carry
either the scope value reports.read or reports.export, but not both,
and requires the department claim only with reports.export. A single
entry cannot express either rule (Section 4.6), so the Resource
Authorization Server publishes two entries:¶
{
"id": "reports",
"entries": [
{
"id": "reports-read",
"revision": "1",
"profile": "urn:ietf:params:oauth:grant-profile:id-jag",
"resource": "https://api.example/reports",
"scope": {
"requirement": "required",
"values": [
{
"scope": "reports.read",
"requirement": "required"
}
]
}
},
{
"id": "reports-export",
"revision": "1",
"profile": "urn:ietf:params:oauth:grant-profile:id-jag",
"resource": "https://api.example/reports",
"scope": {
"requirement": "required",
"values": [
{
"scope": "reports.export",
"requirement": "required"
}
]
},
"claims": [
{
"claim": "department",
"requirement": "required"
}
]
}
]
}
¶
An administrator of the Grant Issuer approves each entry separately for
each Tenant Object, for example reports-read for two Tenant Objects
and reports-export for only one of them.¶
An ID-JAG issued using reports-read does not contain the department
claim, which that entry does not list (Section 4.5.4). No ID-JAG
contains both scope values, because each grant is issued using exactly
one entry (Section 5.4).¶
An approval of the entry in Appendix A for the Tenant Object
customer-acme-eu changes as the Relationship View changes:¶
The Grant Issuer installs a Relationship View in which
customer-acme-eu references the Grant Catalog standard, whose
entry messages-api-id-jag has the revision 5. An administrator
approves the scope value messages.read for that entry, and the
Grant Issuer issues ID-JAGs with that scope value.¶
A refresh fails with a transport error. The Grant Issuer installs nothing and continues to issue ID-JAGs under the installed state, within the maximum age it has configured (Section 5.5).¶
The Resource Authorization Server removes customer-acme-eu from the
Issuer Relationship. The next refresh retrieves a Relationship View
without it, and the Grant Issuer suspends issuance for
customer-acme-eu (Section 5.5).¶
The Resource Authorization Server restores customer-acme-eu with
the same grant_catalog, and the Grant Catalog still
contains revision 5 of the entry. The approval applies again
without new approval (Section 5.5).¶
The Resource Authorization Server adds the optional scope value
messages.archive to the entry and changes its revision to 6. The
Grant Issuer stops issuing ID-JAGs under the approval for revision
5, even though the change does not affect messages.read
(Section 5.5).¶
An administrator reviews revision 6 and approves messages.read
again. The Grant Issuer resumes issuing ID-JAGs with that scope
value.¶
Deployments differ in the administrative relationship that already exists between a Grant Issuer and a Resource Authorization Server. Objects defined independently of retrieval let any retrieval protocol deliver identical objects to the same Grant Issuer policy.¶
Because each Tenant Object references one Grant Catalog that is neither paged nor merged (Section 4.3, Section 4.4), a Grant Issuer determines what a tenant is offered from one object and cannot mistake a partial retrieval for a complete one.¶
One complete response gives the Grant Issuer one consistent state without a manifest of versions, and makes a withdrawal the absence of an object from a validated response. Compression and conditional requests (Section 6.8) offset the cost of retransmitting the whole view until deployments show a need for incremental retrieval.¶
What a scope value or authorization details type authorizes is the same for every Issuer Relationship, so it belongs in public metadata, such as authority metadata [AUTHORITY-METADATA]. Which scope values and authorization details types a relationship may use is specific to the relationship, so it belongs in the catalog.¶
Entries identify items by the protocol values that authority metadata uses, so the two compose without a mapping.¶
An Authorization Envelope that is a product of independent selections (Section 4.6) can be evaluated without a rule language, and a Grant Issuer cannot misread a rule that does not exist.¶
The format prescribes no canonicalization and leaves the generation of revision values to the Resource Authorization Server, which can use a counter or a digest of the normative semantics. Because a revision is tied to the normative semantics (Section 4.7), the Grant Issuer retains approvals across changes to presentation text.¶
Exempting some optional claims, such as an email address, from listing (Section 4.5.4) would leave their release outside the administrator's approval, with no principled line between them and related claims, such as one that states whether that email address is verified.¶
Limiting a grant to one protected resource (Section 4.6) avoids rules for how scope values and authorization details apply across resources, and keeps each approval about one resource.¶
Stating the Issuer Relationship under the signature of the keys that sign the Grant Issuer's grants (Section 6.4):¶
gives every Resource Authorization Server the same provenance for the relationship;¶
reuses the trust that each Resource Authorization Server already places in the issuer; and¶
binds catalog access to the identity that issues the grants the catalog describes.¶
Authorizing a tenant selector against the relationships permitted to a Grant Issuer authenticated as a client would instead leave each Resource Authorization Server to define its own selector and mapping, and a client credential authorized for many issuer tenants would carry the same broad authority as a shared signing key (Section 9.3).¶
Client identifiers can be shared across trust domains ([CIMD]) or established by registration, and a client inventory (Section 5.4.1) would require additional disclosure policy and synchronization of client registration state. A view for one identified client that the Issuer Relationship is authorized to inspect would disclose no inventory, and could be defined later.¶
RFC Editor: please remove this appendix before publication.¶
Reapproval: whether issuance can continue under an existing approval when an entry changes to a revision whose Authorization Envelope still contains the approved subset, and what a Resource Authorization Server would publish to make that safe (Section 5.5, Appendix C). Tracked as issue #12.¶
Client-facing discovery: whether to define the protected discovery mechanism that Section 9.7 of [ID-JAG] permits, through which an application client retrieves the entries that apply to it. A view of whole entries cannot express a restriction for one client that is narrower than an entry. Tracked as issue #15.¶
Freshness and termination: whether to require a maximum age, or let the Resource Authorization Server publish one, so that it has a deadline after which a Grant Issuer stops issuing under state it cannot refresh (Section 5.5, Section 9.7). Tracked as issue #16.¶
Must-understand extensions: a mechanism, to be added before the format stabilizes, by which an entry marks extension members that a Grant Issuer must implement, so that restrictive extensions need no distinct Grant Profile identifier (Section 8); and whether every extension is to preserve the principles in Section 3. Tracked as issue #19.¶
This specification builds on the Identity Assertion JWT Authorization Grant [ID-JAG] and on the JWT authorization grant [RFC7523].¶