rfc9767.original.xml | rfc9767.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc [ | <!DOCTYPE rfc [ | |||
<!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
<!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
<!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
]> | ]> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | |||
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.5 (Ruby 3.3.0 | -ietf-gnap-resource-servers-09" number="9767" updates="" obsoletes="" submission | |||
) --> | Type="IETF" category="std" consensus="true" tocInclude="true" sortRefs="true" sy | |||
<?rfc tocindent="yes"?> | mRefs="true" version="3" xml:lang="en"> | |||
<?rfc strict="yes"?> | ||||
<?rfc compact="yes"?> | ||||
<?rfc comments="yes"?> | ||||
<?rfc inline="yes"?> | ||||
<?rfc docmapping="yes"?> | ||||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | ||||
-ietf-gnap-resource-servers-09" category="std" consensus="true" tocInclude="true | ||||
" sortRefs="true" symRefs="true" version="3"> | ||||
<!-- xml2rfc v2v3 conversion 3.20.1 --> | ||||
<front> | <front> | |||
<title>Grant Negotiation and Authorization Protocol Resource Server Connecti | <title abbrev="GNAP RS Connections">Grant Negotiation and Authorization Prot | |||
ons</title> | ocol Resource Server Connections</title> | |||
<seriesInfo name="Internet-Draft" value="draft-ietf-gnap-resource-servers-09 | <seriesInfo name="RFC" value="9767"/> | |||
"/> | ||||
<author initials="J." surname="Richer" fullname="Justin Richer" role="editor "> | <author initials="J." surname="Richer" fullname="Justin Richer" role="editor "> | |||
<organization>Bespoke Engineering</organization> | <organization>Bespoke Engineering</organization> | |||
<address> | <address> | |||
<email>ietf@justin.richer.org</email> | <email>ietf@justin.richer.org</email> | |||
<uri>https://bspk.io/</uri> | <uri>https://bspk.io/</uri> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="F." surname="Imbault" fullname="Fabien Imbault"> | <author initials="F." surname="Imbault" fullname="Fabien Imbault"> | |||
<organization>acert.io</organization> | <organization>acert.io</organization> | |||
<address> | <address> | |||
<email>fabien.imbault@acert.io</email> | <email>fabien.imbault@acert.io</email> | |||
<uri>https://acert.io/</uri> | <uri>https://acert.io/</uri> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2024" month="September" day="23"/> | <date year="2025" month="April"/> | |||
<area>Security</area> | <area>SEC</area> | |||
<workgroup>GNAP</workgroup> | <workgroup>gnap</workgroup> | |||
<keyword>Internet-Draft</keyword> | ||||
<abstract> | ||||
<?line 63?> | ||||
<t>GNAP defines a mechanism for delegating authorization to a piece of | <!-- [rfced] Please insert any keywords (beyond those that appear in | |||
software (the client), and conveying the results and artifacts of that delegatio | the title) for use on https://www.rfc-editor.org/search. --> | |||
n | ||||
to the software. | <abstract> | |||
This extension defines methods for resource servers (RS) to connect | <t>The Grant Negotiation and Authorization Protocol (GNAP) defines a mechanism f | |||
with authorization servers (AS) in an interoperable fashion.</t> | or delegating authorization to a piece of | |||
software (the client) and conveying the results and artifacts of that delegation | ||||
to the software. This extension defines methods for resource servers (RSs) to co | ||||
nnect with authorization servers (ASs) in an interoperable fashion.</t> | ||||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<?line 71?> | ||||
<section anchor="introduction"> | <section anchor="introduction"> | |||
<name>Introduction</name> | <name>Introduction</name> | |||
<t>The core GNAP specification (<xref target="GNAP"/>) defines distinct ro les for the authorization | <t>The core GNAP specification <xref target="RFC9635"/> defines distinct r oles for the authorization | |||
server (AS) and the resource server (RS). However, the core specification | server (AS) and the resource server (RS). However, the core specification | |||
does not define how the RS gets answers to important questions, such as whether | does not define how the RS gets answers to important questions, such as whether | |||
a given access token is still valid or what set of access rights the access | a given access token is still valid or what set of access rights the access | |||
token is approved for.</t> | token is approved for.</t> | |||
<t>While it's possible for the AS and RS to be tightly coupled, such as a single | <t>While it's possible for the AS and RS to be tightly coupled, such as a single | |||
deployed server with a shared storage system, GNAP does not presume or require | deployed server with a shared storage system, GNAP does not presume or require | |||
such a tight coupling. It is increasingly common for the AS and RS to be run | such a tight coupling. It is increasingly common for the AS and RS to be run | |||
and managed separately, particularly in cases where a single AS protects multipl e | and managed separately, particularly in cases where a single AS protects multipl e | |||
RS's simultaneously.</t> | RSs simultaneously.</t> | |||
<t>This specification defines a set of RS-facing APIs that an AS can make | <t>This specification defines a set of RS-facing APIs that an AS can make | |||
available for advanced loosely-coupled deployments. Additionally, this document | available for advanced loosely coupled deployments. Additionally, this document | |||
defines a general-purpose model for access tokens, which can be used in | defines a general-purpose model for access tokens, which can be used in | |||
structured, formatted access tokens or in token introspection responses. | structured, formatted access tokens or in token introspection responses. | |||
This specification also defines a method | This specification also defines a method | |||
for an RS to derive a downstream token for calling another chained RS.</t> | for an RS to derive a downstream token for calling another chained RS.</t> | |||
<t>The means of the authorization server issuing | <t>The means for the authorization server to issue the | |||
the access token to the client instance and the means of the client instance | access token to the client instance and the means for the client instance | |||
presenting the access token to the resource server are the subject of the | to present the access token to the resource server are subjects of the | |||
core GNAP specification <xref target="GNAP"/>.</t> | core GNAP specification <xref target="RFC9635"/>.</t> | |||
<section anchor="terminology"> | <section anchor="terminology"> | |||
<name>Terminology</name> | <name>Terminology</name> | |||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp 14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp 14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i nterpreted as | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i nterpreted as | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they | |||
appear in all capitals, as shown here.</t> | appear in all capitals, as shown here.</t> | |||
<?line -18?> | <?line -18?> | |||
<t>This document contains non-normative examples of partial and complete HTTP me | <t>This document contains non-normative examples of partial and complete | |||
ssages, JSON structures, URLs, query components, keys, and other elements. Some | HTTP messages, JSON structures, URLs, query components, keys, and other elements | |||
examples use a single trailing backslash <tt>\</tt> to indicate line wrapping fo | . Some examples use a single trailing backslash <tt>\</tt> to indicate line wrap | |||
r long values, as per <xref target="RFC8792"/>. The <tt>\</tt> character and lea | ping for long values, as per <xref target="RFC8792"/>. The <tt>\</tt> character | |||
ding spaces on wrapped lines are not part of the value.</t> | and leading spaces on wrapped lines are not part of the value.</t> | |||
<t>Terminology specific to GNAP is defined in the terminology section of | ||||
the core specification <xref target="GNAP"/>, and provides definitions for the | <t>Terminology specific to GNAP is defined in the terminology | |||
protocol roles: authorization server (AS), client, resource server (RS), resourc | section of the core specification; see <xref | |||
e owner (RO), end user; as well as the protocol elements: attribute, access toke | target="RFC9635" sectionFormat="of" section="1.1"/>. The following proto | |||
n, grant, privilege, protected resource, right, subject, subject information. Th | col roles are defined: | |||
e same definitions are used in this document.</t> | authorization server, client, end user, resource owner, and resource ser | |||
ver. The following protocol | ||||
elements are defined: access token, attribute, grant, | ||||
privilege, protected resource, right, subject, and subject | ||||
information. The same definitions are used in this | ||||
document.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="structure"> | <section anchor="structure"> | |||
<name>Access Tokens</name> | <name>Access Tokens</name> | |||
<t>Access tokens are a mechanism for an AS to provide a client instance li | <t>Access tokens are used as a mechanism for an AS to provide a | |||
mited access to an RS. | client instance limited access to an RS. These access tokens | |||
These access tokens are artifacts representing a particular set of access rights | are artifacts representing a particular set of access rights | |||
granted to | granted to the client instance to act on behalf of the RO. While | |||
the client instance to act on behalf of the RO. While the format of access token | the format of access tokens varies in different systems (see | |||
s varies in | discussion in <xref target="token-format"/>), the concept of an | |||
different systems (see discussion in <xref target="token-format"/>), the concept | access token is consistent across all GNAP systems.</t> | |||
of an access token is | ||||
consistent across all GNAP systems.</t> | ||||
<section anchor="general-purpose-access-token-model"> | <section anchor="general-purpose-access-token-model"> | |||
<name>General-purpose Access Token Model</name> | <name>General-Purpose Access Token Model</name> | |||
<t>The core GNAP specification <xref target="GNAP"/> focuses on the rela | <t>The core GNAP specification <xref target="RFC9635"/> | |||
tionship between the client and the AS. Since the access token | focuses on the relationship between the client and the | |||
is opaque to the client, the core specification does not define a token model. H | AS. Since the access token is opaque to the client, the core | |||
owever, the AS will need to create | specification does not define a token model. However, the AS | |||
tokens and the RS will need to understand tokens. To facilitate a level of struc | will need to create tokens, and the RS will need to understand | |||
tural interoperability, a common | tokens. To facilitate a level of structural interoperability, | |||
access token model is presented here. | a common access token model is presented here. Access tokens | |||
Access tokens represent a common set of aspects across different GNAP deployment | represent a common set of aspects across different GNAP | |||
s. This list is not intended to be | deployments. This list is not intended to be universal or | |||
universal or comprehensive, but rather serves as guidance to implementers in dev | comprehensive but rather serves as guidance to implementers in | |||
eloping | developing data structures and associated systems across a | |||
data structures and associated systems across a GNAP deployment. These data stru | GNAP deployment. These data structures are communicated | |||
ctures are communicated | between the AS and RS by using either a structured token or an | |||
between the AS and RS either by using a structured token or an API-like mechanis | API-like mechanism such as token introspection (see <xref | |||
m like token introspection (see <xref target="introspection"/>).</t> | target="introspection"/>).</t> | |||
<t>This general-purpose data model does not assume either approach, and | <t>This general-purpose data model does not assume either | |||
in fact both can be used together | approach; in fact, both approaches can be used together to | |||
to convey different pieces of information. Where possible, mappings to the <xref | convey different pieces of information. Where possible, | |||
target="JWT"/> standard format | mappings to the JSON Web Token (JWT) <xref target="RFC7519"/> | |||
are provided for each item in the model.</t> | standard format are provided for each item in the model.</t> | |||
<section anchor="value"> | <section anchor="value"> | |||
<name>Value</name> | <name>Value</name> | |||
<t>All access tokens have a <em>value</em>, which is the string that i s passed on the wire between parties. | <t>All access tokens have a <em>value</em>, which is the string that i s passed on the wire between parties. | |||
In order for different access tokens to be differentiated at runtime, the value of a token needs to be unique | In order for different access tokens to be differentiated at runtime, the value of a token needs to be unique | |||
within a security domain (such as all systems controlled by an AS). Otherwise, t | within a security domain (such as all systems controlled by an AS). Otherwise, t | |||
wo separate tokens would be | wo separate tokens would be confused for each other, which would lead to securit | |||
confused for each other which would lead to security issues. | y issues. | |||
The AS chooses the value, which can be structured as in <xref target="token-form | The AS chooses the value, which can be structured (see <xref target="token-forma | |||
at"/> or unstructured. When the token is | t"/>) or unstructured. When the token is | |||
structured, the token value also has a <em>format</em> known to the AS and RS, a nd the other items | structured, the token value also has a <em>format</em> known to the AS and RS, a nd the other items | |||
in this token model are contained within the token's value in some fashion. | in this token model are contained within the token's value in some fashion. | |||
When the token is unstructured, the values are usually retrieved by the RS using a service | When the token is unstructured, the values are usually retrieved by the RS using a service | |||
like token introspection described in <xref target="introspection"/>.</t> | such as token introspection described in <xref target="introspection"/> | |||
<t>The access token value is conveyed the <tt>value</tt> field of an < | .</t> | |||
tt>access_token</tt> response from <xref section="3.2" sectionFormat="of" target | ||||
="GNAP"/>.</t> | <t>The access token value is conveyed in the <tt>value</tt> field of a | |||
n <tt>access_token</tt> response; see <xref section="3.2" sectionFormat="of" tar | ||||
get="RFC9635"/>.</t> | ||||
<t>The format and content of the access token value is opaque to the c lient software. | <t>The format and content of the access token value is opaque to the c lient software. | |||
While the client software needs to be able to carry and present the access token | While the client software needs to be able to carry and present the access token | |||
value, the client software is never expected nor intended to be able to understa nd | value, the client software is never expected nor intended to be able to understa nd | |||
the token value itself.</t> | the token value itself.</t> | |||
<t>If structured tokens like <xref target="JWT"/> are used, the value of the token might not be stored by the AS. Instead, | <t>If structured tokens like those in <xref target="RFC7519"/> are use d, the value of the token might not be stored by the AS. Instead, | |||
a token identifier can be used along with protection by an AS-generated signatur e to validate and | a token identifier can be used along with protection by an AS-generated signatur e to validate and | |||
identify an individual token.</t> | identify an individual token.</t> | |||
</section> | </section> | |||
<section anchor="issuer"> | <section anchor="issuer"> | |||
<name>Issuer</name> | <name>Issuer</name> | |||
<t>The access token is issued by the AS as defined by <xref target="GN AP"/>. The AS will | <t>The access token is issued by the AS as defined in <xref target="RF C9635"/>. The AS will | |||
need to identify itself in order to allow an RS to recognize tokens that the AS has issued, particularly | need to identify itself in order to allow an RS to recognize tokens that the AS has issued, particularly | |||
in cases where tokens from multiple different AS's could be presented to the sam | in cases where tokens from multiple different ASs could be presented to the same | |||
e RS.</t> | RS.</t> | |||
<t>This information is not usually conveyed directly to the client ins | <t>This information is not usually conveyed directly to the client instance, sin | |||
tance, since the client | ce the client instance should know this information based on where it receives t | |||
instance should know this information based on where it receives the token from. | he token from.</t> | |||
</t> | ||||
<t>In a <xref target="JWT"/> formatted token or a token introspection | <t>In the payload of a JSON Web Token <xref target="RFC7519"/> or a to | |||
response, this corresponds to the <tt>iss</tt> claim.</t> | ken introspection response, this corresponds to the <tt>iss</tt> claim.</t> | |||
</section> | </section> | |||
<section anchor="audience"> | <section anchor="audience"> | |||
<name>Audience</name> | <name>Audience</name> | |||
<t>The access token is intended for use at one or more RS's. The AS ca | <t>The access token is intended for use at one or more RSs. The AS can | |||
n list a token's intended RS's | list a token's intended RSs to allow each RS to ensure that the RS is not recei | |||
to allow each RS to ensure that the RS is not receiving a token intended for som | ving a token intended for someone else. | |||
eone else. | ||||
The AS and RS have to agree on the nature of any audience identifiers represente d by the token, | The AS and RS have to agree on the nature of any audience identifiers represente d by the token, | |||
but the URIs of the RS are a common pattern.</t> | but the URIs of the RS are a common pattern.</t> | |||
<t>In a <xref target="JWT"/> formatted token or token introspection re sponse, this corresponds to the <tt>aud</tt> claim.</t> | <t>In the payload of a JSON Web Token <xref target="RFC7519"/> or toke n introspection response, this corresponds to the <tt>aud</tt> claim.</t> | |||
<t>In cases where more complex access is required, the <tt>location</t t> field of objects in the <tt>access</tt> | <t>In cases where more complex access is required, the <tt>location</t t> field of objects in the <tt>access</tt> | |||
array can also convey audience information. | array can also convey audience information. | |||
In such cases, the client instance might need to know the audience information i n order to differentiate between | In such cases, the client instance might need to know the audience information i n order to differentiate between | |||
possible RS's to present the token to.</t> | possible RSs to present the token to.</t> | |||
</section> | </section> | |||
<section anchor="key-binding"> | <section anchor="key-binding"> | |||
<name>Key Binding</name> | <name>Key Binding</name> | |||
<t>Access tokens in GNAP are bound to the client instance's registered or presented key, except in | <t>Access tokens in GNAP are bound to the client instance's registered or presented key, except in | |||
cases where the access token is a bearer token. For all tokens bound to a key, t he AS and RS need to | cases where the access token is a bearer token. For all tokens bound to a key, t he AS and RS need to | |||
be able to identify which key the token is bound to, otherwise an attacker could substitute their | be able to identify which key the token is bound to; otherwise, an attacker coul d substitute their | |||
own key during presentation of the token. In the case of an asymmetric algorithm , the | own key during presentation of the token. In the case of an asymmetric algorithm , the | |||
AS and RS needs to know only the public key, while the client instance will also need to know the private | AS and RS need to know only the public key, while the client instance will also need to know the private | |||
key in order to present the token. In the case of a symmetric algorithm, all par ties | key in order to present the token. In the case of a symmetric algorithm, all par ties | |||
will need to either know or be able to derive the shared key.</t> | will need to either know or be able to derive the shared key.</t> | |||
<t>The source of this key information can vary depending on deployment decisions. For example, an AS | <t>The source of this key information can vary depending on deployment decisions. For example, an AS | |||
could decide that all tokens issued to a client instance are always bound to tha t client instance's current key. | could decide that all tokens issued to a client instance are always bound to tha t client instance's current key. | |||
When the key needs to be dereferenced, the AS looks up the client instance to wh ich the token was issued | When the key needs to be dereferenced, the AS looks up the client instance to wh ich the token was issued | |||
and finds the key information there. | and finds the key information there. Alternatively, the AS could bind each token | |||
The AS could alternatively bind each token to a specific key that is managed sep | to a specific key that is managed separately from client instance | |||
arately from client instance | ||||
information. In such a case, the AS determines the key information directly. Thi s approach allows the client | information. In such a case, the AS determines the key information directly. Thi s approach allows the client | |||
instance to use a different key for each request, or allows the AS to issue a ke y for the client instance | instance to use a different key for each request or allows the AS to issue a key for the client instance | |||
to use with the particular token.</t> | to use with the particular token.</t> | |||
<t>In all cases, the key binding also includes a proofing mechanism, a long with any parameters needed for that | <t>In all cases, the key binding also includes a proofing mechanism, a long with any parameters needed for that | |||
mechanism such as a signing or digest algorithm. If such information is not incl uded with the proofing key, an attacker could | mechanism such as a signing or digest algorithm. If such information is not incl uded with the proofing key, an attacker could | |||
present a token with a seemingly-valid key using an insecure and incorrect proof | present a token with a seemingly valid key using an insecure and incorrect proof | |||
ing mechanism.</t> | ing mechanism.</t> | |||
<t>This value is conveyed to the client instance in the <tt>key</tt> f | <t>This value is conveyed to the client instance in the <tt>key</tt> f | |||
ield of the <tt>access_token</tt> response in <xref section="3.2" sectionFormat= | ield of the <tt>access_token</tt> response in <xref section="3.2" sectionFormat= | |||
"of" target="GNAP"/>. | "of" target="RFC9635"/>. | |||
Since the common case is that the token is bound to the client instance's regist ered key, this field can be omitted in this case | Since the common case is that the token is bound to the client instance's regist ered key, this field can be omitted in this case | |||
since the client will be aware of its own key.</t> | since the client will be aware of its own key.</t> | |||
<t>In a <xref target="JWT"/> formatted token, this corresponds to the | <t>In the payload of a JSON Web Token <xref target="RFC7519"/>, this c | |||
<tt>cnf</tt> (confirmation) claim. In a token introspection response, this corre | orresponds to the <tt>cnf</tt> (confirmation) claim. In a token introspection re | |||
sponds to the <tt>key</tt> claim.</t> | sponse, this corresponds to the <tt>key</tt> claim.</t> | |||
<t>In the case of a bearer token, all parties need to know that a toke | <t>In the case of a bearer token, all parties need to know that a toke | |||
n has no key bound to it, and will therefore | n has no key bound to it and will therefore reject any attempts to use the beare | |||
reject any attempts to use the bearer token with a key in an undefined way.</t> | r token with a key in an undefined way.</t> | |||
</section> | </section> | |||
<section anchor="flags"> | <section anchor="flags"> | |||
<name>Flags</name> | <name>Flags</name> | |||
<t>GNAP access tokens can have multiple data flags associated with the | ||||
m that indicate special | <t>GNAP access tokens can have multiple associated data | |||
processing or considerations for the token. For example, whether the token is a | flags that indicate special processing or considerations for | |||
bearer token, | a token. For example, the data flags can indicate whether | |||
or should be expected to be durable across grant updates.</t> | a token is a bearer token or should be expected to be | |||
<t>The client can request a set of flags using the <tt>flags</tt> fiel | durable across grant updates.</t> | |||
d of the <tt>access_token</tt> grant request parameter in <xref section="2.1.1" | <t>The client can request a set of flags using the <tt>flags</tt> fiel | |||
sectionFormat="of" target="GNAP"/>.</t> | d of the <tt>access_token</tt> grant request parameter in <xref section="2.1.1" | |||
<t>These flags are conveyed from the AS to the client in the <tt>flags | sectionFormat="of" target="RFC9635"/>.</t> | |||
</tt> field of the <tt>access_token</tt> section of the grant response in <xref | <t>These flags are conveyed from the AS to the client in the <tt>flags | |||
section="3.2" sectionFormat="of" target="GNAP"/>.</t> | </tt> field of the <tt>access_token</tt> section of the grant response in <xref | |||
section="3.2" sectionFormat="of" target="RFC9635"/>.</t> | ||||
<t>For token introspection, flags are returned in the <tt>flags</tt> f ield of the response.</t> | <t>For token introspection, flags are returned in the <tt>flags</tt> f ield of the response.</t> | |||
</section> | </section> | |||
<section anchor="access-rights"> | <section anchor="access-rights"> | |||
<name>Access Rights</name> | <name>Access Rights</name> | |||
<t>Access tokens are tied to a limited set of access rights. These rig hts specify in some detail what the token | <t>Access tokens are tied to a limited set of access rights. These rig hts specify in some detail what the token | |||
can be used for, how, and where. The internal structure of access rights are det ailed in <xref section="8" sectionFormat="of" target="GNAP"/>.</t> | can be used for, how it can be used, and where it can be used. The internal stru cture of access rights is detailed in <xref section="8" sectionFormat="of" targe t="RFC9635"/>.</t> | |||
<t>The access rights associated with an access token are calculated fr om the rights available to the client | <t>The access rights associated with an access token are calculated fr om the rights available to the client | |||
instance making the request, the rights available to be approved by the RO, the rights actually approved | instance making the request, the rights available to be approved by the RO, the rights actually approved | |||
by the RO, and the rights corresponding to the RS in question. The rights for a specific access token | by the RO, and the rights corresponding to the RS in question. The rights for a specific access token | |||
are a subset of the overall rights in a grant request.</t> | are a subset of the overall rights in a grant request.</t> | |||
<t>These rights are requested by the client instance in the <tt>access | <t>These rights are requested by the client instance in the <tt>access | |||
</tt> field of the <tt>access_token</tt> request in <xref section="2.1" sectionF | </tt> field of the <tt>access_token</tt> request; see <xref section="2.1" sectio | |||
ormat="of" target="GNAP"/>.</t> | nFormat="of" target="RFC9635"/>.</t> | |||
<t>The rights associated with an issued access token are conveyed to t | <t>The rights associated with an issued access token are conveyed to t | |||
he client instance in the <tt>access</tt> field of the <tt>access_token</tt> res | he client instance in the <tt>access</tt> field of the <tt>access_token</tt> res | |||
ponse in <xref section="3.2" sectionFormat="of" target="GNAP"/>.</t> | ponse in <xref section="3.2" sectionFormat="of" target="RFC9635"/>.</t> | |||
<t>In token introspection responses, this corresponds to the <tt>acces | <t>In token introspection responses, access rights correspond to the < | |||
s</tt> claim.</t> | tt>access</tt> claim.</t> | |||
</section> | </section> | |||
<section anchor="time-validity-window"> | <section anchor="time-validity-window"> | |||
<name>Time Validity Window</name> | <name>Time Validity Window</name> | |||
<t>The access token can be limited to a certain time window outside of which it is no longer | <t>The access token can be limited to a certain time window outside of which it is no longer | |||
valid for use at an RS. This window can be explicitly bounded by an expiration t ime and a | valid for use at an RS. This window can be explicitly bounded by an expiration t ime and a | |||
not-before time, or it could be calculated based on the issuance time of the tok en. For example, | not-before time, or it could be calculated based on the issuance time of the tok en. For example, | |||
an RS could decide that it will accept tokens for most calls within an hour of a token's | an RS could decide that it will accept tokens for most calls within an hour of a token's | |||
issuance, but only within five minutes of the token's issuance for certain high- value calls.</t> | issuance, but only within five minutes of the token's issuance for certain high- value calls.</t> | |||
<t>Since access tokens could be revoked at any time for any reason out side of a client instance's control, | <t>Since access tokens could be revoked at any time for any reason out side of a client instance's control, | |||
the client instance often does not know or concern itself with the validity time window of | the client instance often does not know or concern itself with the validity time window of | |||
an access token. However, this information can be made available to it using the | an access token. However, this information can be made available to it by using | |||
<tt>expires_in</tt> field | the <tt>expires_in</tt> field | |||
of an access token response in <xref section="3.2" sectionFormat="of" target="GN | of an access token response; see <xref section="3.2" sectionFormat="of" target=" | |||
AP"/>.</t> | RFC9635"/>.</t> | |||
<t>The issuance time of the token is conveyed in the <tt>iat</tt> clai | <t>The issuance time of the token is conveyed in the <tt>iat</tt> clai | |||
m of a <xref target="JWT"/> formatted token or a token introspection response.</ | m in the payload of a JSON Web Token <xref target="RFC7519"/> or a token introsp | |||
t> | ection response.</t> | |||
<t>The expiration time of a token, after which it is to be rejected, i | <t>The expiration time of a token, after which it is to be rejected, i | |||
s conveyed in the <tt>exp</tt> claim of a <xref target="JWT"/> formatted token o | s conveyed in the <tt>exp</tt> claim in the payload of a JSON Web Token <xref ta | |||
r a token introspection response.</t> | rget="RFC7519"/> or a token introspection response.</t> | |||
<t>The starting time of a token's validity window, before which it is | <t>The starting time of a token's validity window, before which it is | |||
to be rejected, is conveyed in the <tt>nbf</tt> claim of a <xref target="JWT"/> | to be rejected, is conveyed in the <tt>nbf</tt> claim in the payload of a JSON W | |||
formatted token or a token introspection response.</t> | eb Token <xref target="RFC7519"/> or a token introspection response.</t> | |||
</section> | </section> | |||
<section anchor="token-identifier"> | <section anchor="token-identifier"> | |||
<name>Token Identifier</name> | <name>Token Identifier</name> | |||
<t>Individual access tokens often need a unique internal identifier to allow the AS to differentiate | <t>Individual access tokens often need a unique internal identifier to allow the AS to differentiate | |||
between multiple separate tokens. This value of the token can often be used as t he | between multiple separate tokens. This value of the token can often be used as t he | |||
identifier, but in some cases a separate identifier is used.</t> | identifier, but in some cases, a separate identifier is used.</t> | |||
<t>This separate identifier can be conveyed in the <tt>jti</tt> claim | <t>This separate identifier can be conveyed in the <tt>jti</tt> claim | |||
of a <xref target="JWT"/> formatted token or a token introspection response.</t> | in the payload of a JSON Web Token <xref target="RFC7519"/> or a token introspec | |||
<t>This identifier is not usually exposed to the client instance using | tion response.</t> | |||
the token, since the client | <t>This identifier is not usually exposed to the client instance using | |||
the token, because the client | ||||
instance only needs to use the token by value.</t> | instance only needs to use the token by value.</t> | |||
</section> | </section> | |||
<section anchor="authorizing-resource-owner"> | <section anchor="authorizing-resource-owner"> | |||
<name>Authorizing Resource Owner</name> | <name>Authorizing Resource Owner</name> | |||
<t>Access tokens are approved on behalf of a resource owner (RO). The identity of this RO can be used by | <t>Access tokens are approved on behalf of a resource owner (RO). The identity of this RO can be used by | |||
the RS to determine exactly which resource to access, or which kinds of access t o allow. For example, | the RS to determine exactly which resource to access or which kinds of access to allow. For example, | |||
an access token used to access identity information can hold a user identifier t o allow the RS to | an access token used to access identity information can hold a user identifier t o allow the RS to | |||
determine which profile information to return. The nature of this information is subject to agreement | determine which profile information to return. The nature of this information is subject to agreement | |||
by the AS and RS.</t> | by the AS and RS.</t> | |||
<t>This corresponds to the <tt>sub</tt> claim of a <xref target="JWT"/ > formatted token or a token introspection response.</t> | <t>This corresponds to the <tt>sub</tt> claim in the payload of a JSON Web Token <xref target="RFC7519"/> or a token introspection response.</t> | |||
<t>Detailed RO information is not returned to the client instance | <t>Detailed RO information is not returned to the client instance | |||
when an access token is requested alone, and in many cases returning | when an access token is requested alone, and in many cases, returning | |||
this information to the client instance would be a privacy violation on the part of the AS. Since the | this information to the client instance would be a privacy violation on the part of the AS. Since the | |||
access token represents a specific delegated access, the client instance needs o nly to use the token | access token represents a specific delegated access, the client instance needs o nly to use the token | |||
at its target RS. Following the profile example, the client instance does not ne ed to know | at its target RS. Following the profile example, the client instance does not ne ed to know | |||
the account identifier to get specific attributes about the account represented by the token.</t> | the account identifier to get specific attributes about the account represented by the token.</t> | |||
<t>GNAP does allow for the return of subject information separately fr om the access token, in the form | <t>GNAP does allow for the return of subject information separately fr om the access token, in the form | |||
of identifiers and assertions. These values are returned directly to the client separately from any | of identifiers and assertions. These values are returned directly to the client separately from any | |||
access tokens that are requested, though it's common that they represent the sam e party.</t> | access tokens that are requested, though it's common that they represent the sam e party.</t> | |||
</section> | </section> | |||
<section anchor="end-user"> | <section anchor="end-user"> | |||
<name>End User</name> | <name>End User</name> | |||
skipping to change at line 255 ¶ | skipping to change at line 265 ¶ | |||
The token model should be able to reflect these kinds of situations by represent ing the end user | The token model should be able to reflect these kinds of situations by represent ing the end user | |||
and RO separately. | and RO separately. | |||
For example, an end user can request a financial payment, but the RO is the hold er of the account | For example, an end user can request a financial payment, but the RO is the hold er of the account | |||
that the payment would be withdrawn from. The RO would be consulted for approval by the AS outside | that the payment would be withdrawn from. The RO would be consulted for approval by the AS outside | |||
of the flow of the GNAP request. A token in such circumstances would need to sho w both the | of the flow of the GNAP request. A token in such circumstances would need to sho w both the | |||
RO and end user as separate entities.</t> | RO and end user as separate entities.</t> | |||
</section> | </section> | |||
<section anchor="client-instance"> | <section anchor="client-instance"> | |||
<name>Client Instance</name> | <name>Client Instance</name> | |||
<t>Access tokens are issued to a specific client instance by the AS. T he identity of this instance can | <t>Access tokens are issued to a specific client instance by the AS. T he identity of this instance can | |||
be used by the RS to allow specific kinds of access, or other attributes about t he access token. | be used by the RS to allow specific kinds of access or other attributes about th e access token. | |||
For example, an AS that binds all access tokens issued to a particular client in stance to that | For example, an AS that binds all access tokens issued to a particular client in stance to that | |||
client instance's most recent key rotation would need to be able to look up the client instance | client instance's most recent key rotation would need to be able to look up the client instance | |||
in order to find the key binding detail.</t> | in order to find the key binding detail.</t> | |||
<t>This corresponds to the <tt>client_id</tt> claim of a <xref target= "JWT"/> formatted token or the <tt>instance_id</tt> field of a token introspecti on response.</t> | <t>This corresponds to the <tt>client_id</tt> claim in the payload of a JSON Web Token <xref target="RFC7519"/> or the <tt>instance_id</tt> field of a token introspection response.</t> | |||
<t>The client is not normally informed of this information separately, since a client instance can | <t>The client is not normally informed of this information separately, since a client instance can | |||
usually correctly assume that it is the client instance to which a token that | usually correctly assume that it is the client instance to which a token that | |||
it receives was issued.</t> | it receives was issued.</t> | |||
</section> | </section> | |||
<section anchor="label"> | <section anchor="label"> | |||
<name>Label</name> | <name>Label</name> | |||
<t>When multiple access tokens are requested or a client instance uses token labels, the parties | <t>When multiple access tokens are requested or a client instance uses token labels, the parties | |||
will need to keep track of which labels were applied to each individual token. S ince labels can | will need to keep track of which labels were applied to each individual token. S ince labels can | |||
be re-used across different grant requests, the token label alone is not suffici ent to | be reused across different grant requests, the token label alone is not sufficie nt to | |||
uniquely identify a given access token in a system. However, within the context of a grant | uniquely identify a given access token in a system. However, within the context of a grant | |||
request, these labels are required to be unique.</t> | request, these labels are required to be unique.</t> | |||
<t>A client instance can request a specific label using the <tt>label< | <t>A client instance can request a specific label using the <tt>label< | |||
/tt> field of an <tt>access_token</tt> request in <xref section="2.1" sectionFor | /tt> field of an <tt>access_token</tt> request; see <xref section="2.1" sectionF | |||
mat="of" target="GNAP"/>.</t> | ormat="of" target="RFC9635"/>.</t> | |||
<t>The AS can inform the client instance of a token's label using the | <t>The AS can inform the client instance of a token's label using the | |||
<tt>label</tt> field of an <tt>access_token</tt> response in <xref section="3.2" | <tt>label</tt> field of an <tt>access_token</tt> response; see <xref section="3. | |||
sectionFormat="of" target="GNAP"/>.</t> | 2" sectionFormat="of" target="RFC9635"/>.</t> | |||
<t>This corresponds to the <tt>label</tt> field of a token introspecti on response.</t> | <t>This corresponds to the <tt>label</tt> field of a token introspecti on response.</t> | |||
</section> | </section> | |||
<section anchor="parent-grant-request"> | <section anchor="parent-grant-request"> | |||
<name>Parent Grant Request</name> | <name>Parent Grant Request</name> | |||
<t>All access tokens are issued in the context of a specific grant req uest from a client instance. The | <t>All access tokens are issued in the context of a specific grant req uest from a client instance. The | |||
grant request itself represents a unique tuple of:</t> | grant request itself represents a unique tuple of:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>The AS processing the grant request</t> | <t>The AS processing the grant request</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The client instance making the grant request</t> | <t>The client instance making the grant request</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The RO (or set of RO's) approving the grant request (or needing to approve it)</t> | <t>The RO (or set of ROs) approving the grant request (or needing to approve it)</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The access rights granted by the RO</t> | <t>The access rights granted by the RO</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The current state of the grant request, as defined in <xref sec tion="1.5" sectionFormat="of" target="GNAP"/></t> | <t>The current state of the grant request, as defined in <xref sec tion="1.5" sectionFormat="of" target="RFC9635"/></t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<t>The AS can use this information to tie common information to a spec ific token. For instance, | <t>The AS can use this information to tie common information to a spec ific token. For instance, | |||
instead of specifying a client instance for every issued access token for a gran t, the AS | instead of specifying a client instance for every issued access token for a gran t, the AS | |||
can store the client information in the grant itself and look it up by reference from the | can store the client information in the grant itself and look it up by reference from the | |||
access token.</t> | access token.</t> | |||
<t>The AS can also use this information when a grant request is update d. For example, if the client | <t>The AS can also use this information when a grant request is update d. For example, if the client | |||
instance asks for a new access token from an existing grant, the AS can use this link to revoke | instance asks for a new access token from an existing grant, the AS can use this link to revoke | |||
older non-durable access tokens that had been previously issued under the grant. </t> | older non-durable access tokens that had been previously issued under the grant. </t> | |||
<t>A client instance will have its own model of an ongoing grant reque st, especially if that | <t>A client instance will have its own model of an ongoing grant reque st, especially if that | |||
grant request can be continued using the API defined in <xref section="5" sectio nFormat="of" target="GNAP"/> where several | grant request can be continued using the API defined in <xref section="5" sectio nFormat="of" target="RFC9635"/> where several | |||
pieces of statefulness need to be kept in hand. The client instance might need t o keep an | pieces of statefulness need to be kept in hand. The client instance might need t o keep an | |||
association with the grant request that issued the token in case the access toke n expires or | association with the grant request that issued the token in case the access toke n expires or | |||
does not have sufficient access rights, so that the client instance can get a ne w access | does not have sufficient access rights, so that the client instance can get a ne w access | |||
token without having to restart the grant request process from scratch.</t> | token without having to restart the grant request process from scratch.</t> | |||
<t>Since the grant itself does not need to be identified in any of the protocol messages, GNAP | <t>Since the grant itself does not need to be identified in any of the protocol messages, GNAP | |||
does not define a specific grant identifier to be conveyed between any parties i n the protocol. | does not define a specific grant identifier to be conveyed between any parties i n the protocol. | |||
Only the AS needs to keep an explicit connection between an issued access token and the | Only the AS needs to keep an explicit connection between an issued access token and the | |||
parent grant that issued it.</t> | parent grant that issued it.</t> | |||
</section> | </section> | |||
<section anchor="as-specific-access-tokens"> | <section anchor="as-specific-access-tokens"> | |||
<name>AS-Specific Access Tokens</name> | <name>AS-Specific Access Tokens</name> | |||
<t>When an access token is used for the grant continuation API defined | ||||
in <xref section="5" sectionFormat="of" target="GNAP"/> (the continuation acces | <t>When an access token is used for the grant continuation API defined | |||
s token) | in <xref section="5" sectionFormat="of" target="RFC9635"/> (the continuation ac | |||
the token management API defined in <xref section="6" sectionFormat="of" target= | cess token), | |||
"GNAP"/> (the token management access token), | the token management API defined in <xref section="6" sectionFormat="of" target= | |||
"RFC9635"/> (the token management access token), | ||||
or the RS-facing API defined in <xref target="rs-facing-api"/> (the resource ser ver management access token), | or the RS-facing API defined in <xref target="rs-facing-api"/> (the resource ser ver management access token), | |||
the AS <bcp14>MUST</bcp14> separate these access tokens from others usable at RS 's. The AS can | the AS <bcp14>MUST</bcp14> separate these access tokens from other access tokens used at one or more RSs. The AS can | |||
do this through the use of a flag on the access token data structure, by using a special internal | do this through the use of a flag on the access token data structure, by using a special internal | |||
access right, or any other means at its disposal. Just like other access tokens in GNAP, | access right, or any other means at its disposal. Just like other access tokens in GNAP, | |||
the contents of these AS-specific access tokens are opaque to the software prese nting the token. | the contents of these AS-specific access tokens are opaque to the software prese nting the token. | |||
Unlike other access tokens, the contents of these AS-specific access tokens are | Unlike other access tokens, the contents of these AS-specific access to | |||
also opaque to the RS.</t> | kens are also opaque to the RS.</t> | |||
<t>The client instance is given continuation access tokens only as par t of the <tt>continue</tt> field | <t>The client instance is given continuation access tokens only as par t of the <tt>continue</tt> field | |||
of the grant response in <xref section="3.1" sectionFormat="of" target="GNAP"/>. | of the grant response in <xref section="3.1" sectionFormat="of" target="RFC9635" />. | |||
The client instance is given token management access tokens only as part of the <tt>manage</tt> field | The client instance is given token management access tokens only as part of the <tt>manage</tt> field | |||
of the grant response in <xref section="3.1.2" sectionFormat="of" target="GNAP"/ >. | of the grant response in <xref section="3.2.1" sectionFormat="of" target="RFC963 5"/>. | |||
The means by which the RS is given resource server management access tokens is o ut of | The means by which the RS is given resource server management access tokens is o ut of | |||
scope of this specification, but methods could include pre-configuration of the | scope of this specification, but methods could include preconfiguration of the t | |||
token value with | oken value with | |||
the RS software or granting the access token through a standard GNAP process.</t | the RS software or granting the access token through a standard GNAP pr | |||
> | ocess.</t> | |||
<t>For continuation access tokens and token management access tokens, | <t>For continuation access tokens and token management access tokens, | |||
a client instance <bcp14>MUST</bcp14> take steps to differentiate these special- purpose access tokens from | a client instance <bcp14>MUST</bcp14> take steps to differentiate these special- purpose access tokens from | |||
access tokens used at RS's. | access tokens used at one or more RSs. | |||
To facilitate this, a client instance can store AS-specific access tokens separa tely from | To facilitate this, a client instance can store AS-specific access tokens separa tely from | |||
other access tokens in order to keep them from being confused with each other an d used at the | other access tokens in order to keep them from being confused with each other an d used at the | |||
wrong endpoints.</t> | wrong endpoints.</t> | |||
<t>An RS should never see an AS-specific access token presented, so an y attempts to process one <bcp14>MUST</bcp14> | <t>An RS should never see an AS-specific access token presented, so an y attempts to process one <bcp14>MUST</bcp14> | |||
fail. When introspection is used, the AS <bcp14>MUST NOT</bcp14> return an <tt>a ctive</tt> value of <tt>true</tt> for | fail. When introspection is used, the AS <bcp14>MUST NOT</bcp14> return an <tt>a ctive</tt> value of <tt>true</tt> for | |||
AS-specific access tokens to the RS. If an AS implements its protected endpoints in such a way | AS-specific access tokens to the RS. If an AS implements its protected endpoints in such a way | |||
as it uses token introspection internally, the AS <bcp14>MUST</bcp14> differenti ate these AS-specific access tokens | that it uses token introspection internally, the AS <bcp14>MUST</bcp14> differen tiate these AS-specific access tokens | |||
from those issued for use at an external RS.</t> | from those issued for use at an external RS.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="token-format"> | <section anchor="token-format"> | |||
<name>Access Token Formats</name> | <name>Access Token Formats</name> | |||
<t>When the AS issues an access token for use at an RS, the RS | <t>When the AS issues an access token for use at an RS, the RS | |||
needs to have some means of understanding what the access token is for | needs to have some means of understanding what the access token is for | |||
in order to determine how to respond to the request. The core GNAP | in order to determine how to respond to the request. The core GNAP | |||
protocol makes neither assumptions nor demands on the format or contents | protocol makes neither assumptions nor demands on the format or contents | |||
of the access token, and in fact, the token format and contents are opaque | of the access token, and in fact, the token format and contents are opaque | |||
skipping to change at line 363 ¶ | skipping to change at line 376 ¶ | |||
<t>Self-contained structured token formats allow for the conveyance | <t>Self-contained structured token formats allow for the conveyance | |||
of information between the AS and RS without requiring the RS to | of information between the AS and RS without requiring the RS to | |||
call the AS at runtime as described in <xref target="introspection"/>. Structure d tokens | call the AS at runtime as described in <xref target="introspection"/>. Structure d tokens | |||
can also be used in combination with introspection, allowing the token itself | can also be used in combination with introspection, allowing the token itself | |||
to carry one class of information and the introspection response to carry | to carry one class of information and the introspection response to carry | |||
another.</t> | another.</t> | |||
<t>Some token formats, such as Macaroons <xref target="MACAROON"/> and B iscuits <xref target="BISCUIT"/>, allow for | <t>Some token formats, such as Macaroons <xref target="MACAROON"/> and B iscuits <xref target="BISCUIT"/>, allow for | |||
the RS to derive sub-tokens without having to call the AS | the RS to derive sub-tokens without having to call the AS | |||
as described in <xref target="token-chaining"/>.</t> | as described in <xref target="token-chaining"/>.</t> | |||
<t>The supported token formats can be communicated dynamically at runtim e | <t>The supported token formats can be communicated dynamically at runtim e | |||
between the AS and RS in several places.</t> | between the AS and RS in several places:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>The AS can declare its supported token formats as part of RS-faci ng discovery <xref target="discovery"/></t> | <t>The AS can declare its supported token formats as part of RS-faci ng discovery (<xref target="discovery"/>).</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The RS can require a specific token format be used to access a re gistered resource set <xref target="rs-register-resource-handle"/></t> | <t>The RS can require a specific token format be used to access a re gistered resource set (<xref target="rs-register-resource-handle"/>).</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The AS can return the token's format in an introspection response <xref target="introspection"/></t> | <t>The AS can return the token's format in an introspection response (<xref target="introspection"/>).</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<t>In all places where the token format is listed explicitly, it <bcp14> MUST</bcp14> be one of the registered | <t>In all places where the token format is listed explicitly, it <bcp14> MUST</bcp14> be one of the registered | |||
values in the GNAP Token Formats Registry <xref target="IANA-token-format"/>.</t > | values in the "GNAP Token Formats" registry <xref target="IANA-token-format"/>.< /t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="rs-facing-api"> | <section anchor="rs-facing-api"> | |||
<name>Resource-Server-Facing API</name> | <name>Resource-Server-Facing API</name> | |||
<t>To facilitate runtime and dynamic connections with an RS, the AS can of fer an | <t>To facilitate runtime and dynamic connections with an RS, the AS can of fer an | |||
RS-Facing API consisting of one or more of the following optional | RS-facing API consisting of one or more of the following optional | |||
pieces.</t> | pieces:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>Discovery</t> | <t>Discovery</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>Introspection</t> | <t>Introspection</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>Token chaining</t> | <t>Token chaining</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>Resource reference registration</t> | <t>Resource reference registration</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="discovery"> | <section anchor="discovery"> | |||
<name>RS-facing AS Discovery</name> | <name>RS-Facing AS Discovery</name> | |||
<t>A GNAP AS offering RS-facing services can publish its features | <t>A GNAP AS offering RS-facing services can publish its features | |||
on a well-known discovery document at the URL with the same | on a well-known discovery document at the URL with the same | |||
schema and authority as the grant request endpoint URL, at | schema and authority as the grant request endpoint URL, at | |||
the path <tt>/.well-known/gnap-as-rs</tt>.</t> | the path <tt>/.well-known/gnap-as-rs</tt>.</t> | |||
<t>The discovery response is a JSON document <xref target="RFC8259"/> co nsisting of a single JSON | <t>The discovery response is a JSON document <xref target="RFC8259"/> co nsisting of a single JSON | |||
object with the following fields:</t> | object with the following fields:</t> | |||
<dl> | ||||
<dl spacing="normal" newline="false"> | ||||
<!--[rfced] Please note the mismatch here between | ||||
"array of strings" vs. "string". | ||||
As both of these seem to be regarding the "GNAP Resource Set Registration | ||||
Request Parameters" registry (as opposed to the "GNAP RS-Facing Discovery | ||||
Document Fields" registry), should Section 3.4 be updated to "string" to match | ||||
the registry? | ||||
Section 3.4 | ||||
token_formats_supported (array of strings): | ||||
vs. | ||||
Section 5.6.2: | ||||
token_formats_supported | string | Section 3.4 | ||||
[IANA ACTION]: Section 5.6.2 should be updated to be “array of | ||||
strings” and the corresponding entry in the IANA registry will need to | ||||
be updated as well (it currently is registered as “string” at | ||||
https://www.iana.org/assignments/gnap/gnap.xhtml#gnap-resource-set- | ||||
registration-request-parameters | ||||
--> | ||||
<dt>grant_request_endpoint (string):</dt> | <dt>grant_request_endpoint (string):</dt> | |||
<dd> | <dd> | |||
<t>The location of the AS's grant request endpoint defined by <xref | <t>The location of the AS's grant request endpoint defined by <xref | |||
section="9" sectionFormat="of" target="GNAP"/>. | section="9" sectionFormat="of" target="RFC9635"/>. | |||
This URL <bcp14>MUST</bcp14> be the same URL used by client instances in suppo rt of GNAP requests. | This URL <bcp14>MUST</bcp14> be the same URL used by client instances in suppo rt of GNAP requests. | |||
The RS can use this to derive downstream access tokens, if supported by the AS . | The RS can use this to derive downstream access tokens, if supported by the AS . | |||
The location <bcp14>MUST</bcp14> be a URL <xref target="RFC3986"/> | The location <bcp14>MUST</bcp14> be a URL <xref target="RFC3986"/> | |||
with a scheme component that <bcp14>MUST</bcp14> be https, a host component, a | with a scheme component that <bcp14>MUST</bcp14> be https, a host component, a | |||
nd optionally, | nd (optionally) | |||
port, path and query components and no fragment components. | port, path, and query components and no fragment components. | |||
<bcp14>REQUIRED</bcp14>. | <bcp14>REQUIRED</bcp14>. | |||
See <xref target="token-chaining"/>.</t> | See <xref target="token-chaining"/>.</t> | |||
</dd> | </dd> | |||
<dt>introspection_endpoint (string):</dt> | <dt>introspection_endpoint (string):</dt> | |||
<dd> | <dd> | |||
<t>The URL of the endpoint offering introspection. | <t>The URL of the endpoint offering introspection. | |||
The location <bcp14>MUST</bcp14> be a URL <xref target="RFC3986"/> | The location <bcp14>MUST</bcp14> be a URL <xref target="RFC3986"/> | |||
with a scheme component that <bcp14>MUST</bcp14> be https, a host component, a | with a scheme component that <bcp14>MUST</bcp14> be https, a host component, a | |||
nd optionally, | nd (optionally) | |||
port, path and query components and no fragment components. | port, path, and query components and no fragment components. | |||
<bcp14>REQUIRED</bcp14> if the AS supports introspection. An absent value indi cates that the AS does not support introspection. | <bcp14>REQUIRED</bcp14> if the AS supports introspection. An absent value indi cates that the AS does not support introspection. | |||
See <xref target="introspection"/>.</t> | See <xref target="introspection"/>.</t> | |||
</dd> | </dd> | |||
<dt>token_formats_supported (array of strings):</dt> | <dt>token_formats_supported (array of strings):</dt> | |||
<dd> | <dd> | |||
<t>A list of token formats supported by this AS. The values in this list | <t>A list of token formats supported by this AS. The values in this list | |||
<bcp14>MUST</bcp14> be registered in the GNAP Token Format Registry in <xref t arget="IANA-token-format"/>. | <bcp14>MUST</bcp14> be registered in the "GNAP Token Formats" registry per <xr ef target="IANA-token-format"/>. | |||
<bcp14>OPTIONAL</bcp14>.</t> | <bcp14>OPTIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>resource_registration_endpoint (string):</dt> | <dt>resource_registration_endpoint (string):</dt> | |||
<dd> | <dd> | |||
<t>The URL of the endpoint offering resource registration. | <t>The URL of the endpoint offering resource registration. | |||
The location <bcp14>MUST</bcp14> be a URL <xref target="RFC3986"/> | The location <bcp14>MUST</bcp14> be a URL <xref target="RFC3986"/> | |||
with a scheme component that <bcp14>MUST</bcp14> be https, a host component, a | with a scheme component that <bcp14>MUST</bcp14> be https, a host component, a | |||
nd optionally, | nd (optionally) | |||
port, path and query components and no fragment components. | port, path, and query components and no fragment components. | |||
<bcp14>REQUIRED</bcp14> if the AS supports dynamic resource registration. An a bsent value indicates that the AS does not support this feature. | <bcp14>REQUIRED</bcp14> if the AS supports dynamic resource registration. An a bsent value indicates that the AS does not support this feature. | |||
See <xref target="rs-register-resource-handle"/>.</t> | See <xref target="rs-register-resource-handle"/>.</t> | |||
</dd> | </dd> | |||
<dt>key_proofs_supported (array of strings)</dt> | <dt>key_proofs_supported (array of strings):</dt> | |||
<dd> | <dd> | |||
<t>A list of the AS's supported key | <t>A list of the AS's supported key | |||
proofing mechanisms. The values of this list correspond to possible | proofing mechanisms. The values of this list correspond to possible | |||
values of the <tt>proof</tt> field of the key section of the request. | values of the <tt>proof</tt> field of the key section of the request. | |||
Values <bcp14>MUST</bcp14> be in the GNAP Key Proofing Methods registry establ ished by <xref target="GNAP"/>. | Values <bcp14>MUST</bcp14> be registered in the "GNAP Key Proofing Methods" re gistry established by <xref target="RFC9635"/>. | |||
<bcp14>OPTIONAL</bcp14>.</t> | <bcp14>OPTIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Additional fields are defined in the GNAP RS-Facing Discovery Documen t Fields registry <xref target="IANA-rs-discovery"/>.</t> | <t>Additional fields are defined in the "GNAP RS-Facing Discovery Docume nt Fields" registry; see <xref target="IANA-rs-discovery"/>.</t> | |||
</section> | </section> | |||
<section anchor="authentication"> | <section anchor="authentication"> | |||
<name>Protecting RS requests to the AS</name> | <name>Protecting RS Requests to the AS</name> | |||
<t>Unless otherwise specified, the RS <bcp14>MUST</bcp14> protect its ca lls to the AS using any of the signature | <t>Unless otherwise specified, the RS <bcp14>MUST</bcp14> protect its ca lls to the AS using any of the signature | |||
methods defined by <xref section="7" sectionFormat="of" target="GNAP"/>.</t> | methods defined in <xref section="7" sectionFormat="of" target="RFC9635"/>.</t> | |||
<t>The RS <bcp14>MAY</bcp14> present its keys by reference or by value i n | <t>The RS <bcp14>MAY</bcp14> present its keys by reference or by value i n | |||
a similar fashion to a client instance calling the AS in the core protocol | a similar fashion to a client instance calling the AS in the core protocol | |||
of GNAP, described in <xref section="7.1" sectionFormat="of" target="GNAP"/>. In | of GNAP, as described in <xref section="7.1" sectionFormat="of" target="RFC9635" | |||
the protocols defined here, | />. In the protocols defined here, | |||
this takes the form of the resource server identifying itself using a <tt>key</t | this takes the form of the resource server identifying itself by using a <tt>key | |||
t> field or | </tt> field or | |||
by passing an instance identifier directly.</t> | by passing an instance identifier directly.</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
POST /continue HTTP/1.1 | POST /continue HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Authorization: GNAP 80UPRY5NM33OMUKMKSKU | Authorization: GNAP 80UPRY5NM33OMUKMKSKU | |||
Signature-Input: sig1=... | Signature-Input: sig1=... | |||
Signature: sig1=... | Signature: sig1=... | |||
Content-Type: application/json | Content-Type: application/json | |||
"resource_server": { | "resource_server": { | |||
skipping to change at line 496 ¶ | skipping to change at line 534 ¶ | |||
Host: server.example.com | Host: server.example.com | |||
Signature-Input: sig1=... | Signature-Input: sig1=... | |||
Signature: sig1=... | Signature: sig1=... | |||
Content-Type: application/json | Content-Type: application/json | |||
{ | { | |||
"resource_server": "7C7C4AZ9KHRS6X63AJAO" | "resource_server": "7C7C4AZ9KHRS6X63AJAO" | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>The means by which an RS's keys are made known to the AS are out | <t>The means by which an RS's keys are made known to the AS are out | |||
of scope of this specification. | of the scope of this specification. | |||
The AS <bcp14>MAY</bcp14> require an RS to pre-register its keys | The AS <bcp14>MAY</bcp14> require an RS to preregister its keys, | |||
or could allow calls from arbitrary keys in a trust-on-first-use | or it could allow calls from arbitrary keys in a trust-on-first-use | |||
model.</t> | model.</t> | |||
<t>The AS <bcp14>MAY</bcp14> issue access tokens to the RS for protectin | <t>The AS <bcp14>MAY</bcp14> issue access tokens, called "resource serve | |||
g the RS-facing | r management access tokens", to the RS to protect the RS-facing API endpoints. | |||
API endpoints, called a resource server management access token. | ||||
If such tokens are issued, the RS <bcp14>MUST</bcp14> present them | If such tokens are issued, the RS <bcp14>MUST</bcp14> present them | |||
to the RS-facing API endpoints along with the RS authentication.</t> | to the RS-facing API endpoints along with the RS authentication.</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
POST /continue HTTP/1.1 | POST /continue HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Authorization: GNAP 80UPRY5NM33OMUKMKSKU | Authorization: GNAP 80UPRY5NM33OMUKMKSKU | |||
Signature-Input: sig1=... | Signature-Input: sig1=... | |||
Signature: sig1=... | Signature: sig1=... | |||
Content-Type: application/json | Content-Type: application/json | |||
skipping to change at line 596 ¶ | skipping to change at line 633 ¶ | |||
</artset> | </artset> | |||
<ol spacing="normal" type="1"><li> | <ol spacing="normal" type="1"><li> | |||
<t>The client instance calls the RS with its access token.</t> | <t>The client instance calls the RS with its access token.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The RS introspects the access token value at the AS. | <t>The RS introspects the access token value at the AS. | |||
The RS signs the request with its own key (not the client instance's | The RS signs the request with its own key (not the client instance's | |||
key or the token's key).</t> | key or the token's key).</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The AS validates the access token value and the Resource Server's request | <t>The AS validates the access token value and the RS's request | |||
and returns the introspection response for the token.</t> | and returns the introspection response for the token.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The RS fulfills the request from the client instance.</t> | <t>The RS fulfills the request from the client instance.</t> | |||
</li> | </li> | |||
</ol> | </ol> | |||
<t>The RS signs the request with its own key and sends the value of the access | <t>The RS signs the request with its own key and sends the value of the access | |||
token as the body of the request as a JSON object with the following members:</t | token in the body of the request as a JSON object with the following members:</t | |||
> | > | |||
<dl> | <dl newline="false" spacing="normal"> | |||
<dt>access_token (string):</dt> | <dt>access_token (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. The access token value presented to the RS by the client instance.</t> | <t>The access token value presented to the RS by the client instance . <bcp14>REQUIRED</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>proof (string):</dt> | <dt>proof (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>RECOMMENDED</bcp14>. The proofing method used by the clien | <t>The proofing method used by the client instance to bind the token | |||
t instance to bind the token to the RS request. | to the RS request. | |||
The value <bcp14>MUST</bcp14> be in the GNAP Key Proofing Methods registry.</t | The value <bcp14>MUST</bcp14> be registered in the "GNAP Key Proofing Methods" | |||
> | registry. <bcp14>RECOMMENDED</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>resource_server (string or object):</dt> | <dt>resource_server (object/string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. The identification used to authenticate | <t>The identification used to authenticate the resource server makin | |||
the resource server making this call, either | g this call, either | |||
by value or by reference as described in <xref target="authentication"/>.</t> | by value or by reference as described in <xref target="authentication"/>. <bcp | |||
14>REQUIRED</bcp14>.</t> | ||||
</dd> | </dd> | |||
<dt>access (array of strings/objects):</dt> | <dt>access (array of strings/objects):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The minimum access rights required to fu | <t>The minimum access rights required to fulfill the request. This < | |||
lfill the request. This <bcp14>MUST</bcp14> be in the | bcp14>MUST</bcp14> be in the | |||
format described in <xref section="8" sectionFormat="of" target="GNAP"/>.</t> | format described in <xref section="8" sectionFormat="of" target="RFC9635"/>. < | |||
bcp14>OPTIONAL</bcp14>. </t> | ||||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Additional fields are defined in the GNAP Token Introspection Request | <t>Additional fields are defined in the "GNAP Token Introspection Reques | |||
registry <xref target="IANA-token-introspection-request"/>.</t> | t" registry (<xref target="IANA-token-introspection-request"/>).</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
POST /introspect HTTP/1.1 | POST /introspect HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Content-Type: application/json | Content-Type: application/json | |||
Signature-Input: sig1=... | Signature-Input: sig1=... | |||
Signature: sig1=... | Signature: sig1=... | |||
Digest: sha256=... | Digest: sha256=... | |||
{ | { | |||
"access_token": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0", | "access_token": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0", | |||
skipping to change at line 671 ¶ | skipping to change at line 710 ¶ | |||
<t>is appropriate for presentation at the identified RS, and</t> | <t>is appropriate for presentation at the identified RS, and</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>is appropriate for the <tt>access</tt> indicated (if present).</t > | <t>is appropriate for the <tt>access</tt> indicated (if present).</t > | |||
</li> | </li> | |||
</ul> | </ul> | |||
<t>The AS responds with a data structure describing the token's | <t>The AS responds with a data structure describing the token's | |||
current state and any information the RS would need to validate the | current state and any information the RS would need to validate the | |||
token's presentation, such as its intended proofing mechanism and key | token's presentation, such as its intended proofing mechanism and key | |||
material.</t> | material.</t> | |||
<dl> | <dl newline="false" spacing="normal"> | |||
<dt>active (boolean):</dt> | <dt>active (boolean):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. If <tt>true</tt>, the access token prese nted is active, | <t>If <tt>true</tt>, the access token presented is active, | |||
as defined above. If any of the criteria for an active token | as defined above. If any of the criteria for an active token | |||
are not true, or if the AS is unable to make a | are not true, or if the AS is unable to make a | |||
determination (such as the token is not found), the value is | determination (such as the token is not found), the value is | |||
set to <tt>false</tt> and other fields are omitted.</t> | set to <tt>false</tt> and other fields are omitted. <bcp14>REQUIRED</bcp14>.</ t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>If the access token is active, additional fields from the single acce ss token | <t>If the access token is active, additional fields from the single acce ss token | |||
response structure defined in <xref section="3.2.1" sectionFormat="of" target="G NAP"/> are included. In | response structure defined in <xref section="3.2.1" sectionFormat="of" target="R FC9635"/> are included. In | |||
particular, these include the following:</t> | particular, these include the following:</t> | |||
<dl> | <dl newline="false" spacing="normal"> | |||
<dt>access (array of strings/objects):</dt> | <dt>access (array of strings/objects):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. The access rights associated with this a | <t>The access rights associated with this access token. This <bcp14> | |||
ccess token. This <bcp14>MUST</bcp14> be in the | MUST</bcp14> be in the | |||
format described in the <xref section="8" sectionFormat="of" target="GNAP"/>. | format described in <xref section="8" sectionFormat="of" target="RFC9635"/>. | |||
This array <bcp14>MAY</bcp14> be filtered or otherwise limited for consumption by the identified RS, including | This array <bcp14>MAY</bcp14> be filtered or otherwise limited for consumption by the identified RS, including | |||
being an empty array, indicating that the token has no explicit access rights | being an empty array, which indicates that the token has no explicit access ri | |||
that | ghts that | |||
can be disclosed to the RS.</t> | can be disclosed to the RS. <bcp14>REQUIRED</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>key (object/string):</dt> | <dt>key (object/string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14> if the token is bound. The key bound to t he access token, to allow the RS | <t>if the token is bound. The key bound to the access token, to allo w the RS | |||
to validate the signature of the request from the client instance. If the acce ss | to validate the signature of the request from the client instance. If the acce ss | |||
token is a bearer token, this <bcp14>MUST NOT</bcp14> be included.</t> | token is a bearer token, this <bcp14>MUST NOT</bcp14> be included. <bcp14>REQU IRED</bcp14></t> | |||
</dd> | </dd> | |||
<dt>flags (array of strings):</dt> | <dt>flags (array of strings):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The set of flags associated with the acc ess token.</t> | <t>The set of flags associated with the access token. <bcp14>OPTIONA L</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>exp (integer):</dt> | <dt>exp (integer):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The timestamp after which this token is | <t>The timestamp after which this token is no longer valid. | |||
no longer valid. | Expressed as integer seconds from UNIX Epoch. <bcp14>OPTIONAL</bcp14>.</t> | |||
Expressed as integer seconds from UNIX Epoch.</t> | ||||
</dd> | </dd> | |||
<dt>iat (integer):</dt> | <dt>iat (integer):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The timestamp at which this token was is | <t>The timestamp at which this token was issued by the AS. | |||
sued by the AS. | Expressed as integer seconds from UNIX Epoch. <bcp14>OPTIONAL</bcp14>.</t> | |||
Expressed as integer seconds from UNIX Epoch.</t> | ||||
</dd> | </dd> | |||
<dt>nbf (integer):</dt> | <dt>nbf (integer):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The timestamp before which this token is | <t>The timestamp before which this token is not valid. | |||
not valid. | Expressed as integer seconds from UNIX Epoch. <bcp14>OPTIONAL</bcp14>.</t> | |||
Expressed as integer seconds from UNIX Epoch.</t> | ||||
</dd> | </dd> | |||
<dt>aud (string or array of strings):</dt> | <dt>aud (string or array of strings):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. Identifiers for the resource servers thi s token can be accepted at.</t> | <t>Identifiers for the resource servers this token can be accepted a t. <bcp14>OPTIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>sub (string):</dt> | <dt>sub (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. Identifier of the resource owner who aut horized this token.</t> | <t>Identifier of the resource owner who authorized this token. <bcp1 4>OPTIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>iss (string):</dt> | <dt>iss (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. Grant endpoint URL of the AS that issued this token.</t> | <t>Grant endpoint URL of the AS that issued this token. <bcp14>REQUI RED</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>instance_id (string):</dt> | <dt>instance_id (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The instance identifier of the client in stance that the token was issued to.</t> | <t>The instance identifier of the client instance that the token was issued to. <bcp14>OPTIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Additional fields are defined in the GNAP Token Introspection Respons e registry <xref target="IANA-token-introspection"/>.</t> | <t>Additional fields are defined in the "GNAP Token Introspection Respon se" registry (<xref target="IANA-token-introspection"/>).</t> | |||
<t>The response <bcp14>MAY</bcp14> include any additional fields defined in an access | <t>The response <bcp14>MAY</bcp14> include any additional fields defined in an access | |||
token response and <bcp14>MUST NOT</bcp14> include the access token <tt>value</t t> itself.</t> | token response and <bcp14>MUST NOT</bcp14> include the access token <tt>value</t t> itself.</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Cache-Control: no-store | Cache-Control: no-store | |||
{ | { | |||
"active": true, | "active": true, | |||
"access": [ | "access": [ | |||
skipping to change at line 768 ¶ | skipping to change at line 807 ¶ | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>When processing the results of the introspection response, the RS <bc p14>MUST</bcp14> determine the | <t>When processing the results of the introspection response, the RS <bc p14>MUST</bcp14> determine the | |||
appropriate course of action. For instance, if the RS determines that the access token's | appropriate course of action. For instance, if the RS determines that the access token's | |||
access rights are not sufficient for the request to which the token was attached , the RS | access rights are not sufficient for the request to which the token was attached , the RS | |||
can return an error or a public resource, as appropriate for the RS. | can return an error or a public resource, as appropriate for the RS. | |||
In all cases, the final determination of the response is at the discretion of th e RS.</t> | In all cases, the final determination of the response is at the discretion of th e RS.</t> | |||
</section> | </section> | |||
<section anchor="rs-register-resource-handle"> | <section anchor="rs-register-resource-handle"> | |||
<name>Registering a Resource Set</name> | <name>Registering a Resource Set</name> | |||
<t>If the RS needs to, it can post a set of resources as described in th | <t>If the RS needs to, it can post a set of resources, as described in S | |||
e Resource Access Rights section of | ection <xref target="RFC9635" sectionFormat="bare" section="8"/> ("Resource Acce | |||
<xref target="GNAP"/> to the AS's resource registration endpoint along with info | ss Rights") of <xref target="RFC9635"/>, to the AS's resource registration endpo | |||
rmation about | int along with information about | |||
what the RS will need to validate the request.</t> | what the RS will need to validate the request.</t> | |||
<dl> | <dl newline="false" spacing="normal"> | |||
<dt>access (array of objects/strings):</dt> | <dt>access (array of objects/strings):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. The list of access rights associated wit | <t>The list of access rights associated with the request in the form | |||
h the request in the format described | at described | |||
in the "Resource Access Rights" section of <xref target="GNAP"/>.</t> | in Section <xref target="RFC9635" sectionFormat="bare" section="8"/> ("Resourc | |||
e Access Rights") of <xref target="RFC9635"/>. <bcp14>REQUIRED</bcp14>. </t> | ||||
</dd> | </dd> | |||
<dt>resource_server (string or object):</dt> | <dt>resource_server (object/string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. The identification used to authenticate | <t> The identification used to authenticate the resource server maki | |||
the resource server making this call, either | ng this call, either | |||
by value or by reference as described in <xref target="authentication"/>.</t> | by value or by reference as described in <xref target="authentication"/>. <bcp | |||
14>REQUIRED</bcp14>.</t> | ||||
</dd> | </dd> | |||
<dt>token_formats_supported (array of strings):</dt> | <dt>token_formats_supported (array of strings):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The token formats the RS is able to proc | <t>The list of token formats that the RS is able to process. | |||
ess for accessing the resource. | The values in this array <bcp14>MUST</bcp14> be registered in the "GNAP Token | |||
The values in this array <bcp14>MUST</bcp14> be registered in the GNAP Token F | Formats" registry per <xref target="IANA-token-format"/>. | |||
ormats Registry in <xref target="IANA-token-format"/>. | ||||
If the field is omitted, the token format is at the discretion of the AS. | If the field is omitted, the token format is at the discretion of the AS. | |||
If the AS does not support any of the requested | If the AS does not support any of the requested | |||
token formats, the AS <bcp14>MUST</bcp14> return an error to the RS.</t> | token formats, the AS <bcp14>MUST</bcp14> return an error to the RS. <bcp14>OP TIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>token_introspection_required (boolean):</dt> | <dt>token_introspection_required (boolean):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. If present and set to <tt>true</tt>, the RS expects to make a token introspection request as | <t> If present and set to <tt>true</tt>, the RS expects to make a to ken introspection request as | |||
described in <xref target="introspection"/>. If absent or set to <tt>false</tt >, the RS does not anticipate needing | described in <xref target="introspection"/>. If absent or set to <tt>false</tt >, the RS does not anticipate needing | |||
to make an introspection request for tokens relating to this resource set. If the AS does not | to make an introspection request for tokens relating to this resource set. If the AS does not | |||
support token introspection for this RS, the AS <bcp14>MUST</bcp14> return an error to the RS.</t> | support token introspection for this RS, the AS <bcp14>MUST</bcp14> return an error to the RS. <bcp14>OPTIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Additional fields are defined in the GNAP Resource Set Registration R equest registry <xref target="IANA-resource-registration-request"/>.</t> | <t>Additional fields are defined in the "GNAP Resource Set Registration Request Parameters" registry (<xref target="IANA-resource-registration-request"/ >).</t> | |||
<t>The RS <bcp14>MUST</bcp14> identify itself with its own key and sign the | <t>The RS <bcp14>MUST</bcp14> identify itself with its own key and sign the | |||
request.</t> | request.</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
POST /resource HTTP/1.1 | POST /resource HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Content-Type: application/json | Content-Type: application/json | |||
Signature-Input: sig1=... | Signature-Input: sig1=... | |||
Signature: sig1=... | Signature: sig1=... | |||
Digest: ... | Digest: ... | |||
skipping to change at line 835 ¶ | skipping to change at line 873 ¶ | |||
}, | }, | |||
"dolphin-metadata" | "dolphin-metadata" | |||
], | ], | |||
"resource_server": "7C7C4AZ9KHRS6X63AJAO" | "resource_server": "7C7C4AZ9KHRS6X63AJAO" | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>The AS responds with a reference appropriate to represent the | <t>The AS responds with a reference appropriate to represent the | |||
resources list that the RS presented in its request as well as | resources list that the RS presented in its request as well as | |||
any additional information the RS might need in future requests.</t> | any additional information the RS might need in future requests.</t> | |||
<dl> | <dl newline="false" spacing="normal"> | |||
<dt>resource_reference (string):</dt> | <dt>resource_reference (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>REQUIRED</bcp14>. A single string representing the list of resources registered in the request. | <t>A single string representing the list of resources registered in the request. | |||
The RS <bcp14>MAY</bcp14> make this handle available to a client instance as p art of a | The RS <bcp14>MAY</bcp14> make this handle available to a client instance as p art of a | |||
discovery response as described in <xref section="9.1" sectionFormat="of" targ | discovery response as described in <xref section="9.1" sectionFormat="of" targ | |||
et="GNAP"/> or as | et="RFC9635"/> or as | |||
documentation to client software developers.</t> | documentation to client software developers. <bcp14>REQUIRED</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>instance_id (string):</dt> | <dt>instance_id (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. An instance identifier that the RS can u | <t>An instance identifier that the RS can use to refer to itself in | |||
se to refer to itself in future calls to | future calls to | |||
the AS, in lieu of sending its key by value. See <xref target="authentication" | the AS, in lieu of sending its key by value. See <xref target="authentication" | |||
/>.</t> | />. <bcp14>OPTIONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt>introspection_endpoint (string):</dt> | <dt>introspection_endpoint (string):</dt> | |||
<dd> | <dd> | |||
<t><bcp14>OPTIONAL</bcp14>. The introspection endpoint of this AS, u | <t>The introspection endpoint of this AS that is used to allow the R | |||
sed to allow the RS to perform | S to perform token introspection. See <xref target="introspection"/>. <bcp14>OPT | |||
token introspection. See <xref target="introspection"/>.</t> | IONAL</bcp14>.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Additional fields are defined in the GNAP Resource Set Registration R esponse Registry <xref target="IANA-resource-registration-response"/>.</t> | <t>Additional fields are defined in the "GNAP Resource Set Registration Response Parameters" registry (<xref target="IANA-resource-registration-response "/>).</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Cache-Control: no-store | Cache-Control: no-store | |||
{ | { | |||
"resource_reference": "FWWIKYBQ6U56NL1" | "resource_reference": "FWWIKYBQ6U56NL1" | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>If a resource was previously registered, the AS <bcp14>MAY</bcp14> re turn the same resource reference | <t>If a resource was previously registered, the AS <bcp14>MAY</bcp14> re turn the same resource reference | |||
value as in previous responses.</t> | value as in previous responses.</t> | |||
<t>If the registration fails, the AS returns an HTTP 400 Bad Request err | ||||
or to the | <t>If the registration fails, the AS returns HTTP status code 400 (Bad R | |||
RS indicating that the registration was not successful.</t> | equest) to the | |||
RS, indicating that the registration was not successful.</t> | ||||
<t>The client instance can then use the <tt>resource_reference</tt> valu e as a string-type access | <t>The client instance can then use the <tt>resource_reference</tt> valu e as a string-type access | |||
reference as defined in <xref section="8.1" sectionFormat="of" target="GNAP"/>. This value <bcp14>MAY</bcp14> be combined with any other | reference as defined in <xref section="8.1" sectionFormat="of" target="RFC9635"/ >. This value <bcp14>MAY</bcp14> be combined with any other | |||
additional access rights requested by the client instance.</t> | additional access rights requested by the client instance.</t> | |||
<sourcecode type="json"><![CDATA[ | <sourcecode type="json"><![CDATA[ | |||
{ | { | |||
"access_token": { | "access_token": { | |||
"access": [ | "access": [ | |||
"FWWIKYBQ6U56NL1", | "FWWIKYBQ6U56NL1", | |||
{ | { | |||
"type": "photo-api", | "type": "photo-api", | |||
"actions": [ | "actions": [ | |||
"read", | "read", | |||
skipping to change at line 901 ¶ | skipping to change at line 939 ¶ | |||
}, | }, | |||
"dolphin-metadata" | "dolphin-metadata" | |||
] | ] | |||
}, | }, | |||
"client": "client-12351.bdxqf" | "client": "client-12351.bdxqf" | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="response-error"> | <section anchor="response-error"> | |||
<name>Error Responses</name> | <name>Error Responses</name> | |||
<t>In the case of an error from the RS-facing API, the AS responds to th | <t>In the case of an error from the RS-facing API, the AS responds to th | |||
e RS with an HTTP 400 (Bad Request) | e RS with HTTP status code 400 (Bad Request) and a JSON object consisting of a s | |||
status code and a JSON object consisting of a single <tt>error</tt> field, which | ingle <tt>error</tt> field, which is either an object or a string.</t> | |||
is either an object or a string.</t> | ||||
<t>When returned as a string, the error value is the error code:</t> | <t>When returned as a string, the error value is the error code:</t> | |||
<sourcecode type="json"><![CDATA[ | <sourcecode type="json"><![CDATA[ | |||
{ | { | |||
error: "invalid_access" | error: "invalid_access" | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>When returned as an object, the error object contains the following f ields:</t> | <t>When returned as an object, the error object contains the following f ields:</t> | |||
<dl> | <dl newline="false" spacing="normal"> | |||
<dt><tt>code</tt> (string):</dt> | <dt><tt>code</tt> (string):</dt> | |||
<dd> | <dd> | |||
<t>A single ASCII error code defining the error. | <t>A single ASCII error code defining the error. | |||
<bcp14>REQUIRED</bcp14>.</t> | <bcp14>REQUIRED</bcp14>.</t> | |||
</dd> | </dd> | |||
<dt><tt>description</tt> (string):</dt> | <dt><tt>description</tt> (string):</dt> | |||
<dd> | <dd> | |||
<t>A human-readable string description of the error intended for the | <t>A human-readable string description of the error intended for the | |||
developer of the client. | developer of the client. | |||
<bcp14>OPTIONAL</bcp14>.</t> | <bcp14>OPTIONAL</bcp14>.</t> | |||
skipping to change at line 932 ¶ | skipping to change at line 969 ¶ | |||
</dl> | </dl> | |||
<sourcecode type="json"><![CDATA[ | <sourcecode type="json"><![CDATA[ | |||
{ | { | |||
"error": { | "error": { | |||
"code": "invalid_access", | "code": "invalid_access", | |||
"description": "Access to 'foo' is not permitted for this RS." | "description": "Access to 'foo' is not permitted for this RS." | |||
} | } | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>This specification defines the following error code values:</t> | <t>This specification defines the following error code values:</t> | |||
<dl> | <dl newline="false" spacing="normal"> | |||
<dt><tt>"invalid_request"</tt>:</dt> | <dt><tt>"invalid_request"</tt>:</dt> | |||
<dd> | <dd> | |||
<t>The request is missing a required parameter, includes an | <t>The request is missing a required parameter, includes an | |||
invalid parameter value or is otherwise malformed.</t> | invalid parameter value, or is otherwise malformed.</t> | |||
</dd> | </dd> | |||
<dt><tt>"invalid_resource_server"</tt>:</dt> | <dt><tt>"invalid_resource_server"</tt>:</dt> | |||
<dd> | <dd> | |||
<t>The request was made from an RS that was not recognized | <t>The request was made from an RS that was not recognized | |||
or allowed by the AS, or the RS's signature validation failed.</t> | or allowed by the AS, or the RS's signature validation failed.</t> | |||
</dd> | </dd> | |||
<dt><tt>"invalid_access"</tt></dt> | <dt><tt>"invalid_access"</tt></dt> | |||
<dd> | <dd> | |||
<t>The RS is not permitted to register or introspect for the request ed "access" value.</t> | <t>The RS is not permitted to register or introspect for the request ed "access" value.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Additional error codes can be defined in the <xref target="IANA-error -code">GNAP RS-Facing Error Codes Registry</xref>.</t> | <t>Additional error codes can be defined in the "GNAP RS-Facing Error Co des" registry (<xref target="IANA-error-code"/>).</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="token-chaining"> | <section anchor="token-chaining"> | |||
<name>Deriving a downstream token</name> | <name>Deriving a Downstream Token</name> | |||
<t>Some architectures require an RS to act as a client instance and use a derived access | <t>Some architectures require an RS to act as a client instance and use a derived access | |||
token for a secondary RS. Since the RS is not the same entity that made the init ial grant | token for a secondary RS. Since the RS is not the same entity that made the init ial grant | |||
request, the RS is not capable of referencing or modifying the existing grant. A s such, | request, the RS is not capable of referencing or modifying the existing grant. A s such, | |||
the RS needs to request or generate a new token access token for its use at the secondary RS. | the RS needs to request or generate a new access token for its use at the second ary RS. | |||
This internal secondary token is issued in the context of the incoming access to ken.</t> | This internal secondary token is issued in the context of the incoming access to ken.</t> | |||
<t>While it is possible to use a <xref target="structure">token format</xr ef> that allows for the | <t>While it is possible to use a <xref target="structure">token format</xr ef> that allows for the | |||
RS to generate its own secondary token, | RS to generate its own secondary token, | |||
the AS can allow the RS to request this secondary access token using the same | the AS can allow the RS to request this secondary access token using the same | |||
process used by the original client instance to request the primary access token . Since the | process used by the original client instance to request the primary access token . Since the | |||
RS is acting as its own client instance from the perspective of GNAP, this proce ss | RS is acting as its own client instance from the perspective of GNAP, this proce ss | |||
uses the same grant endpoint, request structure, and response structure as a cli ent | uses the same grant endpoint, request structure, and response structure as a cli ent | |||
instance's request.</t> | instance's request.</t> | |||
<artset> | <artset> | |||
<artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1 " height="192" width="464" viewBox="0 0 464 192" class="diagram" text-anchor="mi ddle" font-family="monospace" font-size="13px" stroke-linecap="round"> | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1 " height="192" width="464" viewBox="0 0 464 192" class="diagram" text-anchor="mi ddle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
skipping to change at line 1054 ¶ | skipping to change at line 1091 ¶ | |||
</li> | </li> | |||
<li> | <li> | |||
<t>RS2 fulfills the call from RS1.</t> | <t>RS2 fulfills the call from RS1.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>RS1 fulfills the call from the original client instance.</t> | <t>RS1 fulfills the call from the original client instance.</t> | |||
</li> | </li> | |||
</ol> | </ol> | |||
<t>If the RS needs to derive a token from one presented to it, it can | <t>If the RS needs to derive a token from one presented to it, it can | |||
request one from the AS by making a token request as described in | request one from the AS by making a token request as described in | |||
<xref target="GNAP"/> and presenting the existing access token's | <xref target="RFC9635"/> and presenting the existing access token's | |||
value in the "existing_access_token" field.</t> | value in the "existing_access_token" field.</t> | |||
<t>Since the RS is acting as a client instance, | <t>Since the RS is acting as a client instance, | |||
the RS <bcp14>MUST</bcp14> identify itself with its own key in the <tt>client</t t> field and sign the | the RS <bcp14>MUST</bcp14> identify itself with its own key in the <tt>client</t t> field and sign the | |||
request just as any client instance would, as described in <xref target="authent ication"/>. | request just as any client instance would, as described in <xref target="authent ication"/>. | |||
The AS <bcp14>MUST</bcp14> determine that the token being presented is appropria te for use | The AS <bcp14>MUST</bcp14> determine that the token being presented is appropria te for use | |||
at the RS making the token chaining request.</t> | at the RS making the token chaining request.</t> | |||
<artwork><![CDATA[ | ||||
<sourcecode type="http-message"><![CDATA[ | ||||
POST /tx HTTP/1.1 | POST /tx HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Content-Type: application/json | Content-Type: application/json | |||
Detached-JWS: ejy0... | Detached-JWS: ejy0... | |||
{ | { | |||
"access_token": { | "access_token": { | |||
"access": [ | "access": [ | |||
{ | { | |||
"actions": [ | "actions": [ | |||
"read", | "read", | |||
"write", | "write", | |||
"dolphin" | "dolphin" | |||
], | ], | |||
"locations": [ | "locations": [ | |||
"https://server.example.net/", | "https://server.example.net/", | |||
"https://resource.local/other" | "https://resource.local/other" | |||
], | ], | |||
"datatypes": [ | "datatypes": [ | |||
"metadata", | "metadata", | |||
"images" | "images" | |||
] | ] | |||
}, | }, | |||
"dolphin-metadata" | "dolphin-metadata" | |||
] | ] | |||
}, | }, | |||
"client": "7C7C4AZ9KHRS6X63AJAO", | "client": "7C7C4AZ9KHRS6X63AJAO", | |||
"existing_access_token": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0" | "existing_access_token": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0" | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
<t>The AS responds with a token for the downstream RS2 as described in | <t>The AS responds with a token for the downstream RS2 as described in | |||
<xref target="GNAP"/>. The downstream RS2 could | <xref target="RFC9635"/>. The downstream RS2 could | |||
repeat this process as necessary for calling further RS's.</t> | repeat this process as necessary for calling further RSs.</t> | |||
</section> | </section> | |||
<section anchor="IANA"> | <section anchor="IANA"> | |||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<t>IANA is requested to add values to existing registries and to create 5 registries in the Grant Negotiation and Authorization Protocol registry.</t> | <t>IANA has added values to existing registries and created five registrie s under the "Grant Negotiation and Authorization Protocol (GNAP)" registry group .</t> | |||
<section anchor="IANA-well-known"> | <section anchor="IANA-well-known"> | |||
<name>Well-Known URI</name> | <name>Well-Known URIs</name> | |||
<t>The "gnap-as-rs" URI suffix is registered into the Well-Known URIs Re | <t>The "gnap-as-rs" URI suffix is registered in the "Well-Known URIs" re | |||
gistry to support RS-facing discovery of the AS.</t> | gistry to support RS-facing discovery of the AS.</t> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>URI Suffix:</dt> | <dt>URI Suffix:</dt> | |||
<dd> | <dd>gnap-as-rs</dd> | |||
<t>gnap-as-rs</t> | ||||
</dd> | ||||
<dt>Change Controller:</dt> | <dt>Change Controller:</dt> | |||
<dd> | <dd>IETF</dd> | |||
<t>IETF</t> | ||||
</dd> | ||||
<dt>Specification Document:</dt> | <dt>Specification Document:</dt> | |||
<dd> | <dd><xref target="discovery"/> of RFC 9767</dd> | |||
<t><xref target="discovery"/> of RFC xxxx</t> | ||||
</dd> | ||||
<dt>Status:</dt> | <dt>Status:</dt> | |||
<dd> | <dd>Permanent</dd> | |||
<t>Permanent</t> | ||||
</dd> | ||||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-grant-request"> | <section anchor="IANA-grant-request"> | |||
<name>GNAP Grant Request Parameters</name> | <name>GNAP Grant Request Parameters</name> | |||
<t>The following parameter is registered into the GNAP Grant Request Par | <t>The following parameter is registered in the "GNAP Grant Request Para | |||
ameters registry:</t> | meters" registry:</t> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>Name:</dt> | <dt>Name:</dt> | |||
<dd> | <dd> | |||
<t><tt>existing_access_token</tt></t> | <tt>existing_access_token</tt> | |||
</dd> | </dd> | |||
<dt>Type:</dt> | <dt>Type:</dt> | |||
<dd> | <dd> | |||
<t>string</t> | string | |||
</dd> | </dd> | |||
<dt>Reference:</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t><xref target="token-chaining"/> of RFC xxxx</t> | <xref target="token-chaining"/> of RFC 9767 | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-token-format"> | <section anchor="IANA-token-format"> | |||
<name>GNAP Token Formats</name> | <name>GNAP Token Formats</name> | |||
<t>This document defines a GNAP token format, for which IANA is asked to | <t>This document defines a GNAP token format, for which IANA has created | |||
create and maintain a new registry titled "GNAP Token Formats". Initial values | and maintains a new registry titled "GNAP Token Formats". Initial values for th | |||
for this registry are given in <xref target="IANA-token-format-contents"/>. Futu | is registry are given in <xref target="IANA-token-format-contents"/>. Future ass | |||
re assignments and modifications to existing assignment are to be made through t | ignments and modifications to existing assignment are to be made through the Spe | |||
he Specification Required registration policy <xref target="RFC8126"/>.</t> | cification Required registration policy <xref target="RFC8126"/>.</t> | |||
<t>The Designated Expert (DE) is expected to ensure that:</t> | <t>The designated expert (DE) is expected to ensure that:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>all registrations follow the template presented in <xref target=" IANA-token-format-template"/>.</t> | <t>all registrations follow the template presented in <xref target=" IANA-token-format-template"/>.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the format's definition is sufficiently unique from other formats provided by existing parameters.</t> | <t>the format's definition is sufficiently unique from other formats provided by existing parameters.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the format's definition specifies the format of the access token in sufficient detail to allow for the AS and RS to be able to communicate the to ken information.</t> | <t>the format's definition specifies the format of the access token in sufficient detail to allow for the AS and RS to be able to communicate the to ken information.</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="IANA-token-format-template"> | <section anchor="IANA-token-format-template"> | |||
<name>Registry Template</name> | <name>Registry Template</name> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>Name</dt> | <dt>Name:</dt> | |||
<dd> | <dd> | |||
<t>The name of the format.</t> | The name of the format. | |||
</dd> | </dd> | |||
<dt>Status</dt> | <dt>Status:</dt> | |||
<dd> | <dd> | |||
<t>Whether or not the format is in active use. Possible values are Active and Deprecated.</t> | Whether or not the format is in active use. Possible values are Ac tive and Deprecated. | |||
</dd> | </dd> | |||
<dt>Description</dt> | <dt>Description:</dt> | |||
<dd> | <dd> | |||
<t>Human-readable description of the access token format.</t> | The human-readable description of the access token format. | |||
</dd> | </dd> | |||
<dt>Reference</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t>The specification that defines the token format.</t> | The specification that defines the token format. | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-token-format-contents"> | <section anchor="IANA-token-format-contents"> | |||
<name>Initial Registry Contents</name> | <name>Initial Registry Contents</name> | |||
<table> | <table> | |||
<name>Initial contents of the GNAP Token Formats Registry.</name> | <name>Initial Contents of the GNAP Token Formats Registry</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Name</th> | <th align="left">Name</th> | |||
<th align="left">Status</th> | <th align="left">Status</th> | |||
<th align="left">Description</th> | <th align="left">Description</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left"> | <td align="left"> | |||
<tt>jwt-signed</tt></td> | <tt>jwt-signed</tt></td> | |||
<td align="left">Active</td> | <td align="left">Active</td> | |||
<td align="left">JSON Web Token, signed with JWS</td> | <td align="left">JSON Web Token, signed with JWS</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="JWT"/></td> | <xref target="RFC7519"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left"> | <td align="left"> | |||
<tt>jwt-encrypted</tt></td> | <tt>jwt-encrypted</tt></td> | |||
<td align="left">Active</td> | <td align="left">Active</td> | |||
<td align="left">JSON Web Token, encrypted with JWE</td> | <td align="left">JSON Web Token, encrypted with JWE</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="JWT"/></td> | <xref target="RFC7519"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left"> | <td align="left"> | |||
<tt>macaroon</tt></td> | <tt>macaroon</tt></td> | |||
<td align="left">Active</td> | <td align="left">Active</td> | |||
<td align="left">Macaroon</td> | <td align="left">Macaroon</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="MACAROON"/></td> | <xref target="MACAROON"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
skipping to change at line 1234 ¶ | skipping to change at line 1264 ¶ | |||
<td align="left">ZCAP</td> | <td align="left">ZCAP</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="ZCAPLD"/></td> | <xref target="ZCAPLD"/></td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="IANA-token-introspection-request"> | <section anchor="IANA-token-introspection-request"> | |||
<name>GNAP Token Introspection Request</name> | <name>GNAP Token Introspection Request</name> | |||
<t>This document defines GNAP token introspection, for which IANA is ask | <t>This document defines GNAP token introspection, for which IANA has cr | |||
ed to create and maintain a new registry titled "GNAP Token Introspection Reques | eated and maintains a new registry titled "GNAP Token Introspection Request". In | |||
t". Initial values for this registry are given in <xref target="IANA-token-intro | itial values for this registry are given in <xref target="IANA-token-introspecti | |||
spection-request-contents"/>. Future assignments and modifications to existing a | on-request-contents"/>. Future assignments and modifications to existing assignm | |||
ssignment are to be made through the Specification Required registration policy | ent are to be made through the Specification Required registration policy <xref | |||
<xref target="RFC8126"/>.</t> | target="RFC8126"/>.</t> | |||
<t>The Designated Expert (DE) is expected to ensure that:</t> | <t>The DE is expected to ensure that:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>all registrations follow the template presented in <xref target=" IANA-token-introspection-request-template"/>.</t> | <t>all registrations follow the template presented in <xref target=" IANA-token-introspection-request-template"/>.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the claim's definition is sufficiently orthogonal to other claims defined in the registry so as avoid overlapping functionality.</t> | <t>the claim's definition is sufficiently orthogonal to other claims defined in the registry so as avoid overlapping functionality.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the claim's definition specifies the syntax and semantics of the claim in sufficient detail to allow for the AS and RS to be able to communicate the token values.</t> | <t>the claim's definition specifies the syntax and semantics of the claim in sufficient detail to allow for the AS and RS to be able to communicate the token values.</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="IANA-token-introspection-request-template"> | <section anchor="IANA-token-introspection-request-template"> | |||
<name>Registry Template</name> | <name>Registry Template</name> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>Name</dt> | <dt>Name:</dt> | |||
<dd> | <dd> | |||
<t>The name of the claim.</t> | The name of the claim. | |||
</dd> | </dd> | |||
<dt>Type</dt> | <dt>Type:</dt> | |||
<dd> | <dd> | |||
<t>The JSON data type of the claim value.</t> | The JSON data type of the claim value. | |||
</dd> | </dd> | |||
<dt>Reference</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t>The specification that defines the claim.</t> | The specification that defines the claim. | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-token-introspection-request-contents"> | <section anchor="IANA-token-introspection-request-contents"> | |||
<name>Initial Registry Contents</name> | <name>Initial Registry Contents</name> | |||
<t>The table below contains the initial contents of the GNAP Token Int rospection Registry.</t> | <t>The table below contains the initial contents of the "GNAP Token In trospection Request" registry.</t> | |||
<table> | <table> | |||
<name>Initial contents of the GNAP Token Introspection Request Regis | <!--[rfced] Regarding variations of "string/object" | |||
try.</name> | in the "GNAP Token Introspection Request" registry. | |||
b) Similarly, in Section 3.3, would you like to change | ||||
"string or object" to "string/object"? | ||||
(Note: If you decide not to change the original "object/string" above, | ||||
then we will update "string or object" to "object/string" to | ||||
match.) | ||||
Original: | ||||
resource_server (string or object): REQUIRED. ... | ||||
access (array of strings/objects): OPTIONAL. ... | ||||
Perhaps: | ||||
resource_server (string/object): REQUIRED. ... | ||||
access (array of strings/objects): OPTIONAL. ... | ||||
[IANA ACTION]: | ||||
None - updated the doc to match the registry | ||||
--> | ||||
<!--[rfced] Regarding variations of "string/object" | ||||
in the "GNAP Token Introspection Response" | ||||
and "GNAP Resource Set Registration Request Parameters" registries. | ||||
c) With the same rationale, in Section 3.4 (and Table 4), would you like | ||||
to change this as follows? If so, we will ask IANA to update the registry | ||||
(https://www.iana.org/assignments/gnap/gnap.xhtml#gnap-resource-set-registration | ||||
-request-parameters) accordingly. | ||||
Original: resource_server (string or object) | ||||
Perhaps: resource_server (string/object) | ||||
[IANA ACTION]: | ||||
This should be: | ||||
resource_server (object/string) | ||||
as above. The IANA registry should be updated accordingly. | ||||
--> | ||||
<name>Initial Contents of the GNAP Token Introspection Request Regis | ||||
try</name> | ||||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Name</th> | <th align="left">Name</th> | |||
<th align="left">Type</th> | <th align="left">Type</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">access_token</td> | <td align="left">access_token</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">proof</td> | <td align="left">proof</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">resource_server</td> | <td align="left">resource_server</td> | |||
<td align="left">object/string</td> | <td align="left">object/string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">access</td> | <td align="left">access</td> | |||
<td align="left">array of strings/objects</td> | <td align="left">array of strings/objects</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="IANA-token-introspection"> | <section anchor="IANA-token-introspection"> | |||
<name>GNAP Token Introspection Response</name> | <name>GNAP Token Introspection Response</name> | |||
<t>This document defines GNAP token introspection, for which IANA is ask | <t>This document defines GNAP token introspection, for which IANA has cr | |||
ed to create and maintain a new registry titled "GNAP Token Introspection Respon | eated and maintains a new registry titled "GNAP Token Introspection Response". I | |||
se". Initial values for this registry are given in <xref target="IANA-token-intr | nitial values for this registry are given in <xref target="IANA-token-introspect | |||
ospection-contents"/>. Future assignments and modifications to existing assignme | ion-contents"/>. Future assignments and modifications to existing assignment are | |||
nt are to be made through the Specification Required registration policy <xref t | to be made through the Specification Required registration policy <xref target= | |||
arget="RFC8126"/>.</t> | "RFC8126"/>.</t> | |||
<t>The Designated Expert (DE) is expected to ensure that:</t> | <t>The DE is expected to ensure that:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>all registrations follow the template presented in <xref target=" IANA-token-introspection-template"/>.</t> | <t>all registrations follow the template presented in <xref target=" IANA-token-introspection-template"/>.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the claim's definition is sufficiently orthogonal to other claims defined in the registry so as avoid overlapping functionality.</t> | <t>the claim's definition is sufficiently orthogonal to other claims defined in the registry so as avoid overlapping functionality.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the claim's definition specifies the syntax and semantics of the claim in sufficient detail to allow for the AS and RS to be able to communicate the token values.</t> | <t>the claim's definition specifies the syntax and semantics of the claim in sufficient detail to allow for the AS and RS to be able to communicate the token values.</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="IANA-token-introspection-template"> | <section anchor="IANA-token-introspection-template"> | |||
<name>Registry Template</name> | <name>Registry Template</name> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>Name</dt> | <dt>Name:</dt> | |||
<dd> | <dd> | |||
<t>The name of the claim.</t> | The name of the claim. | |||
</dd> | </dd> | |||
<dt>Type</dt> | <dt>Type:</dt> | |||
<dd> | <dd> | |||
<t>The JSON data type of the claim value.</t> | The JSON data type of the claim value. | |||
</dd> | </dd> | |||
<dt>Reference</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t>The specification that defines the claim.</t> | The specification that defines the claim. | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-token-introspection-contents"> | <section anchor="IANA-token-introspection-contents"> | |||
<name>Initial Registry Contents</name> | <name>Initial Registry Contents</name> | |||
<t>The table below contains the initial contents of the GNAP Token Int rospection Registry.</t> | <t>The table below contains the initial contents of the "GNAP Token In trospection Response" registry.</t> | |||
<table> | <table> | |||
<name>Initial contents of the GNAP Token Introspection Response Regi stry.</name> | <name>Initial Contents of the GNAP Token Introspection Response Regi stry</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Name</th> | <th align="left">Name</th> | |||
<th align="left">Type</th> | <th align="left">Type</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">active</td> | <td align="left">active</td> | |||
<td align="left">boolean</td> | <td align="left">boolean</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">access</td> | <td align="left">access</td> | |||
<td align="left">array of strings/objects</td> | <td align="left">array of strings/objects</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">key</td> | <td align="left">key</td> | |||
<td align="left">object/string</td> | <td align="left">object/string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">flags</td> | <td align="left">flags</td> | |||
<td align="left">array of strings</td> | <td align="left">array of strings</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">exp</td> | <td align="left">exp</td> | |||
<td align="left">integer</td> | <td align="left">integer</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">iat</td> | <td align="left">iat</td> | |||
<td align="left">integer</td> | <td align="left">integer</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">nbf</td> | <td align="left">nbf</td> | |||
<td align="left">integer</td> | <td align="left">integer</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">aud</td> | <td align="left">aud</td> | |||
<td align="left">string or array of strings</td> | <td align="left">string or array of strings</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">sub</td> | <td align="left">sub</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">iss</td> | <td align="left">iss</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">instance_id</td> | <td align="left">instance_id</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="introspection"/> of RFC xxxx</td> | <xref target="introspection"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="IANA-resource-registration-request"> | <section anchor="IANA-resource-registration-request"> | |||
<name>GNAP Resource Set Registration Request Parameters</name> | <name>GNAP Resource Set Registration Request Parameters</name> | |||
<t>This document defines a means to register a resource set for a GNAP A | <t>This document defines a means to register a resource set for a GNAP A | |||
S, for which IANA is asked to create and maintain a new registry titled "GNAP Re | S, for which IANA has created and maintains a new registry titled "GNAP Resource | |||
source Set Registration Request Parameters". Initial values for this registry ar | Set Registration Request Parameters". Initial values for this registry are give | |||
e given in <xref target="IANA-resource-registration-request-contents"/>. Future | n in <xref target="IANA-resource-registration-request-contents"/>. Future assign | |||
assignments and modifications to existing assignment are to be made through the | ments and modifications to existing assignment are to be made through the Expert | |||
Expert Review registration policy <xref target="RFC8126"/>.</t> | Review registration policy <xref target="RFC8126"/>.</t> | |||
<t>The Designated Expert (DE) is expected to ensure that:</t> | <t>The DE is expected to ensure that:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>all registrations follow the template presented in <xref target=" IANA-resource-registration-request-template"/>.</t> | <t>all registrations follow the template presented in <xref target=" IANA-resource-registration-request-template"/>.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the parameter's definition is sufficiently orthogonal to other pa rameters defined in the registry so as avoid overlapping functionality.</t> | <t>the parameter's definition is sufficiently orthogonal to other pa rameters defined in the registry so as avoid overlapping functionality.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the parameter's definition specifies the syntax and semantics of the parameter in sufficient detail to allow for the AS and RS to be able to comm unicate the resource set.</t> | <t>the parameter's definition specifies the syntax and semantics of the parameter in sufficient detail to allow for the AS and RS to be able to comm unicate the resource set.</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="IANA-resource-registration-request-template"> | <section anchor="IANA-resource-registration-request-template"> | |||
<name>Registry Template</name> | <name>Registry Template</name> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>Name</dt> | <dt>Name:</dt> | |||
<dd> | <dd> | |||
<t>The name of the parameter.</t> | The name of the parameter. | |||
</dd> | </dd> | |||
<dt>Type</dt> | <dt>Type:</dt> | |||
<dd> | <dd> | |||
<t>The JSON data type of the parameter value.</t> | The JSON data type of the parameter value. | |||
</dd> | </dd> | |||
<dt>Reference</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t>The specification that defines the token.</t> | The specification that defines the token. | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-resource-registration-request-contents"> | <section anchor="IANA-resource-registration-request-contents"> | |||
<name>Initial Registry Contents</name> | <name>Initial Registry Contents</name> | |||
<t>The table below contains the initial contents of the GNAP Resource Set Registration Request Parameters Registry.</t> | <t>The table below contains the initial contents of the "GNAP Resource Set Registration Request Parameters" registry.</t> | |||
<table> | <table> | |||
<name>Initial contents of the GNAP Resource Set Registration Request Parameters Registry.</name> | <name>Initial Contents of the GNAP Resource Set Registration Request Parameters Registry</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Name</th> | <th align="left">Name</th> | |||
<th align="left">Type</th> | <th align="left">Type</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">access</td> | <td align="left">access</td> | |||
<td align="left">array of strings/objects</td> | <td align="left">array of strings/objects</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="rs-register-resource-handle"/> of RFC xxxx</td> | <xref target="rs-register-resource-handle"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">resource_server</td> | <td align="left">resource_server</td> | |||
<td align="left">string or object</td> | <td align="left">object/string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="rs-register-resource-handle"/> of RFC xxxx</td> | <xref target="rs-register-resource-handle"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">token_formats_supported</td> | <td align="left">token_formats_supported</td> | |||
<td align="left">string</td> | <td align="left">array of strings</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="rs-register-resource-handle"/> of RFC xxxx</td> | <xref target="rs-register-resource-handle"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">token_introspection_required</td> | <td align="left">token_introspection_required</td> | |||
<td align="left">boolean</td> | <td align="left">boolean</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="rs-register-resource-handle"/> of RFC xxxx</td> | <xref target="rs-register-resource-handle"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="IANA-resource-registration-response"> | <section anchor="IANA-resource-registration-response"> | |||
<name>GNAP Resource Set Registration Response Parameters</name> | <name>GNAP Resource Set Registration Response Parameters</name> | |||
<t>This document defines a means to register a resource set for a GNAP A | <t>This document defines a means to register a resource set for a GNAP A | |||
S, for which IANA is asked to create and maintain a new registry titled "GNAP Re | S, for which IANA has created and maintains a new registry titled "GNAP Resource | |||
source Set Registration Response Parameters". Initial values for this registry a | Set Registration Response Parameters". Initial values for this registry are giv | |||
re given in <xref target="IANA-resource-registration-response-contents"/>. Futur | en in <xref target="IANA-resource-registration-response-contents"/>. Future assi | |||
e assignments and modifications to existing assignment are to be made through th | gnments and modifications to existing assignment are to be made through the Expe | |||
e Expert Review registration policy <xref target="RFC8126"/>.</t> | rt Review registration policy <xref target="RFC8126"/>.</t> | |||
<t>The Designated Expert (DE) is expected to ensure that:</t> | <t>The DE is expected to ensure that:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>all registrations follow the template presented in <xref target=" IANA-resource-registration-response-template"/>.</t> | <t>all registrations follow the template presented in <xref target=" IANA-resource-registration-response-template"/>.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the parameter's definition is sufficiently orthogonal to other cl aims defined in the registry so as avoid overlapping functionality.</t> | <t>the parameter's definition is sufficiently orthogonal to other cl aims defined in the registry so as avoid overlapping functionality.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the parameter's definition specifies the syntax and semantics of the claim in sufficient detail to allow for the AS and RS to be able to communic ate the resource set.</t> | <t>the parameter's definition specifies the syntax and semantics of the claim in sufficient detail to allow for the AS and RS to be able to communic ate the resource set.</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="IANA-resource-registration-response-template"> | <section anchor="IANA-resource-registration-response-template"> | |||
<name>Registry Template</name> | <name>Registry Template</name> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>Name</dt> | <dt>Name:</dt> | |||
<dd> | <dd> | |||
<t>The name of the parameter.</t> | The name of the parameter. | |||
</dd> | </dd> | |||
<dt>Type</dt> | <dt>Type:</dt> | |||
<dd> | <dd> | |||
<t>The JSON data type of the parameter value.</t> | The JSON data type of the parameter value. | |||
</dd> | </dd> | |||
<dt>Reference</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t>The specification that defines the parameter.</t> | The specification that defines the parameter. | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-resource-registration-response-contents"> | <section anchor="IANA-resource-registration-response-contents"> | |||
<name>Initial Registry Contents</name> | <name>Initial Registry Contents</name> | |||
<t>The table below contains the initial contents of the GNAP Resource Set Registration Response Parameters Registry.</t> | <t>The table below contains the initial contents of the "GNAP Resource Set Registration Response Parameters" registry.</t> | |||
<table> | <table> | |||
<name>Initial contents of the GNAP Resource Set Registration Respons e Parameters Registry.</name> | <name>Initial Contents of the GNAP Resource Set Registration Respons e Parameters Registry</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Name</th> | <th align="left">Name</th> | |||
<th align="left">Type</th> | <th align="left">Type</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">resource_reference</td> | <td align="left">resource_reference</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="rs-register-resource-handle"/> of RFC xxxx</td> | <xref target="rs-register-resource-handle"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">instance_id</td> | <td align="left">instance_id</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="rs-register-resource-handle"/> of RFC xxxx</td> | <xref target="rs-register-resource-handle"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">introspection_endpoint</td> | <td align="left">introspection_endpoint</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="rs-register-resource-handle"/> of RFC xxxx</td> | <xref target="rs-register-resource-handle"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="IANA-rs-discovery"> | <section anchor="IANA-rs-discovery"> | |||
<name>GNAP RS-Facing Discovery Document Fields</name> | <name>GNAP RS-Facing Discovery Document Fields</name> | |||
<t>This document defines a means to for a GNAP AS to be discovered by a | <t>This document defines a means to for a GNAP AS to be discovered by a | |||
GNAP RS, for which IANA is asked to create and maintain a new registry titled "G | GNAP RS, for which IANA has created and maintains a new registry titled "GNAP RS | |||
NAP RS-Facing Discovery Document Fields". Initial values for this registry are g | -Facing Discovery Document Fields". Initial values for this registry are given i | |||
iven in <xref target="IANA-rs-discovery-contents"/>. Future assignments and modi | n <xref target="IANA-rs-discovery-contents"/>. Future assignments and modificati | |||
fications to existing assignment are to be made through the Expert Review regist | ons to existing assignment are to be made through the Expert Review registration | |||
ration policy <xref target="RFC8126"/>.</t> | policy <xref target="RFC8126"/>.</t> | |||
<t>The Designated Expert (DE) is expected to ensure that:</t> | <t>The DE is expected to ensure that:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>all registrations follow the template presented in <xref target=" IANA-rs-discovery-template"/>.</t> | <t>all registrations follow the template presented in <xref target=" IANA-rs-discovery-template"/>.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the field's definition is sufficiently orthogonal to other fields defined in the registry so as avoid overlapping functionality.</t> | <t>the field's definition is sufficiently orthogonal to other fields defined in the registry so as avoid overlapping functionality.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the field's definition specifies the syntax and semantics of the fields in sufficient detail to allow for RS to be able to communicate with the A S.</t> | <t>the field's definition specifies the syntax and semantics of the fields in sufficient detail to allow for the RS to be able to communicate with t he AS.</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="IANA-rs-discovery-template"> | <section anchor="IANA-rs-discovery-template"> | |||
<name>Registry Template</name> | <name>Registry Template</name> | |||
<dl> | <dl newline="false" spacing="compact"> | |||
<dt>Name</dt> | <dt>Name:</dt> | |||
<dd> | <dd> | |||
<t>The name of the field.</t> | The name of the field. | |||
</dd> | </dd> | |||
<dt>Type</dt> | <dt>Type:</dt> | |||
<dd> | <dd> | |||
<t>The JSON data type of the field value.</t> | The JSON data type of the field value. | |||
</dd> | </dd> | |||
<dt>Reference</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t>The specification that defines the field.</t> | The specification that defines the field. | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-rs-discovery-contents"> | <section anchor="IANA-rs-discovery-contents"> | |||
<name>Initial Registry Contents</name> | <name>Initial Registry Contents</name> | |||
<t>The table below contains the initial contents of the GNAP RS-Facing Discovery Registry.</t> | <t>The table below contains the initial contents of the "GNAP RS-Facin g Discovery Document Fields" registry.</t> | |||
<table> | <table> | |||
<name>Initial contents of the GNAP RS-Facing Discovery Document Fiel ds Registry.</name> | <name>Initial Contents of the GNAP RS-Facing Discovery Document Fiel ds Registry</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Name</th> | <th align="left">Name</th> | |||
<th align="left">Type</th> | <th align="left">Type</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">introspection_endpoint</td> | <td align="left">introspection_endpoint</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="discovery"/> of RFC xxxx</td> | <xref target="discovery"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">token_formats_supported</td> | <td align="left">token_formats_supported</td> | |||
<td align="left">array of strings</td> | <td align="left">array of strings</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="discovery"/> of RFC xxxx</td> | <xref target="discovery"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">resource_registration_endpoint</td> | <td align="left">resource_registration_endpoint</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="discovery"/> of RFC xxxx</td> | <xref target="discovery"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">grant_request_endpoint</td> | <td align="left">grant_request_endpoint</td> | |||
<td align="left">string</td> | <td align="left">string</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="discovery"/> of RFC xxxx</td> | <xref target="discovery"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">key_proofs_supported</td> | <td align="left">key_proofs_supported</td> | |||
<td align="left">array of strings</td> | <td align="left">array of strings</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="discovery"/> of RFC xxxx</td> | <xref target="discovery"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="IANA-error-code"> | <section anchor="IANA-error-code"> | |||
<name>GNAP RS-Facing Error Codes</name> | <name>GNAP RS-Facing Error Codes</name> | |||
<t>This document defines a set of errors that the AS can return to the R S, for which IANA is asked to create and maintain a new registry titled "GNAP RS -Facing Error Codes". Initial values for this registry are given in <xref target ="IANA-error-code-contents"/>. Future assignments and modifications to existing assignment are to be made through the Specification Required registration policy <xref target="RFC8126"/>.</t> | <t>This document defines a set of errors that the AS can return to the R S, for which IANA has created and maintains a new registry titled "GNAP RS-Facin g Error Codes". Initial values for this registry are given in <xref target="IANA -error-code-contents"/>. Future assignments and modifications to existing assign ments are to be made through the Specification Required registration policy <xre f target="RFC8126"/>.</t> | |||
<t>The DE is expected to ensure that:</t> | <t>The DE is expected to ensure that:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>all registrations follow the template presented in <xref target=" IANA-error-code-template"/>.</t> | <t>all registrations follow the template presented in <xref target=" IANA-error-code-template"/>.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the error response is sufficiently unique from other errors to pr ovide actionable information to the client instance.</t> | <t>the error response is sufficiently unique from other errors to pr ovide actionable information to the client instance.</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>the definition of the error response specifies all conditions in which the error response is returned, and what the client instance's expected ac tion is.</t> | <t>the definition of the error response specifies all conditions in which the error response is returned and what the client instance's expected act ion is.</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<section anchor="IANA-error-code-template"> | <section anchor="IANA-error-code-template"> | |||
<name>Registration Template</name> | <name>Registration Template</name> | |||
<dl newline="true"> | <dl newline="false" spacing="compact"> | |||
<dt>Error:</dt> | <dt>Error:</dt> | |||
<dd> | <dd> | |||
<t>A unique string code for the error.</t> | A unique string code for the error. | |||
</dd> | </dd> | |||
<dt>Specification document(s):</dt> | <dt>Reference:</dt> | |||
<dd> | <dd> | |||
<t>Reference to the document(s) that specify the | Reference to the document(s) that specifies the | |||
value, preferably including a URI that can be used | value, preferably including a URI that can be used | |||
to retrieve a copy of the document(s). An indication of the | to retrieve a copy of the document(s). An indication of the | |||
relevant sections may also be included but is not required.</t> | relevant sections may also be included but is not required. | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="IANA-error-code-contents"> | <section anchor="IANA-error-code-contents"> | |||
<name>Initial Contents</name> | <name>Initial Contents</name> | |||
<table> | <table> | |||
<name>Initial contents of the GNAP RS-Facing Error Codes Registry.</ name> | <name>Initial Contents of the GNAP RS-Facing Error Codes Registry</n ame> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Error</th> | <th align="left">Error</th> | |||
<th align="left">Specification document(s)</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">invalid_request</td> | <td align="left">invalid_request</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="response-error"/> of RFC xxxx</td> | <xref target="response-error"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">invalid_resource_server</td> | <td align="left">invalid_resource_server</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="response-error"/> of RFC xxxx</td> | <xref target="response-error"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">invalid_access</td> | <td align="left">invalid_access</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="response-error"/> of RFC xxxx</td> | <xref target="response-error"/> of RFC 9767</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="Security"> | <section anchor="Security"> | |||
<name>Security Considerations</name> | <name>Security Considerations</name> | |||
<t>In addition to the normative requirements in this document and in <xref | <t>In addition to the normative requirements in this document and in <xref | |||
target="GNAP"/>, implementers are | target="RFC9635"/>, implementers are | |||
strongly encouraged to consider these additional security considerations in impl | strongly encouraged to consider the following additional security considerations | |||
ementations | in implementations | |||
and deployments of GNAP.</t> | and deployments of GNAP.</t> | |||
<section anchor="security-tls"> | <section anchor="security-tls"> | |||
<name>TLS Protection in Transit</name> | <name>TLS Protection in Transit</name> | |||
<t>All requests in GNAP made over untrusted network connections have to be made over TLS as outlined in <xref target="BCP195"/> | <t>All requests in GNAP made over untrusted network connections have to be made over TLS as outlined in <xref target="BCP195"/> | |||
to protect the contents of the request and response from manipulation and interc eption by an attacker. | to protect the contents of the request and response from manipulation and interc eption by an attacker. | |||
This includes all requests from a client instance to the RS and all requests fro m the RS to an AS.</t> | This includes all requests from a client instance to the RS and all requests fro m the RS to an AS.</t> | |||
</section> | </section> | |||
<section anchor="security-token-validation"> | <section anchor="security-token-validation"> | |||
<name>Token Validation</name> | <name>Token Validation</name> | |||
<t>The RS has a responsibility to validate the incoming access token in a manner consistent with its deployment. | <t>The RS has a responsibility to validate the incoming access token in a manner consistent with its deployment. | |||
For self-contained stateless tokens such as those described in <xref target="tok en-format"/>, this consists of actions such | For self-contained stateless tokens such as those described in <xref target="tok en-format"/>, this consists of actions such | |||
as validating the token's signature and ensuring the relevant fields and results are appropriate for the | as validating the token's signature and ensuring the relevant fields and results are appropriate for the | |||
request being made. For reference-style tokens or tokens that are otherwise opaq ue to the RS, the token introspection | request being made. For reference-style tokens or tokens that are otherwise opaq ue to the RS, the token introspection | |||
RS-facing API can be used to provide updated information about the state of the token, as described in <xref target="introspection"/>.</t> | RS-facing API can be used to provide updated information about the state of the token, as described in <xref target="introspection"/>.</t> | |||
<t>The RS needs to validate that a token:</t> | <t>The RS needs to validate that a token:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>Is intended for this RS (audience restriction)</t> | <t>is intended for this RS (audience restriction)</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>Is presented using the appropriate key for the token (see also <x ref target="security-key-proof"/>)</t> | <t>is presented using the appropriate key for the token (see also <x ref target="security-key-proof"/>)</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>Identifies an appropriate subject to access the resource (usually this is the resource owner who authorized the token's issuance)</t> | <t>identifies an appropriate subject to access the resource (usually this is the resource owner who authorized the token's issuance)</t> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>Is issued by a trusted AS for this resource</t> | <t>is issued by a trusted AS for this resource</t> | |||
</li> | </li> | |||
</ul> | </ul> | |||
<t>Even though key proofing mechanisms have to cover the value of the to ken, validating the key proofing alone | <t>Even though key proofing mechanisms have to cover the value of the to ken, validating the key proofing alone | |||
is not sufficient to protect a request to an RS. | is not sufficient to protect a request to an RS. | |||
If an RS validates only the presentation method as described in <xref target="se curity-key-proof"/> without validating the | If an RS validates only the presentation method as described in <xref target="se curity-key-proof"/> without validating the | |||
token itself, an attacker could use a compromised key or a confused deputy to ma ke arbitrary calls to the RS | token itself, an attacker could use a compromised key or a confused deputy to ma ke arbitrary calls to the RS | |||
beyond what has been authorized by the RO.</t> | beyond what has been authorized by the RO.</t> | |||
</section> | </section> | |||
<section anchor="security-token-cache"> | <section anchor="security-token-cache"> | |||
<name>Caching Token Validation Result</name> | <name>Caching Token Validation Result</name> | |||
<t>Since token validation can be an expensive process, requiring either cryptographic operations or network calls to an introspection | <t>Since token validation can be an expensive process, requiring either cryptographic operations or network calls to an introspection | |||
service as described in <xref target="introspection"/>, an RS could cache the re sults of token validation for a particular token. | service as described in <xref target="introspection"/>, an RS could cache the re sults of token validation for a particular token. | |||
The trade offs of using a cached validation for a token present an important dec ision space for implementers: relying on a cached validation result | The trade-off for using a cached validation for a token presents an important de cision space for implementers: relying on a cached validation result | |||
increases performance and lowers processing overhead, but it comes at the expens e of the liveness and accuracy of the information | increases performance and lowers processing overhead, but it comes at the expens e of the liveness and accuracy of the information | |||
in the cache. While a cached value is in use at the RS, an attacker could presen t a revoked token and have it accepted by the RS.</t> | in the cache. While a cached value is in use at the RS, an attacker could presen t a revoked token and have it accepted by the RS.</t> | |||
<t>As with any cache, the consistency of this cache can be managed in a variety of ways. One of the most simple | <t>As with any cache, the consistency of this cache can be managed in a variety of ways. One of the most simple | |||
methods is managing the lifetime of the cache in order to balance the performanc e and security properties. | methods is managing the lifetime of the cache in order to balance the performanc e and security properties. | |||
Too long of a cache, and an attacker has a larger window in which to use a revok | If the cache is too long, an attacker has a larger window in which to use a revo | |||
ed token. Too short of a window and | ked token. If the window is too short, the benefits of using the cache are dimin | |||
the benefits of using the cache are diminished. | ished. | |||
It is also possible that an AS could send a proactive signal to the RS to invali date revoked access tokens, though such a mechanism | It is also possible that an AS could send a proactive signal to the RS to invali date revoked access tokens, though such a mechanism | |||
is outside the scope of this specification.</t> | is outside the scope of this specification.</t> | |||
</section> | </section> | |||
<section anchor="security-key-proof"> | <section anchor="security-key-proof"> | |||
<name>Key Proof Validation</name> | <name>Key Proof Validation</name> | |||
<t>For key-bound access tokens, the proofing method needs to be validate | <t>For key-bound access tokens, the proofing method needs to be validate | |||
d alongside the value of the token itself as described in <xref target="security | d alongside the value of the token itself, as described in <xref target="securit | |||
-token-validation"/>. | y-token-validation"/>. | |||
The process of validation is defined by the key proofing method, as described in | The process of validation is defined by the key proofing method, as described in | |||
<xref section="7.3" sectionFormat="of" target="GNAP"/>.</t> | <xref section="7.3" sectionFormat="of" target="RFC9635"/>.</t> | |||
<t>If the proofing method is not validated, an attacker could use a comp romised token without access to the token's bound key.</t> | <t>If the proofing method is not validated, an attacker could use a comp romised token without access to the token's bound key.</t> | |||
<t>The RS also needs to ensure that the proofing method is appropriate f | <t>The RS also needs to ensure that the proofing method is appropriate f | |||
or the key associated with the token, including any choice of | or the key associated with the token, including any choice of algorithm or ident | |||
algorithm or identifiers.</t> | ifiers.</t> | |||
<t>The proofing should be validated independently on each request to the RS, particularly as aspects of the call could vary. | <t>The proofing should be validated independently on each request to the RS, particularly as aspects of the call could vary. | |||
As such, the RS should never cache the results of a proof validation from one me ssage and apply it to a subsequent message.</t> | As such, the RS should never cache the results of a proof validation from one me ssage and apply it to a subsequent message.</t> | |||
</section> | </section> | |||
<section anchor="token-exfiltration"> | <section anchor="token-exfiltration"> | |||
<name>Token Exfiltration</name> | <name>Token Exfiltration</name> | |||
<t>Since the RS sees the token value, it is possible for a compromised R S to leak that value to an attacker. | <t>Since the RS sees the token value, it is possible for a compromised R S to leak that value to an attacker. | |||
As such, the RS needs to protect token values as sensitive information and prote ct them from exfiltration.</t> | As such, the RS needs to protect token values as sensitive information and prote ct them from exfiltration.</t> | |||
<t>This is especially problematic with bearer tokens and tokens bound to a shared key, since an RS has access | <t>This is especially problematic with bearer tokens and tokens bound to a shared key, since an RS has access | |||
to all information necessary to create a new, valid request using the token in q uestion.</t> | to all information necessary to create a new, valid request using the token in q uestion.</t> | |||
</section> | </section> | |||
<section anchor="security-token-reuse-by-rs"> | <section anchor="security-token-reuse-by-rs"> | |||
<name>Token Re-Use by an RS</name> | <name>Token Reuse by an RS</name> | |||
<t>If the access token is a bearer token, or the RS has access to the ke y material needed to present the token, | <t>If the access token is a bearer token, or the RS has access to the ke y material needed to present the token, | |||
the RS could be tricked into re-using an access token presented to it by a clien t. While it is possible to build | the RS could be tricked into reusing an access token presented to it by a client . While it is possible to build | |||
a system that makes use of this artifact as a feature, it is safer to exchange t he incoming access token for | a system that makes use of this artifact as a feature, it is safer to exchange t he incoming access token for | |||
another contextual token for use by the RS, as described in <xref target="token- chaining"/>. This access token can be bound | another contextual token for use by the RS, as described in <xref target="token- chaining"/>. This access token can be bound | |||
to the RS's own keys and limited to access needed by the RS, instead of the full set of rights associated with | to the RS's own keys and limited to access needed by the RS, instead of the full set of rights associated with | |||
the token issued to the client instance.</t> | the token issued to the client instance.</t> | |||
</section> | </section> | |||
<section anchor="token-format-considerations"> | <section anchor="token-format-considerations"> | |||
<name>Token Format Considerations</name> | <name>Token Format Considerations</name> | |||
<t>With formatted tokens, the format of the token is likely to have its own considerations, and the RS needs | <t>With formatted tokens, the format of the token is likely to have its own considerations, and the RS needs | |||
to follow any such considerations during the token validation process. The appli cation and scope of | to follow any such considerations during the token validation process. The appli cation and scope of | |||
these considerations is specific to the format and outside the scope of this spe cification.</t> | these considerations is specific to the format and outside the scope of this spe cification.</t> | |||
</section> | </section> | |||
<section anchor="over-sharing-token-contents"> | <section anchor="over-sharing-token-contents"> | |||
<name>Over-sharing Token Contents</name> | <name>Oversharing Token Contents</name> | |||
<t>The contents of the access token model divulge to the RS information | ||||
about the access token's context and rights. | <t>The contents of the access token model divulge information about the | |||
access token's context and rights to the RS. | ||||
This is true whether the contents are parsed from the token itself or sent in an introspection response.</t> | This is true whether the contents are parsed from the token itself or sent in an introspection response.</t> | |||
<t>It's likely that every RS does not need to know all details of the to ken model, especially in systems where | <t>It's likely that every RS does not need to know all details of the to ken model, especially in systems where | |||
a single access token is usable across multiple RS's. An attacker could use this to gain information about | a single access token is usable across multiple RSs. An attacker could use this to gain information about | |||
the larger system by compromising only one RS. By limiting the information avail able to only | the larger system by compromising only one RS. By limiting the information avail able to only | |||
that which is relevant to a specific RS, such as using a limited introspection r eply as defined in <xref target="introspection"/>, | that which is relevant to a specific RS, such as using a limited introspection r eply as defined in <xref target="introspection"/>, | |||
a system can follow the principle of least disclosure to each RS.</t> | a system can follow the principle of least disclosure to each RS.</t> | |||
</section> | </section> | |||
<section anchor="resource-references"> | <section anchor="resource-references"> | |||
<name>Resource References</name> | <name>Resource References</name> | |||
<t>Resource references, as returned by the protocol in <xref target="rs- register-resource-handle"/>, are intended to be opaque to | <t>Resource references, as returned by the protocol in <xref target="rs- register-resource-handle"/>, are intended to be opaque to | |||
both the RS and the client. However, since they are under the control of the AS, the AS can put whatever content | both the RS and the client. However, since they are under the control of the AS, the AS can put whatever content | |||
it wants into the reference value. This value could unintentionally disclose sys tem structure or other internal | it wants into the reference value. This value could unintentionally disclose sys tem structure or other internal | |||
details if it processed by an unintended party. Furthermore, such patterns could lead to the client software and | details if it was processed by an unintended party. Furthermore, such patterns c ould lead to the client software and | |||
RS depending on certain structures being present in the reference value, which d iminishes the separation of concerns | RS depending on certain structures being present in the reference value, which d iminishes the separation of concerns | |||
of the different roles in a GNAP system.</t> | of the different roles in a GNAP system.</t> | |||
<t>To mitigate this, the AS should only use fully random or encrypted va lues for resource references.</t> | <t>To mitigate this, the AS should only use fully random or encrypted va lues for resource references.</t> | |||
</section> | </section> | |||
<section anchor="token-re-issuance-from-an-untrusted-as"> | <section anchor="token-re-issuance-from-an-untrusted-as"> | |||
<name>Token Re-Issuance From an Untrusted AS</name> | <name>Token Reissuance from an Untrusted AS</name> | |||
<t>It is possible for an attacker's client instance to issue its own tok ens to another client instance, acting as | <t>It is possible for an attacker's client instance to issue its own tok ens to another client instance, acting as | |||
an AS that the second client instance has chosen to trust. If the token is a bea rer token or the re-issuance | an AS that the second client instance has chosen to trust. If the token is a bea rer token or the reissuance | |||
is bound using an AS-provided key, the target client instance will not be able t o tell that the token was originally | is bound using an AS-provided key, the target client instance will not be able t o tell that the token was originally | |||
issued by the valid AS. This process allows an attacker to insert their own sess ion and rights into an unsuspecting | issued by the valid AS. This process allows an attacker to insert their own sess ion and rights into an unsuspecting | |||
client instance, in the guise of a token valid for the attacker that appears to have been issued to the target | client instance in the guise of a valid token for the attacker that appears to h ave been issued to the target | |||
client instance on behalf of its own RO.</t> | client instance on behalf of its own RO.</t> | |||
<t>This attack is predicated on a misconfiguration with the targeted cli ent, as it has been configured to get tokens | <t>This attack is predicated on a misconfiguration with the targeted cli ent, as it has been configured to get tokens | |||
from the attacker's AS and use those tokens with the target RS, which has no ass ociation with the attacker's AS. | from the attacker's AS and use those tokens with the target RS, which has no ass ociation with the attacker's AS. | |||
However, since the token is ultimately coming from the trusted AS, and is being presented with a valid key, | However, since the token is ultimately coming from the trusted AS and is being p resented with a valid key, | |||
the RS has no way of telling that the token was passed through an intermediary.< /t> | the RS has no way of telling that the token was passed through an intermediary.< /t> | |||
<t>To mitigate this, the RS can publish its association with the trusted AS through either discovery or documentation. | <t>To mitigate this, the RS can publish its association with the trusted AS through either discovery or documentation. | |||
Therefore, a client properly following this association would only go directly t | Therefore, a client properly following this association would only go directly t | |||
o the trusted RS directly for | o the trusted RS for | |||
access tokens for the RS.</t> | access tokens for the RS.</t> | |||
<t>Furthermore, limiting the use of bearer tokens and AS-provided keys t | ||||
o only highly trusted AS's and limited circumstances | <t>Furthermore, limiting the use of bearer tokens and AS-provided keys t | |||
prevents the attacker from being able to willingly exfiltrate their token to an | o only highly trusted ASs in certain circumstances prevents the attacker from be | |||
unsuspecting client instance.</t> | ing able to willingly exfiltrate their token to an unsuspecting client instance. | |||
</t> | ||||
</section> | </section> | |||
<section anchor="introspection-of-token-keys"> | <section anchor="introspection-of-token-keys"> | |||
<name>Introspection of Token Keys</name> | <name>Introspection of Token Keys</name> | |||
<t>The introspection response defined in <xref target="introspection"/> | <t>The introspection response defined in <xref target="introspection"/> | |||
provides a means for the AS to tell the RS the key | provides a means for the AS to tell the RS what key material is needed to valida | |||
material needed to validate the key proof of the request. Capture of the introsp | te the key proof of the request. Capture of the introspection response can expos | |||
ection response can expose | e | |||
these security keys to an attacker. In the case of asymmetric cryptography, only the public key is exposed, | these security keys to an attacker. In the case of asymmetric cryptography, only the public key is exposed, | |||
and the token cannot be re-used by the attacker based on this result alone. This could potentially divulge | and the token cannot be reused by the attacker based on this result alone. This could potentially divulge | |||
information about the client instance that was unknown otherwise.</t> | information about the client instance that was unknown otherwise.</t> | |||
<t>If an access token is bound to a symmetric key, the RS will need acce ss to the full key value in order to validate | <t>If an access token is bound to a symmetric key, the RS will need acce ss to the full key value in order to validate | |||
the key proof of the request, as described in <xref target="security-key-proof"/ >. However, divulging the key | the key proof of the request, as described in <xref target="security-key-proof"/ >. However, divulging the key | |||
material to the RS also gives the RS the ability to create a new request with th e token. | material to the RS also gives the RS the ability to create a new request with th e token. | |||
In this circumstance, the RS is under similar risk of token exfiltration and | In this circumstance, the RS is under similar risk of token exfiltration and | |||
re-use as a bearer token, as described in <xref target="security-token-reuse-by- rs"/>. Consequently, symmetric | reuse as a bearer token, as described in <xref target="security-token-reuse-by-r s"/>. Consequently, symmetric | |||
keys should only be used in systems where the RS can be fully trusted to not cre ate a new request with | keys should only be used in systems where the RS can be fully trusted to not cre ate a new request with | |||
tokens presented to it.</t> | tokens presented to it.</t> | |||
</section> | </section> | |||
<section anchor="security-rs-registration"> | <section anchor="security-rs-registration"> | |||
<name>RS Registration and Management</name> | <name>RS Registration and Management</name> | |||
<t>Most functions of the RS-facing API in <xref target="rs-facing-api"/> are protected by requiring the RS to | <t>Most functions of the RS-facing API in <xref target="rs-facing-api"/> are protected by requiring the RS to | |||
present proof of a signing key along with the request, in order to identify the RS making the | present proof of a signing key along with the request, in order to identify the RS making the | |||
call, potentially coupled with an AS-specific access token. | call, potentially coupled with an AS-specific access token. | |||
This practice allows the AS to differentially respond to API calls to different RS's, such as | This practice allows the AS to differentially respond to API calls to different RSs, such as | |||
answering introspection calls with only the access rights relevant to a given RS instead of | answering introspection calls with only the access rights relevant to a given RS instead of | |||
all access rights an access token could be good for.</t> | all access rights an access token could be good for.</t> | |||
<t>While the means by which an RS and its keys become known to the AS is out of scope for this | <t>While the means by which an RS and its keys become known to the AS is out of scope for this | |||
specification, it is anticipated that common practice will be to statically regi ster an | specification, it is anticipated that common practice will be to statically regi ster an | |||
RS, allowing it to protect specific resources or certain classes of resources. | RS, allowing it to protect specific resources or certain classes of resources. | |||
Fundamentally, the RS can only offer the resources that it serves. However, a ro gue AS could | Fundamentally, the RS can only offer the resources that it serves. However, a ro gue AS could | |||
attempt to register a set of resources that mimics a different RS in order to so licit an access | attempt to register a set of resources that mimics a different RS in order to so licit an access | |||
token usable at the target RS. If the access token is a bearer token or is bound to a symmetric | token that is usable at the target RS. If the access token is a bearer token or is bound to a symmetric | |||
key that is known to the RS, then the attacker's RS gains the ability and knowle dge needed | key that is known to the RS, then the attacker's RS gains the ability and knowle dge needed | |||
to use that token elsewhere.</t> | to use that token elsewhere.</t> | |||
<t>In some ecosystems, dynamic registration of an RS and its associated resources is feasible. | <t>In some ecosystems, dynamic registration of an RS and its associated resources is feasible. | |||
In such systems, the identity of the RS could be conveyed by a URI passed in the <tt>location</tt> field | In such systems, the identity of the RS could be conveyed by a URI passed in the <tt>location</tt> field | |||
of an access rights request, thereby allowing the AS to limit the view the RS ha s into the | of an access rights request, thereby allowing the AS to limit the view the RS ha s into the | |||
larger system.</t> | larger system.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="Privacy"> | <section anchor="Privacy"> | |||
<name>Privacy Considerations</name> | <name>Privacy Considerations</name> | |||
<section anchor="token-contents"> | <section anchor="token-contents"> | |||
<name>Token Contents</name> | <name>Token Contents</name> | |||
<t>The contents of the access token could potentially contain personal i nformation about the end-user, RO, or other parties. | <t>The contents of the access token could potentially contain personal i nformation about the end user, RO, or other parties. | |||
This is true whether the contents are parsed from the token itself or sent in an introspection response.</t> | This is true whether the contents are parsed from the token itself or sent in an introspection response.</t> | |||
<t>While an RS will sometimes need this information for processing, it's often the case that an RS is exposed to these | <t>While an RS will sometimes need this information for processing, it's often the case that an RS is exposed to these | |||
details only in passing, and not intentionally. For example, consider a client t hat is issued an access token that is | details only in passing, and not intentionally. For example, consider a client t hat has been issued an access token that is | |||
usable for both medical and non-medical APIs. If this access token contains a me dical record number to facilitate the | usable for both medical and non-medical APIs. If this access token contains a me dical record number to facilitate the | |||
RS serving the medical API, then any RS for a non-medical API would also learn t he user's medical record number | RS serving the medical API, then any RS for a non-medical API would also learn t he user's medical record number | |||
in the process, even though that API has no need to make such a correlation.</t> | in the process, even though that API has no need to make such a correlation.</t> | |||
<t>To mitigate this, a formatted token could contain separate sections t argeted to different RS's to segregate data. | <t>To mitigate this, a formatted token could contain separate sections t argeted to different RSs to segregate data. | |||
Alternatively, token introspection can be used to limit the data returned to eac h RS, as defined in <xref target="introspection"/>.</t> | Alternatively, token introspection can be used to limit the data returned to eac h RS, as defined in <xref target="introspection"/>.</t> | |||
</section> | </section> | |||
<section anchor="token-use-disclosure-through-introspection"> | <section anchor="token-use-disclosure-through-introspection"> | |||
<name>Token Use Disclosure through Introspection</name> | <name>Token Use Disclosure through Introspection</name> | |||
<t>When introspection is used by an RS, the AS is made aware of a partic ular token being used at a particular RS. | <t>When introspection is used by an RS, the AS is made aware of a partic ular token being used at a particular RS. | |||
When the RS is a separate system, the AS would not otherwise have insight into t his action. This can potentially | When the RS is a separate system, the AS would not otherwise have insight into t his action. This can potentially | |||
lead to the AS learning about patterns and actions of particular end users by wa tching which RS's are accessed | lead to the AS learning about patterns and actions of particular end users by wa tching which RSs are accessed | |||
and when.</t> | and when.</t> | |||
</section> | </section> | |||
<section anchor="mapping-a-user-to-an-as"> | <section anchor="mapping-a-user-to-an-as"> | |||
<name>Mapping a User to an AS</name> | <name>Mapping a User to an AS</name> | |||
<t>When the client instance receives information about the protecting AS from an RS, this can be used to | <t>When the client instance receives information about the protecting AS from an RS, it can be used to | |||
derive information about the resources being protected without releasing the res ources themselves. For example, | derive information about the resources being protected without releasing the res ources themselves. For example, | |||
if a medical record is protected by a personal AS, an untrusted client could cal l an RS to discover the location | if a medical record is protected by a personal AS, an untrusted client could cal l an RS to discover the location | |||
of the AS protecting the record. Since the AS is tied strongly to a single RO, t he untrusted and unauthorized client | of the AS protecting the record. Since the AS is tied strongly to a single RO, t he untrusted and unauthorized client | |||
software can gain information about the resource being protected without accessi ng the record itself.</t> | software can gain information about the resource being protected without accessi ng the record itself.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="Acknowledgements"> | ||||
<name>Acknowledgements</name> | ||||
<t>The editors would like to thank the feedback of the following individua | ||||
ls for their reviews, | ||||
implementations, and contributions: | ||||
Aaron Parecki, | ||||
Adrian Gropper, | ||||
Andrii Deinega, | ||||
Annabelle Backman, | ||||
Dmitry Barinov, | ||||
Fabien Imbault, | ||||
Florian Helmschmidt, | ||||
George Fletcher, | ||||
Justin Richer, | ||||
Kathleen Moriarty, | ||||
Leif Johansson, | ||||
Mike Varley, | ||||
Nat Sakimura, | ||||
Takahiko Kawasaki, | ||||
Yaron Sheffer.</t> | ||||
<t>Finally, the editors want to acknowledge the immense contributions of A | ||||
aron Parecki to the content | ||||
of this document. We thank him for his insight, input, and hard work, without wh | ||||
ich GNAP would | ||||
not have grown to what it is.</t> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="RFC9635" to="GNAP"/> | ||||
<displayreference target="RFC7519" to="JWT"/> | ||||
<references> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references anchor="sec-normative-references"> | <references anchor="sec-normative-references"> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<reference anchor="BCP195" target="https://www.rfc-editor.org/info/bcp19 | <!-- [BCP195] --> | |||
5"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml9/reference.BCP. | |||
<front> | 0195.xml"/> | |||
<title>Recommendations for Secure Use of Transport Layer Security (T | ||||
LS) and Datagram Transport Layer Security (DTLS)</title> | ||||
<author initials="Y." surname="Sheffer"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="R." surname="Holz"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P." surname="Saint-Andre"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2015" month="May"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="RFC2119"> | ||||
<front> | ||||
<title>Key words for use in RFCs to Indicate Requirement Levels</tit | ||||
le> | ||||
<author fullname="S. Bradner" initials="S." surname="Bradner"/> | ||||
<date month="March" year="1997"/> | ||||
<abstract> | ||||
<t>In many standards track documents several words are used to sig | ||||
nify the requirements in the specification. These words are often capitalized. T | ||||
his document defines these words as they should be interpreted in IETF documents | ||||
. This document specifies an Internet Best Current Practices for the Internet Co | ||||
mmunity, and requests discussion and suggestions for improvements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="2119"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
</reference> | ||||
<reference anchor="RFC3986"> | ||||
<front> | ||||
<title>Uniform Resource Identifier (URI): Generic Syntax</title> | ||||
<author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee | ||||
"/> | ||||
<author fullname="R. Fielding" initials="R." surname="Fielding"/> | ||||
<author fullname="L. Masinter" initials="L." surname="Masinter"/> | ||||
<date month="January" year="2005"/> | ||||
<abstract> | ||||
<t>A Uniform Resource Identifier (URI) is a compact sequence of ch | ||||
aracters that identifies an abstract or physical resource. This specification de | ||||
fines the generic URI syntax and a process for resolving URI references that mig | ||||
ht be in relative form, along with guidelines and security considerations for th | ||||
e use of URIs on the Internet. The URI syntax defines a grammar that is a supers | ||||
et of all valid URIs, allowing an implementation to parse the common components | ||||
of a URI reference without knowing the scheme-specific requirements of every pos | ||||
sible identifier. This specification does not define a generative grammar for UR | ||||
Is; that task is performed by the individual specifications of each URI scheme. | ||||
[STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="STD" value="66"/> | ||||
<seriesInfo name="RFC" value="3986"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3986"/> | ||||
</reference> | ||||
<reference anchor="JWT"> | ||||
<front> | ||||
<title>JSON Web Token (JWT)</title> | ||||
<author fullname="M. Jones" initials="M." surname="Jones"/> | ||||
<author fullname="J. Bradley" initials="J." surname="Bradley"/> | ||||
<author fullname="N. Sakimura" initials="N." surname="Sakimura"/> | ||||
<date month="May" year="2015"/> | ||||
<abstract> | ||||
<t>JSON Web Token (JWT) is a compact, URL-safe means of representi | ||||
ng claims to be transferred between two parties. The claims in a JWT are encoded | ||||
as a JSON object that is used as the payload of a JSON Web Signature (JWS) stru | ||||
cture or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the | ||||
claims to be digitally signed or integrity protected with a Message Authenticat | ||||
ion Code (MAC) and/or encrypted.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7519"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7519"/> | ||||
</reference> | ||||
<reference anchor="RFC8174"> | ||||
<front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | ||||
tle> | ||||
<author fullname="B. Leiba" initials="B." surname="Leiba"/> | ||||
<date month="May" year="2017"/> | ||||
<abstract> | ||||
<t>RFC 2119 specifies common key words that may be used in protoco | ||||
l specifications. This document aims to reduce the ambiguity by clarifying that | ||||
only UPPERCASE usage of the key words have the defined special meanings.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="8174"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
</reference> | ||||
<reference anchor="RFC8259"> | ||||
<front> | ||||
<title>The JavaScript Object Notation (JSON) Data Interchange Format | ||||
</title> | ||||
<author fullname="T. Bray" initials="T." role="editor" surname="Bray | ||||
"/> | ||||
<date month="December" year="2017"/> | ||||
<abstract> | ||||
<t>JavaScript Object Notation (JSON) is a lightweight, text-based, | ||||
language-independent data interchange format. It was derived from the ECMAScrip | ||||
t Programming Language Standard. JSON defines a small set of formatting rules fo | ||||
r the portable representation of structured data.</t> | ||||
<t>This document removes inconsistencies with other specifications | ||||
of JSON, repairs specification errors, and offers experience-based interoperabi | ||||
lity guidance.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="STD" value="90"/> | ||||
<seriesInfo name="RFC" value="8259"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8259"/> | ||||
</reference> | ||||
<reference anchor="GNAP"> | ||||
<front> | ||||
<title>Grant Negotiation and Authorization Protocol</title> | ||||
<author fullname="Justin Richer" initials="J." surname="Richer"> | ||||
<organization>Bespoke Engineering</organization> | ||||
</author> | ||||
<author fullname="Fabien Imbault" initials="F." surname="Imbault"> | ||||
<organization>acert.io</organization> | ||||
</author> | ||||
<date day="19" month="March" year="2024"/> | ||||
<abstract> | ||||
<t> GNAP defines a mechanism for delegating authorization to a p | ||||
iece of | ||||
software, and conveying the results and artifacts of that delegation | ||||
to the software. This delegation can include access to a set of APIs | ||||
as well as subject information passed directly to the software. | ||||
</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
</abstract> | 119.xml"/> | |||
</front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | |||
<seriesInfo name="Internet-Draft" value="draft-ietf-gnap-core-protocol | 986.xml"/> | |||
-20"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | |||
</reference> | 519.xml"/> | |||
<reference anchor="RFC8792"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
<front> | 174.xml"/> | |||
<title>Handling Long Lines in Content of Internet-Drafts and RFCs</t | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
itle> | 259.xml"/> | |||
<author fullname="K. Watsen" initials="K." surname="Watsen"/> | <!-- [GNAP] I-D.ietf-gnap-core-protocol is now RFC 9635 --> | |||
<author fullname="E. Auerswald" initials="E." surname="Auerswald"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
<author fullname="A. Farrel" initials="A." surname="Farrel"/> | 635.xml"/> | |||
<author fullname="Q. Wu" initials="Q." surname="Wu"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
<date month="June" year="2020"/> | 792.xml"/> | |||
<abstract> | ||||
<t>This document defines two strategies for handling long lines in | ||||
width-bounded text content. One strategy, called the "single backslash" strateg | ||||
y, is based on the historical use of a single backslash ('\') character to indic | ||||
ate where line-folding has occurred, with the continuation occurring with the fi | ||||
rst character that is not a space character (' ') on the next line. The second s | ||||
trategy, called the "double backslash" strategy, extends the first strategy by a | ||||
dding a second backslash character to identify where the continuation begins and | ||||
is thereby able to handle cases not supported by the first strategy. Both strat | ||||
egies use a self-describing header enabling automated reconstitution of the orig | ||||
inal content.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8792"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8792"/> | ||||
</reference> | ||||
</references> | </references> | |||
<references anchor="sec-informative-references"> | <references anchor="sec-informative-references"> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<reference anchor="MACAROON" target="https://research.google/pubs/pub418 | <reference anchor="MACAROON" target="https://www.ndss-symposium.org/ndss | |||
92/"> | 2014/ | |||
ndss-2014-programme/macaroons-cookies-contextual-caveats- | ||||
decentralized-authorization-cloud/"> | ||||
<front> | <front> | |||
<title>Macaroons: Cookies with Contextual Caveats for Decentralized Authorization in the Cloud</title> | <title>Macaroons: Cookies with Contextual Caveats for Decentralized Authorization in the Cloud</title> | |||
<author> | <author fullname="Arnar Birgisson"/> | |||
<organization/> | <author fullname="Joe Gibbs Politz"/> | |||
</author> | <author fullname="Ulfar Erlingsson"/> | |||
<date year="2014"/> | <author fullname="Ankur Taly"/> | |||
<author fullname="Michael Vrable"/> | ||||
<author fullname="Mark Lentczner"/> | ||||
<date month="February" year="2014"/> | ||||
</front> | </front> | |||
<refcontent>NDSS Symposium 2014</refcontent> | ||||
<seriesInfo name="DOI" value="10.14722/ndss.2014.23212"/> | ||||
</reference> | </reference> | |||
<!-- [BISCUIT] --> | ||||
<reference anchor="BISCUIT" target="https://www.biscuitsec.org/"> | <reference anchor="BISCUIT" target="https://www.biscuitsec.org/"> | |||
<front> | <front> | |||
<title>Biscuit Authorization</title> | <title>Biscuit Authorization</title> | |||
<author> | <author> | |||
<organization/> | <organization>Biscuit</organization> | |||
</author> | </author> | |||
<date>n.d.</date> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<!-- [ZCAPLD] --> | ||||
<reference anchor="ZCAPLD" target="https://w3c-ccg.github.io/zcap-spec/" > | <reference anchor="ZCAPLD" target="https://w3c-ccg.github.io/zcap-spec/" > | |||
<front> | <front> | |||
<title>Authorization Capabilities for Linked Data</title> | <title>Authorization Capabilities for Linked Data v0.3</title> | |||
<author> | <author fullname="Christine Lemmer-Webber" role="editor"/> | |||
<organization/> | <author fullname="Manu Sporny" role="editor"/> | |||
</author> | <date month="January" year="2023"/> | |||
<date year="2023"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="RFC8126"> | ||||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs | ||||
</title> | ||||
<author fullname="M. Cotton" initials="M." surname="Cotton"/> | ||||
<author fullname="B. Leiba" initials="B." surname="Leiba"/> | ||||
<author fullname="T. Narten" initials="T." surname="Narten"/> | ||||
<date month="June" year="2017"/> | ||||
<abstract> | ||||
<t>Many protocols make use of points of extensibility that use con | ||||
stants to identify various protocol parameters. To ensure that the values in the | ||||
se fields do not have conflicting uses and to promote interoperability, their al | ||||
locations are often coordinated by a central record keeper. For IETF protocols, | ||||
that role is filled by the Internet Assigned Numbers Authority (IANA).</t> | ||||
<t>To make assignments in a given registry prudently, guidance des | ||||
cribing the conditions under which new values should be assigned, as well as whe | ||||
n and how modifications to existing values can be made, is needed. This document | ||||
defines a framework for the documentation of these guidelines by specification | ||||
authors, in order to assure that the provided guidance for the IANA Consideratio | ||||
ns is clear and addresses the various issues that are likely in the operation of | ||||
a registry.</t> | ||||
<t>This is the third edition of this document; it obsoletes RFC 52 | ||||
26.</t> | ||||
</abstract> | ||||
</front> | </front> | |||
<seriesInfo name="BCP" value="26"/> | <refcontent>W3C Draft Community Group Report</refcontent> | |||
<seriesInfo name="RFC" value="8126"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8126"/> | ||||
</reference> | </reference> | |||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 126.xml"/> | ||||
</references> | </references> | |||
</references> | </references> | |||
<?line 1517?> | <section anchor="Acknowledgements" numbered='false'> | |||
<name>Acknowledgements</name> | ||||
<section anchor="history"> | <t>The editors would like to thank the following | |||
<name>Document History</name> | individuals for their reviews, feedback, implementations, and contribution | |||
<ul spacing="normal"> | s: | |||
<li> | <contact fullname="Aaron Parecki"/>, <contact fullname="Adrian | |||
<t>-09 | Gropper"/>, <contact fullname="Andrii Deinega"/>, <contact | |||
</t> | fullname="Annabelle Backman"/>, <contact fullname="Dmitry Barinov"/>, | |||
<ul spacing="normal"> | <contact fullname="Fabien Imbault"/>, <contact fullname="Florian | |||
<li> | Helmschmidt"/>, <contact fullname="George Fletcher"/>, <contact | |||
<t>Updated description of well-known discovery endpoint.</t> | fullname="Justin Richer"/>, <contact fullname="Kathleen Moriarty"/>, | |||
</li> | <contact fullname="Leif Johansson"/>, <contact fullname="Mike Varley"/>, | |||
</ul> | <contact fullname="Nat Sakimura"/>, <contact fullname="Takahiko | |||
</li> | Kawasaki"/>, and <contact fullname="Yaron Sheffer"/>.</t> | |||
<li> | <t>Additionally, the editors want to acknowledge the immense contributions | |||
<t>-08 | of | |||
</t> | <contact fullname="Aaron Parecki"/> to the content of this document. We | |||
<ul spacing="normal"> | thank him for his insight, input, and hard work, without which GNAP | |||
<li> | would not have grown to what it is.</t> | |||
<t>Editorial and IANA updates based on review feedback.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-07 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Editorial updates based on review feedback.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-06 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Editorial updates based on review feedback.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-05 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Added discussion of access tokens used to call the RS-facing AS | ||||
APIs.</t> | ||||
</li> | ||||
<li> | ||||
<t>Updated IANA sections to align with core (and each other).</t> | ||||
</li> | ||||
<li> | ||||
<t>Added IANA section on introspection requests.</t> | ||||
</li> | ||||
<li> | ||||
<t>Added error responses.</t> | ||||
</li> | ||||
<li> | ||||
<t>Added extended discussion on resource server registration pract | ||||
ices.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-04 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Editorial cleanup.</t> | ||||
</li> | ||||
<li> | ||||
<t>Updated IANA requirements, including "specification required" r | ||||
egistration.</t> | ||||
</li> | ||||
<li> | ||||
<t>Added privacy and security considerations.</t> | ||||
</li> | ||||
<li> | ||||
<t>Clarified and expanded token introspection request and response | ||||
.</t> | ||||
</li> | ||||
<li> | ||||
<t>Clarified and expanded resource set registration request and re | ||||
sponse, include example of use of resource reference.</t> | ||||
</li> | ||||
<li> | ||||
<t>Updated discovery.</t> | ||||
</li> | ||||
<li> | ||||
<t>Allow optional tokens on RS-facing API requests.</t> | ||||
</li> | ||||
<li> | ||||
<t>Tighter controls over derived tokens.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-03 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Added token model.</t> | ||||
</li> | ||||
<li> | ||||
<t>Added IANA sections.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-02 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Editorial and formatting fixes.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-01 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Better described RS authentication.</t> | ||||
</li> | ||||
<li> | ||||
<t>Added access token format registry.</t> | ||||
</li> | ||||
<li> | ||||
<t>Filled out introspection protocol.</t> | ||||
</li> | ||||
<li> | ||||
<t>Filled out resource registration protocol.</t> | ||||
</li> | ||||
<li> | ||||
<t>Expanded RS-facing discovery mechanisms.</t> | ||||
</li> | ||||
<li> | ||||
<t>Moved client-facing RS response back to GNAP core document.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>-00 | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Extracted resource server section.</t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</section> | </section> | |||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
H4sIAAAAAAAAA+1963bbVpbmfzwFRl5rbE+T9C1OYk13dcu3ihLbcklyuZOa | ||||
WjZIHpKIQIANgJJZtvtZ5lnmyWZfzw2gRDmu7q5elR9VFgGc6z57f/t6hsNh | ||||
0uZtYfbTm7+vs7JNX5l51eZZm1dlmpXT9GDdLqo6/wv/8rqu2mpSFemxaap1 | ||||
PTHpianPTZ0+qcrSTPCd5mYyrSZltoQ2p3U2a4e5aWfDeZmthrV8NWzoq2Z4 | ||||
91EyyVrost7sp007TZJ8Ve+nbb1u2vt37z66ez/JapPtQzeTdZ23m+Siqs/m | ||||
dbVe7ae/f3XwOjkzG/hpup8elq2pS9MOn2KnSdK0MPx3WVGVMJCNaZJVvp/+ | ||||
CUY/SOF/8nJqynaQNlXd1mbWwL82S/lHW+cTeDSplqtM/rGEl+FRXhZ5aQYp | ||||
THCZrVZ5Of9zkmS0QvtJmg7hhWY//XGUHueThanhpzTllfgRJpSX/u9VPc9K | ||||
Wdf99LFpVtWZSZ+Vc+jB1NA0vWWWWV7sp7iE//IrtTGqqY0RfE9vwLLsp4u2 | ||||
XTX7d+6Mm9XZKK/u0JO6wn0107yt6sQN7/koPVyOs3XReuN7no1zUwYPwgFm | ||||
E1O30LQ/qhl9NMr5o38JXgmGpU/uJElZ1Uto8tzs02uPn7y+9+gh/ztN26ye | ||||
mxZoUT+8uLgY1bPJkCeBc76Tl7Pqzniygs9u6mdMwceGd2pKQ27SWVUz3Zj0 | ||||
TWPSapaeAonDOtdt+iLbmNpSVXrr9MXJbaL3p1mbzetsecm7T/Fl6Rr6gp5f | ||||
Zpv0/t17D+VHRxH839D+K+Ut+HmUnizMbCak0PvO8Sj9oSr+sv2F19BIlpft | ||||
8KCc1oaeHj9/cv/evUf7+seDR99/y3/8+PZ0H3/57uG9R/r0+3vffWNf/f7+ | ||||
Q/kOjxUcp+HTkTu4k6o2w5Uc/iSB0wArwa+fPHvxfD/dgybSD/DfHhxh2KFg | ||||
k18ePDk4Pjp65VZEN1r3GRiDyerJYjSvqnlh7qzW4wb/55t73z+6f8d9xhu9 | ||||
9zKbZHVV4So8qaqz3DTpRd4ukAu15kO7zor0SXZuspaJ4KmZwIjrrMj/YmKO | ||||
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 | ||||
7tp+WzyIIfnRaZU9GCX/H0FFsMJnHAEA | ||||
</rfc> | </rfc> | |||
End of changes. 284 change blocks. | ||||
1392 lines changed or deleted | 689 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |