rfc8693xml2.original.xml | rfc8693.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="us-ascii"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<?xml-stylesheet type='text/xsl' href='http://xml2rfc.tools.ietf.org/authoring/r | ||||
fc2629.xslt' ?> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | ||||
<!-- [rfced] updated by Chris /08/06/19 --> | ||||
<?rfc toc="yes"?> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?rfc tocompact="yes"?> | ||||
<?rfc tocdepth="4"?> | ||||
<?rfc tocindent="yes"?> | ||||
<?rfc symrefs="yes"?> | ||||
<?rfc sortrefs="yes"?> | ||||
<?rfc comments="yes"?> | ||||
<?rfc inline="yes"?> | ||||
<?rfc compact="yes"?> | ||||
<?rfc subcompact="no"?> | ||||
<rfc submissionType="IETF" category="std" consensus="yes" number="XXXX" ipr="tru | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" | |||
st200902"> | category="std" consensus="yes" number="8693" ipr="trust200902" | |||
docName="draft-ietf-oauth-token-exchange-19" obsoletes="" updates="" | ||||
xml:lang="en" tocInclude="true" tocDepth="4" | ||||
symRefs="true" sortRefs="true" version="3"> | ||||
<!-- xml2rfc v2v3 conversion 2.37.1 --> | ||||
<front> | <front> | |||
<title abbrev="OAuth 2.0 Token Exchange">OAuth 2.0 Token Exchange</title> | <title abbrev="OAuth 2.0 Token Exchange">OAuth 2.0 Token Exchange</title> | |||
<!-- An STS for the REST of Us --> | <seriesInfo name="RFC" value="8693"/> | |||
<author fullname="Michael B. Jones" initials="M." surname="Jones"> | ||||
<author fullname="Michael B. Jones" initials="M.B." surname="Jones"> | ||||
<organization>Microsoft</organization> | <organization>Microsoft</organization> | |||
<address> | <address> | |||
<email>mbj@microsoft.com</email> | <email>mbj@microsoft.com</email> | |||
<uri>http://self-issued.info/</uri> | <uri>https://self-issued.info/</uri> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Anthony Nadalin" initials="A." surname="Nadalin"> | <author fullname="Anthony Nadalin" initials="A." surname="Nadalin"> | |||
<organization>Microsoft</organization> | <organization>Microsoft</organization> | |||
<address> | <address> | |||
<email>tonynad@microsoft.com</email> | <email>tonynad@microsoft.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Brian Campbell" initials="B." surname="Campbell" role="edi tor"> | <author fullname="Brian Campbell" initials="B." surname="Campbell" role="edi tor"> | |||
<organization>Ping Identity</organization> | <organization>Ping Identity</organization> | |||
<address><email>brian.d.campbell@gmail.com</email></address> | <address> | |||
<email>brian.d.campbell@gmail.com</email> | ||||
</address> | ||||
</author> | </author> | |||
<author fullname="John Bradley" initials="J." surname="Bradley"> | <author fullname="John Bradley" initials="J." surname="Bradley"> | |||
<organization>Yubico</organization> | <organization>Yubico</organization> | |||
<address><email>ve7jtb@ve7jtb.com</email></address> | <address> | |||
<email>ve7jtb@ve7jtb.com</email> | ||||
</address> | ||||
</author> | </author> | |||
<author fullname="Chuck Mortimore" initials="C." surname="Mortimore"> | <author fullname="Chuck Mortimore" initials="C." surname="Mortimore"> | |||
<organization abbrev="Salesforce">Salesforce</organization> | <organization abbrev="Visa">Visa</organization> | |||
<address> | <address> | |||
<email>cmortimore@salesforce.com</email> | <email>chuck.mortimore@visa.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2020" month="January"/> | ||||
<date year="2019" month="August"/> | ||||
<area>Security</area> | <area>Security</area> | |||
<workgroup>OAuth Working Group</workgroup> | <workgroup>OAuth Working Group</workgroup> | |||
<keyword> | ||||
<keyword>RFC</keyword> | JSON Web Token, JWT, Delegation, Impersonation, STS, Security Token | |||
<keyword>Request for Comments</keyword> | Service, Exchange, Token, OAuth | |||
<keyword>I-D</keyword> | </keyword> | |||
<keyword>Internet-Draft</keyword> | ||||
<keyword>JSON Web Token</keyword> | ||||
<keyword>JWT</keyword> | ||||
<keyword>Delegation</keyword> | ||||
<keyword>Impersonation</keyword> | ||||
<keyword>STS</keyword> | ||||
<keyword>Security Token Service</keyword> | ||||
<keyword>Exchange</keyword> | ||||
<keyword>Token</keyword> | ||||
<keyword>OAuth</keyword> | ||||
<abstract> | <abstract> | |||
<t> | <t> | |||
This specification defines a protocol for an HTTP- and JSON- based | This specification defines a protocol for an HTTP- and JSON-based | |||
Security Token Service (STS) by defining how to request and obtain | Security Token Service (STS) by defining how to request and obtain | |||
security tokens from OAuth 2.0 authorization servers, | security tokens from OAuth 2.0 authorization servers, | |||
including security tokens employing impersonation and delegation. | including security tokens employing impersonation and delegation. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="Introduction" title="Introduction"> | <section anchor="Introduction" numbered="true" toc="default"> | |||
<t> | <name>Introduction</name> | |||
A security token is a set of information that facilitates | <t> | |||
the sharing of identity and security information in heterogeneous environments | A security token is a set of information that facilitates the sharing of | |||
or across security domains. | identity and security information in heterogeneous environments or across | |||
Examples of security tokens include | security domains. Examples of security tokens include JSON Web Tokens | |||
JSON Web Tokens (JWTs) <xref target="JWT"/> and | (JWTs) <xref target="RFC7519" format="default"/> and Security Assertion Markup | |||
SAML 2.0 Assertions <xref target="OASIS.saml-core-2.0-os"/>. | Language (SAML) | |||
Security tokens are typically signed to achieve integrity | 2.0 assertions <xref target="OASIS.saml-core-2.0-os" format="default"/>. Secu | |||
and sometimes also encrypted to achieve confidentiality. | rity tokens are | |||
Security tokens are also sometimes described as Assertions, such as in | typically signed to achieve integrity and sometimes also encrypted to | |||
<xref target="RFC7521"/>. | achieve confidentiality. Security tokens are also sometimes described as | |||
assertions, such as in <xref target="RFC7521" format="default"/>. | ||||
</t> | </t> | |||
<t> | ||||
<t> | ||||
A Security Token Service (STS) is a service capable of validating | A Security Token Service (STS) is a service capable of validating | |||
security tokens provided to it and issuing new security tokens in | security tokens provided to it and issuing new security tokens in | |||
response, which enables clients to obtain appropriate | response, which enables clients to obtain appropriate | |||
access credentials for resources in heterogeneous environments or across secur ity | access credentials for resources in heterogeneous environments or across secur ity | |||
domains. | domains. | |||
Web Service clients have used <xref target="WS-Trust">WS-Trust</xref> | Web Service clients have used WS-Trust <xref target="WS-Trust" format="default "></xref> | |||
as the protocol to interact with an STS for token exchange. | as the protocol to interact with an STS for token exchange. | |||
While WS-Trust | While WS-Trust | |||
uses XML and SOAP, the trend in modern Web development | uses XML and SOAP, the trend in modern Web development | |||
has been towards RESTful patterns and JSON. | has been towards RESTful (Representational State Transfer) patterns and JSON. | |||
<xref target="RFC6749">The OAuth 2.0 Authorization Framework</xref> | The OAuth 2.0 Authorization Framework <xref target="RFC6749" format="default"> | |||
and <xref target="RFC6750">OAuth 2.0 Bearer Tokens</xref> | </xref> | |||
and OAuth 2.0 Bearer Tokens <xref target="RFC6750" format="default"></xref> | ||||
have emerged as popular standards for authorizing third-party | have emerged as popular standards for authorizing third-party | |||
applications' access to HTTP and RESTful resources. | applications' access to HTTP and RESTful resources. | |||
The conventional OAuth 2.0 interaction involves the exchange of some | The conventional OAuth 2.0 interaction involves the exchange of some | |||
representation of resource owner authorization for an access token, | representation of resource owner authorization for an access token, | |||
which has proven to be an extremely useful pattern in practice. However, | which has proven to be an extremely useful pattern in practice. However, | |||
its input and output are somewhat too constrained as is to fully | its input and output are somewhat too constrained as is to fully | |||
accommodate a security token exchange framework. | accommodate a security token exchange framework. | |||
</t> | </t> | |||
<t> | <t> | |||
This specification defines a protocol extending OAuth 2.0 that enables | This specification defines a protocol extending OAuth 2.0 that enables | |||
clients to request and obtain security tokens from authorization servers actin g in | clients to request and obtain security tokens from authorization servers actin g in | |||
the role of an STS. | the role of an STS. | |||
Similar to OAuth 2.0, this specification focuses on client developer simplicit y and | Similar to OAuth 2.0, this specification focuses on client developer simplicit y and | |||
requires only an HTTP client and JSON parser, which are nearly universally ava ilable | requires only an HTTP client and JSON parser, which are nearly universally ava ilable | |||
in modern development environments. The STS protocol defined in this specifica tion | in modern development environments. The STS protocol defined in this specifica tion | |||
is not itself RESTful (an STS doesn't lend itself particularly well to a REST | is not itself RESTful (an STS doesn't lend itself particularly well to a REST | |||
approach) but does utilize communication patterns and data formats that should be | approach) but does utilize communication patterns and data formats that should be | |||
familiar to developers accustomed to working with RESTful systems. | familiar to developers accustomed to working with RESTful systems. | |||
</t> | </t> | |||
<t> | <t> | |||
A new grant type for a token exchange request and the associated specific para meters for | A new grant type for a token exchange request and the associated specific para meters for | |||
such a request to the token endpoint are defined by this specification. | such a request to the token endpoint are defined by this specification. | |||
A token exchange response is a normal OAuth 2.0 response from the token endpoi nt | A token exchange response is a normal OAuth 2.0 response from the token endpoi nt | |||
with a few additional parameters defined herein to provide information to the client. | with a few additional parameters defined herein to provide information to the client. | |||
</t> | </t> | |||
<t> | <t> | |||
The entity that makes the request to exchange tokens is considered the client in the | The entity that makes the request to exchange tokens is considered the client in the | |||
context of the token exchange interaction. However, that does not restrict | context of the token exchange interaction. However, that does not restrict | |||
usage of this profile to traditional OAuth clients. An OAuth resource server, for example, might assume | usage of this profile to traditional OAuth clients. An OAuth resource server, for example, might assume | |||
the role of the client during token exchange in order to trade an | the role of the client during token exchange in order to trade an | |||
access token that it received in a protected resource request for | access token that it received in a protected resource request for | |||
a new token that is appropriate to include in a call to a backend | a new token that is appropriate to include in a call to a backend | |||
service. The new token might be an access token that is more | service. The new token might be an access token that is more | |||
narrowly scoped for the downstream service or it could be an entirely differen t kind | narrowly scoped for the downstream service or it could be an entirely differen t kind | |||
of token. | of token. | |||
</t> | </t> | |||
<t> | <t> | |||
The scope of this specification is limited to the definition of a | The scope of this specification is limited to the definition of a | |||
basic request-and-response protocol for an STS-style token exchange utilizing OAuth 2.0. | basic request-and-response protocol for an STS-style token exchange utilizing OAuth 2.0. | |||
Although a few new JWT claims are defined that enable delegation semantics to be expressed, | Although a few new JWT claims are defined that enable delegation semantics to be expressed, | |||
the specific syntax, semantics and security characteristics of the tokens them selves | the specific syntax, semantics, and security characteristics of the tokens the mselves | |||
(both those presented to the authorization server and those obtained by the cl ient) | (both those presented to the authorization server and those obtained by the cl ient) | |||
are explicitly out of scope and no requirements are placed on the trust model in | are explicitly out of scope, and no requirements are placed on the trust model in | |||
which an implementation might be deployed. Additional profiles may provide | which an implementation might be deployed. Additional profiles may provide | |||
more detailed requirements around the specific nature of the parties and trust involved, | more detailed requirements around the specific nature of the parties and trust involved, | |||
such as whether signing and/or encryption of tokens is needed or if proof-of-p | such as whether signing and/or encryption of tokens is needed or if proof-of-p | |||
ossession style | ossession-style | |||
tokens will be required or issued; however, such details | tokens will be required or issued. However, such details | |||
will often be policy decisions made with respect to the specific needs of indi vidual | will often be policy decisions made with respect to the specific needs of indi vidual | |||
deployments and will be configured or implemented accordingly. | deployments and will be configured or implemented accordingly. | |||
</t> | </t> | |||
<t> | <t> | |||
The security tokens obtained may be used in a number of contexts, | The security tokens obtained may be used in a number of contexts, | |||
the specifics of which are also beyond the scope of this specification. | the specifics of which are also beyond the scope of this specification. | |||
</t> | </t> | |||
<section anchor="DelegationImpersonation" numbered="true" toc="default"> | ||||
<section anchor="DelegationImpersonation" title="Delegation vs. Impersonat | <name>Delegation vs. Impersonation Semantics</name> | |||
ion Semantics"> | <t> | |||
<t> | ||||
One common use case for an STS (as alluded to in the previous section) | One common use case for an STS (as alluded to in the previous section) | |||
is to allow a resource server A to make calls to a backend service C on | is to allow a resource server A to make calls to a backend service C on | |||
behalf of the requesting user B. Depending on the local site policy and | behalf of the requesting user B. Depending on the local site policy and | |||
authorization infrastructure, it may be desirable for A to use its own | authorization infrastructure, it may be desirable for A to use its own | |||
credentials to access C along with an annotation of some form that A is | credentials to access C along with an annotation of some form that A is | |||
acting on behalf of B ("delegation"), or for A to be granted a limited acces s | acting on behalf of B ("delegation") or for A to be granted a limited access | |||
credential to C but that continues to identify B as the authorized | credential to C but that continues to identify B as the authorized | |||
entity ("impersonation"). Delegation and impersonation can be useful | entity ("impersonation"). Delegation and impersonation can be useful | |||
concepts in other scenarios involving multiple participants as well. | concepts in other scenarios involving multiple participants as well. | |||
</t> | </t> | |||
<t> | <t> | |||
When principal A impersonates principal B, A is given all | When principal A impersonates principal B, A is given all | |||
the rights that B has within some defined rights context | the rights that B has within some defined rights context | |||
and is indistinguishable from B in that context. | and is indistinguishable from B in that context. | |||
Thus, when principal A impersonates principal B, then insofar | Thus, when principal A impersonates principal B, then insofar | |||
as any entity receiving such a token is concerned, they are | as any entity receiving such a token is concerned, they are | |||
actually dealing with B. It is true that some members of the | actually dealing with B. It is true that some members of the | |||
identity system might have awareness that impersonation is | identity system might have awareness that impersonation is | |||
going on, but it is not a requirement. | going on, but it is not a requirement. | |||
For all intents and purposes, when A is impersonating B, A is B within the | For all intents and purposes, when A is impersonating B, A is B within the | |||
context of the rights authorized by the token. A's ability to impersonate B could | context of the rights authorized by the token. A's ability to impersonate B could | |||
be limited in scope or time, or even with a one-time-use restriction, | be limited in scope or time, or even with a one-time-use restriction, | |||
whether via the contents of the token or an out-of-band mechanism. | whether via the contents of the token or an out-of-band mechanism. | |||
</t> | </t> | |||
<t> | <t> | |||
Delegation semantics are different than | Delegation semantics are different than | |||
impersonation semantics, though the two are closely related. | impersonation semantics, though the two are closely related. | |||
With delegation semantics, principal A still has its own identity | With delegation semantics, principal A still has its own identity | |||
separate from B and it is explicitly understood that while B | separate from B, and it is explicitly understood that while B | |||
may have delegated some of its rights to A, any actions taken are | may have delegated some of its rights to A, any actions taken are | |||
being taken by A representing B. In a sense, A is an agent for B. | being taken by A representing B. In a sense, A is an agent for B. | |||
</t> | </t> | |||
<t> | <t> | |||
Delegation and impersonation are not inclusive of all situations. | Delegation and impersonation are not inclusive of all situations. | |||
When a principal is acting directly on its own behalf, for example, | When a principal is acting directly on its own behalf, for example, | |||
neither delegation nor impersonation are in play. They are, however, | neither delegation nor impersonation are in play. They are, however, | |||
the more common semantics operating for token exchange and, as such, are | the more common semantics operating for token exchange and, as such, are | |||
given more direct treatment in this specification. | given more direct treatment in this specification. | |||
</t> | </t> | |||
<t> | <t> | |||
Delegation semantics are typically expressed in a token by including informa tion about both the | Delegation semantics are typically expressed in a token by including informa tion about both the | |||
primary subject of the token as well as the actor to whom that subject has d elegated some of its rights. | primary subject of the token as well as the actor to whom that subject has d elegated some of its rights. | |||
Such a token is sometimes referred to as a composite token because it is com posed of information | Such a token is sometimes referred to as a composite token because it is com posed of information | |||
about multiple subjects. Typically, in the request, the <spanx style="verb"> subject_token</spanx> | about multiple subjects. Typically, in the request, the <tt>subject_token</t t> | |||
represents the identity of the party on | represents the identity of the party on | |||
behalf of whom the token is being requested while the <spanx style="verb">ac tor_token</spanx> represents | behalf of whom the token is being requested while the <tt>actor_token</tt> r epresents | |||
the identity of the party to whom the access rights of the issued token are being delegated. | the identity of the party to whom the access rights of the issued token are being delegated. | |||
A composite token issued by the authorization server will contain informatio n about both parties. | A composite token issued by the authorization server will contain informatio n about both parties. | |||
When and if a composite token is issued is at the discretion of the authoriz ation server and | When and if a composite token is issued is at the discretion of the authoriz ation server and | |||
applicable policy and configuration. | applicable policy and configuration. | |||
</t> | </t> | |||
<t> | <t> | |||
The specifics of representing a composite token and even whether or not such | The specifics of representing a composite token and even whether or not | |||
a token will be issued depend on the details of the implementation and the kind | such a token will be issued depend on the details of the implementation | |||
of token. | and the kind of token. The representations of composite tokens that are | |||
The representations of composite tokens that are not JWTs are beyond the sco | not JWTs are beyond the scope of this specification. The <tt>actor_token</t | |||
pe of this specification. | t> request parameter, however, does provide | |||
The <spanx style="verb">actor_token</spanx> request parameter, however, does | a means for providing information about the desired actor, and the JWT | |||
provide a means | <tt>act</tt> claim can provide a representation of a | |||
for providing information about the desired actor and the JWT <spanx style=" | chain of delegation. | |||
verb">act</spanx> claim | </t> | |||
can provide a representation of a chain of delegation. | ||||
</t> | ||||
</section> | </section> | |||
<section anchor="RNC" numbered="true" toc="default"> | ||||
<section anchor="RNC" title="Requirements Notation and Conventions"> | <name>Requirements Notation and Conventions</name> | |||
<t> | <t> | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
" | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
in this document are to be interpreted as described in | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
when, and only when, they appear in all capitals, as shown here. | be interpreted as | |||
</t> | described in BCP 14 <xref target="RFC2119" format="default"/> <xref tar | |||
get="RFC8174" format="default"/> | ||||
when, and only when, they appear in all capitals, as shown here. | ||||
</t> | ||||
</section> | </section> | |||
<section anchor="Terminology" numbered="true" toc="default"> | ||||
<section anchor="Terminology" title="Terminology"> | <name>Terminology</name> | |||
<t> | <t> | |||
This specification uses the terms | This specification uses the terms | |||
"access token type", "authorization server", "client", "client identifi er", | "access token type", "authorization server", "client", "client identifi er", | |||
"resource server", "token endpoint", "token request", and "token respon se" | "resource server", "token endpoint", "token request", and "token respon se" | |||
defined by <xref target="RFC6749">OAuth 2.0</xref>, | defined by OAuth 2.0 <xref target="RFC6749" format="default"></xref>, | |||
and the terms "Base64url Encoding", "Claim", and "JWT Claims Set" defin ed by | and the terms "Base64url Encoding", "Claim", and "JWT Claims Set" defin ed by | |||
<xref target="JWT">JSON Web Token (JWT)</xref>. | JSON Web Token (JWT) <xref target="RFC7519" format="default"></xref>. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="Messages" numbered="true" toc="default"> | ||||
<section anchor="Messages" title="Token Exchange Request and Response"> | <name>Token Exchange Request and Response</name> | |||
<section title="Request" anchor="Request"> | <section anchor="Request" numbered="true" toc="default"> | |||
<t> | <name>Request</name> | |||
<t> | ||||
A client requests a security token by making a token request to the authorizat ion | A client requests a security token by making a token request to the authorizat ion | |||
server's token endpoint using the extension grant type mechanism defined | server's token endpoint using the extension grant type mechanism defined | |||
in Section 4.5 of <xref target="RFC6749"/>. | in <xref target="RFC6749" sectionFormat="of" section="4.5"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
Client authentication to the authorization server is done using the normal | Client authentication to the authorization server is done using the normal | |||
mechanisms provided by OAuth 2.0. | mechanisms provided by OAuth 2.0. | |||
Section 2.3.1 of <xref target="RFC6749"/> | <xref target="RFC6749" sectionFormat="of" section="2.3.1"/> | |||
defines password-based authentication of the client, | defines password-based authentication of the client, | |||
however, client authentication is extensible and other mechanisms are possible . | however, client authentication is extensible and other mechanisms are possible . | |||
For example, <xref target="RFC7523"/> defines client authentication using bear | For example, <xref target="RFC7523" format="default"/> defines client authenti | |||
er | cation using bearer | |||
JSON Web Tokens (JWTs) <xref target="JWT"/>. | JSON Web Tokens (JWTs) <xref target="RFC7519" format="default"/>. | |||
The supported methods of client authentication and whether or not to allow | The supported methods of client authentication and whether or not to allow | |||
unauthenticated or unidentified clients are deployment decisions that are | unauthenticated or unidentified clients are deployment decisions that are | |||
at the discretion of the authorization server. | at the discretion of the authorization server. | |||
Note that omitting client authentication allows | Note that omitting client authentication allows | |||
for a compromised token to be leveraged via an STS into other tokens by | for a compromised token to be leveraged via an STS into other tokens by | |||
anyone possessing the compromised token. Thus client | anyone possessing the compromised token. Thus, client | |||
authentication allows for additional authorization checks by the STS as to whi ch | authentication allows for additional authorization checks by the STS as to whi ch | |||
entities are permitted to impersonate or receive delegations from other | entities are permitted to impersonate or receive delegations from other | |||
entities. | entities. | |||
</t> | </t> | |||
<t> | <t> | |||
The client makes a token exchange request to the token endpoint with an extens ion | The client makes a token exchange request to the token endpoint with an extens ion | |||
grant type using the HTTP <spanx style='verb'>POST</spanx> method. The | grant type using the HTTP <tt>POST</tt> method. The | |||
following parameters are included in the HTTP request entity-body | following parameters are included in the HTTP request entity-body | |||
using the <spanx style='verb'>application/x-www-form-urlencoded</spanx> | using the <tt>application/x-www-form-urlencoded</tt> | |||
format with a character encoding of UTF-8 as described in | format with a character encoding of UTF-8 as described in | |||
Appendix B of RFC6749 <xref target="RFC6749"/>. | <xref target="RFC6749" sectionFormat="of" section="B"/>. | |||
</t> | </t> | |||
<t> | <dl newline="true" spacing="normal"> | |||
<list style="hanging"> | <dt>grant_type</dt> | |||
<dd> | ||||
<t hangText="grant_type"> | <bcp14>REQUIRED</bcp14>. The value | |||
<vspace/> | <tt>urn:ietf:params:oauth:grant-type:token-exchange</tt> | |||
REQUIRED. The value | ||||
<spanx style='verb'>urn:ietf:params:oauth:grant-type:token-exchange</spanx> | ||||
indicates that a token exchange is being performed. | indicates that a token exchange is being performed. | |||
</t> | </dd> | |||
<dt>resource</dt> | ||||
<t hangText="resource"> | <dd> | |||
<vspace/> | <bcp14>OPTIONAL</bcp14>. | |||
OPTIONAL. | ||||
A URI that indicates the target service or resource where the client intends to use | A URI that indicates the target service or resource where the client intends to use | |||
the requested security token. This enables the authorization server to apply policy as appropriate | the requested security token. This enables the authorization server to apply policy as appropriate | |||
for the target, such as determining the type and content of the token to be issued or if and how | for the target, such as determining the type and content of the token to be issued or if and how | |||
the token is to be encrypted. | the token is to be encrypted. | |||
In many cases, a client will not have knowledge of the logical organization of the systems with | In many cases, a client will not have knowledge of the logical organization of the systems with | |||
which it interacts and will only know a URI of the service where it intends to use the token. | which it interacts and will only know a URI of the service where it intends to use the token. | |||
The <spanx style="verb">resource</spanx> parameter allows the client to indi cate to the authorization server | The <tt>resource</tt> parameter allows the client to indicate to the authori zation server | |||
where it intends to use the issued token by providing the location, typicall y as an https URL, in the | where it intends to use the issued token by providing the location, typicall y as an https URL, in the | |||
token exchange request in the same form that will be used to access that res ource. | token exchange request in the same form that will be used to access that res ource. | |||
The authorization server will typically have the capability to map from a re source URI value to | The authorization server will typically have the capability to map from a re source URI value to | |||
an appropriate policy. The value of the <spanx style="verb">resource</spanx> | an appropriate policy. The value of the <tt>resource</tt> parameter <bcp14>M | |||
parameter MUST be an | UST</bcp14> be an | |||
absolute URI, as specified by Section 4.3 of <xref target="RFC3986"/>, | absolute URI, as specified by <xref target="RFC3986" | |||
which MAY include a query component and MUST NOT include a fragment componen | sectionFormat="of" section="4.3"/>, | |||
t. | that <bcp14>MAY</bcp14> include a query component and <bcp14>MUST NOT</bcp14 | |||
Multiple <spanx style="verb">resource</spanx> parameters may be used to indi | > include a fragment component. | |||
cate | Multiple <tt>resource</tt> parameters may be used to indicate | |||
that the issued token is intended to be used at the multiple resources liste d. | that the issued token is intended to be used at the multiple resources liste d. | |||
See <xref target="OAUTH-RESOURCE"/> for additional | See <xref target="I-D.ietf-oauth-resource-indicators" format="default"/> for | |||
background and uses of the <spanx style="verb">resource</spanx> parameter. | additional | |||
</t> | background and uses of the <tt>resource</tt> parameter. | |||
</dd> | ||||
<t hangText="audience"> | <dt>audience</dt> | |||
<vspace/> | <dd> | |||
OPTIONAL. | <bcp14>OPTIONAL</bcp14>. The logical name of the target service where the c | |||
The logical name of the target service where the client intends to use | lient intends | |||
the requested security token. This serves a purpose similar to the | to use the requested security token. This serves a purpose similar to the | |||
<spanx style="verb">resource</spanx> parameter, but with the client providin | <tt>resource</tt> parameter but with the client | |||
g a logical name | providing a logical name for the target service. Interpretation of the | |||
for the target service. Interpretation of the name requires that the value b | name requires that the value be something that both the client and the | |||
e something | authorization server understand. An OAuth client identifier, a SAML entity | |||
that both the client and the authorization server understand. An OAuth clien | identifier <xref target="OASIS.saml-core-2.0-os" format="default"/>, and an | |||
t identifier, | OpenID Connect | |||
a SAML entity identifier <xref target="OASIS.saml-core-2.0-os"/>, | Issuer Identifier <xref target="OpenID.Core" format="default"/> are examples | |||
an OpenID Connect Issuer Identifier <xref target="OpenID.Core"/>, | of things that | |||
are examples of things that | might be used as <tt>audience</tt> parameter values. | |||
might be used as <spanx style="verb">audience</spanx> parameter values. | However, <tt>audience</tt> values used with a given | |||
However, <spanx style="verb">audience</spanx> values used with a given | authorization server must be unique within that server to ensure that | |||
authorization server must be unique within that server, to ensure that they | they are properly interpreted as the intended type of value. Multiple | |||
are properly interpreted as the intended type of value. | <tt>audience</tt> parameters may be used to indicate | |||
Multiple <spanx style="verb">audience</spanx> parameters may be used to indi | that the issued token is intended to be used at the multiple audiences | |||
cate | listed. The <tt>audience</tt> and <tt>resource</tt> parameters may be used | |||
that the issued token is intended to be used at the multiple audiences liste | together to indicate | |||
d. | multiple target services with a mix of logical names and resource URIs. | |||
The <spanx style="verb">audience</spanx> and <spanx style="verb">resource</s | </dd> | |||
panx> parameters may | <dt>scope</dt> | |||
be used together to indicate multiple target services with a mix of logical | <dd> | |||
names and resource URIs. | <bcp14>OPTIONAL</bcp14>. A list of space-delimited, case-sensitive | |||
</t> | strings, as defined in <xref target="RFC6749" | |||
sectionFormat="of" section="3.3"/>, that allow the client to specify the des | ||||
<t hangText="scope"> | ired scope of | |||
<vspace/> | the requested security token in the context of the service or resource | |||
OPTIONAL. | where the token will be used. The values and associated semantics of scope | |||
A list of space-delimited, case-sensitive strings, as defined in Section 3.3 | are service specific and expected to be described in the relevant service | |||
of <xref target="RFC6749"/>, that allow the client to | documentation.</dd> | |||
specify the desired scope of the requested security token in the context of | <dt>requested_token_type</dt> | |||
the | <dd> | |||
service or resource where the token will be used. The values and associated | <bcp14>OPTIONAL</bcp14>. | |||
semantics of scope | An identifier, as described in <xref target="TokenTypeIdentifiers" format="d | |||
are service specific and expected to be described in the relevant service do | efault"/>, for the type of the requested security token. | |||
cumentation.</t> | ||||
<t hangText="requested_token_type"> | ||||
<vspace/> | ||||
OPTIONAL. | ||||
An identifier, as described in <xref target="TokenTypeIdentifiers"/>, for th | ||||
e type of the requested security token. | ||||
If the requested type is unspecified, the issued token type is at | If the requested type is unspecified, the issued token type is at | |||
the discretion of the authorization server and may be dictated by | the discretion of the authorization server and may be dictated by | |||
knowledge of the requirements of the service or resource | knowledge of the requirements of the service or resource | |||
indicated by the <spanx style='verb'>resource</spanx> or | indicated by the <tt>resource</tt> or | |||
<spanx style="verb">audience</spanx> parameter. | <tt>audience</tt> parameter. | |||
</t> | </dd> | |||
<dt>subject_token</dt> | ||||
<t hangText="subject_token"> | <dd> | |||
<vspace/> | <bcp14>REQUIRED</bcp14>. | |||
REQUIRED. | ||||
A security token that represents the | A security token that represents the | |||
identity of the party on behalf of whom the request is being made. | identity of the party on behalf of whom the request is being made. | |||
Typically, the subject of this token will be the subject of | Typically, the subject of this token will be the subject of | |||
the security token issued in response to the request. | the security token issued in response to the request. | |||
</t> | </dd> | |||
<dt>subject_token_type</dt> | ||||
<t hangText="subject_token_type"> | <dd> | |||
<vspace/> | <bcp14>REQUIRED</bcp14>. | |||
REQUIRED. | An identifier, as described in <xref target="TokenTypeIdentifiers" format="d | |||
An identifier, as described in <xref target="TokenTypeIdentifiers"/>, that i | efault"/>, that indicates the type of the security token in | |||
ndicates the type of the security token in | the <tt>subject_token</tt> parameter. | |||
the <spanx style="verb">subject_token</spanx> parameter. | </dd> | |||
</t> | <dt>actor_token</dt> | |||
<dd> | ||||
<t hangText="actor_token"> | <bcp14>OPTIONAL</bcp14>. | |||
<vspace/> | ||||
OPTIONAL. | ||||
A security token that represents | A security token that represents | |||
the identity of the acting party. Typically, this will be the party that is authorized to use the requested security token and act on behalf of the subject. | the identity of the acting party. Typically, this will be the party that is authorized to use the requested security token and act on behalf of the subject. | |||
</t> | </dd> | |||
<dt>actor_token_type</dt> | ||||
<t hangText="actor_token_type"> | <dd> | |||
<vspace/> | An identifier, as described in <xref target="TokenTypeIdentifiers" format="d | |||
An identifier, as described in <xref target="TokenTypeIdentifiers"/>, that i | efault"/>, that indicates the type of the security token in the | |||
ndicates the type of the security token in the | <tt>actor_token</tt> parameter. | |||
<spanx style="verb">actor_token</spanx> parameter. | This is <bcp14>REQUIRED</bcp14> when the <tt>actor_token</tt> parameter | |||
This is REQUIRED when the <spanx style="verb">actor_token</spanx> parameter | is present in the request but <bcp14>MUST NOT</bcp14> be included otherwise. | |||
is present in the request but MUST NOT be included otherwise. | </dd> | |||
</t> | </dl> | |||
</list> | <t> | |||
</t> | In processing the request, the authorization server <bcp14>MUST</bcp14> perfor | |||
<t> | m the appropriate validation procedures for the indicated token | |||
In processing the request, the authorization server MUST perform the appropria | ||||
te validation procedures for the indicated token | ||||
type and, if the actor token is present, also | type and, if the actor token is present, also | |||
perform the appropriate validation procedures for its indicated token type. | perform the appropriate validation procedures for its indicated token type. | |||
The validity criteria and details of any particular token are beyond the scope of | The validity criteria and details of any particular token are beyond the scope of | |||
this document and are specific to the respective type of token and its content . | this document and are specific to the respective type of token and its content . | |||
</t> | </t> | |||
<t> | <t> | |||
In the absence of one-time-use or other semantics specific to the token type, the act of performing | In the absence of one-time-use or other semantics specific to the token type, the act of performing | |||
a token exchange has no impact on the validity of the subject token or actor t oken. | a token exchange has no impact on the validity of the subject token or actor t oken. | |||
Furthermore, the exchange is a one-time event and does not create a tight link age | Furthermore, the exchange is a one-time event and does not create a tight link age | |||
between the input and output tokens, so that (for example) while the expiratio n | between the input and output tokens, so that (for example) while the expiratio n | |||
time of the output token may be influenced by that of the input token, | time of the output token may be influenced by that of the input token, | |||
renewal or extension of the input token is not expected to be reflected in | renewal or extension of the input token is not expected to be reflected in | |||
the output token's properties. It may still be appropriate or desirable to pr opagate | the output token's properties. It may still be appropriate or desirable to pr opagate | |||
token revocation events. However, doing so is not a general property of the ST | token-revocation events. However, doing so is not a general property of the ST | |||
S | S | |||
protocol and would be specific to a particular implementation, token type or d | protocol and would be specific to a particular implementation, token type, or | |||
eployment. | deployment. | |||
</t> | </t> | |||
<section title="Relationship Between Resource, Audience and Scope"> | <section numbered="true" toc="default"> | |||
<t> | <name>Relationship between Resource, Audience, and Scope</name> | |||
When requesting a token, the client can indicate the desired target se | <t> | |||
rvice(s) | When requesting a token, the client can indicate the desired target | |||
where it intends to use that token | service(s) where it intends to use that token by way of the <tt>audien | |||
by way of the <spanx style="verb">audience</spanx> and <spanx style="v | ce</tt> and <tt>resource</tt> parameters as well as indicate the | |||
erb">resource</spanx> | desired scope of the requested token using the <tt>scope</tt> paramete | |||
parameters, as well as indicating the | r. | |||
desired scope of the requested token using the <spanx style="verb">sco | ||||
pe</spanx> parameter. | ||||
The semantics of such a request are that the client is asking for a to ken with the requested | The semantics of such a request are that the client is asking for a to ken with the requested | |||
scope that is usable at all the requested target services. Effectively , the requested access rights of | scope that is usable at all the requested target services. Effectively , the requested access rights of | |||
the token are the cartesian product of all the scopes at all the targe | the token are the Cartesian product of all the scopes at all the targe | |||
t services. | t services. | |||
</t> | </t> | |||
<t> | <t> | |||
An authorization server may be unwilling or unable to fulfill any toke | An authorization server may be unwilling or unable to fulfill any toke | |||
n request but the likelihood | n request, but the likelihood | |||
of an unfulfillable request is significantly higher when very broad ac cess rights are being solicited. | of an unfulfillable request is significantly higher when very broad ac cess rights are being solicited. | |||
As such, in the absence of specific knowledge about the relationship o f systems in a deployment, | As such, in the absence of specific knowledge about the relationship o f systems in a deployment, | |||
clients should exercise discretion in the breadth of the access reques ted, particularly the | clients should exercise discretion in the breadth of the access reques ted, particularly the | |||
number of target services. An authorization server can use the <spanx | number of target services. An authorization server can use the <tt>inv | |||
style="verb">invalid_target</spanx> | alid_target</tt> | |||
error code, defined in <xref target="ErrorResponse"/>, to inform a cli | error code, defined in <xref target="ErrorResponse" format="default"/> | |||
ent that it requested access to | , to inform a client that it requested access to | |||
too many target services simultaneously. | too many target services simultaneously. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
<section anchor="Response" numbered="true" toc="default"> | ||||
</section> | <name>Response</name> | |||
<t> | ||||
<section title="Response" anchor="Response"> | ||||
<t> | ||||
The authorization server responds to a token exchange request with a normal | The authorization server responds to a token exchange request with a normal | |||
OAuth 2.0 response from the token endpoint, as specified in | OAuth 2.0 response from the token endpoint, as specified in | |||
Section 5 of <xref target="RFC6749"/>. Additional details and | <xref target="RFC6749" sectionFormat="of" section="5"/>. Additional details an d | |||
explanation are provided in the following subsections. | explanation are provided in the following subsections. | |||
</t> | </t> | |||
<section title="Successful Response" anchor="SuccessfulResponse"> | <section anchor="SuccessfulResponse" numbered="true" toc="default"> | |||
<t> | <name>Successful Response</name> | |||
<t> | ||||
If the request is valid and meets all policy and other criteria of the authori zation server, | If the request is valid and meets all policy and other criteria of the authori zation server, | |||
a successful token response is constructed by adding the following parameters | a successful token response is constructed by adding the following parameters | |||
to the entity-body of the HTTP response using the "application/json" | to the entity-body of the HTTP response using the "application/json" | |||
media type, as specified by <xref target="RFC8259"/>, and an HTTP 200 status c ode. The | media type, as specified by <xref target="RFC8259" format="default"/>, and an HTTP 200 status code. The | |||
parameters are serialized into a JavaScript Object Notation (JSON) | parameters are serialized into a JavaScript Object Notation (JSON) | |||
structure by adding each parameter at the top level. | structure by adding each parameter at the top level. | |||
Parameter names and string values are included as JSON strings. | Parameter names and string values are included as JSON strings. | |||
Numerical values are included as JSON numbers. The order of | Numerical values are included as JSON numbers. The order of | |||
parameters does not matter and can vary. | parameters does not matter and can vary. | |||
</t> | </t> | |||
<t> | <dl newline="true" spacing="normal"> | |||
<list style="hanging"> | <dt>access_token</dt> | |||
<dd> | ||||
<t hangText="access_token"> | <bcp14>REQUIRED</bcp14>. The security token issued by the authorization server | |||
<vspace/> | in response | |||
REQUIRED. The security token issued by the authorization server in response | ||||
to the token exchange request. | to the token exchange request. | |||
The <spanx style="verb">access_token</spanx> parameter from | The <tt>access_token</tt> parameter from | |||
Section 5.1 of <xref target="RFC6749"/> is used here to carry the requested | <xref target="RFC6749" sectionFormat="of" section="5.1"/> is used here to carr | |||
y the requested | ||||
token, which allows this token exchange protocol to use the existing OAuth 2.0 request | token, which allows this token exchange protocol to use the existing OAuth 2.0 request | |||
and response constructs defined for the token endpoint. | and response constructs defined for the token endpoint. | |||
The identifier <spanx style="verb">access_token</spanx> is used for historical | The identifier <tt>access_token</tt> is used for historical | |||
reasons and the issued token need not be an OAuth access token. | reasons and the issued token need not be an OAuth access token. | |||
</t> | </dd> | |||
<dt>issued_token_type</dt> | ||||
<t hangText="issued_token_type"> | <dd> | |||
<vspace/> | <bcp14>REQUIRED</bcp14>. An identifier, as described in <xref target="TokenTy | |||
REQUIRED. An identifier, as described in <xref target="TokenTypeIdentifiers"/ | peIdentifiers" format="default"/>, | |||
>, | ||||
for the representation of the issued security token. | for the representation of the issued security token. | |||
</t> | </dd> | |||
<t hangText="token_type"> | ||||
<vspace/> | ||||
REQUIRED. | ||||
A case-insensitive value specifying the method of using the access token issue | ||||
d, | ||||
as specified in Section 7.1 of <xref target="RFC6749"/>. | ||||
It provides the client | ||||
with information about how to utilize the access token to access protected res | ||||
ources. | ||||
For example, a value of <spanx style="verb">Bearer</spanx>, | ||||
as specified in <xref target="RFC6750"/>, indicates that | ||||
the issued security token is a bearer token and the client can simply present | ||||
it as is without any | ||||
additional proof of eligibility beyond the contents of the token itself. | ||||
Note that the meaning of this parameter is different from the meaning of | ||||
the <spanx style="verb">issued_token_type</spanx> parameter, | ||||
which declares the representation of the issued security token; | ||||
the term "token type" is more typically used with the aforementioned meaning a | ||||
s the structural or syntactical | ||||
representation of the security token, as it is in | ||||
all <spanx style="verb">*_token_type</spanx> parameters in this specification. | ||||
If the issued token is not an access token or usable as an access token, | ||||
then the <spanx style="verb">token_type</spanx> value <spanx style="verb">N_A< | ||||
/spanx> is used | ||||
to indicate that an OAuth 2.0 | ||||
<spanx style="verb">token_type</spanx> identifier is not applicable in that co | ||||
ntext. | ||||
</t> | ||||
<t hangText="expires_in"> | <dt>token_type</dt> | |||
<vspace/> | <dd> | |||
RECOMMENDED. The validity lifetime, in seconds, of the token issued by the | <bcp14>REQUIRED</bcp14>. A case-insensitive value specifying the method of us | |||
authorization server. Oftentimes the client will not have the inclination or c | ing the | |||
apability | access token issued, as specified in <xref target="RFC6749" | |||
to inspect the content of the token and this parameter provides a consistent a | sectionFormat="of" section="7.1"/>. | |||
nd token-type-agnostic | It provides the client with information about how to utilize the access | |||
token to access protected resources. For example, a value of <tt>Bearer</tt>, | ||||
as specified in <xref target="RFC6750" format="default"/>, | ||||
indicates that the issued security token is a bearer token and the client | ||||
can simply present it as is without any additional proof of eligibility | ||||
beyond the contents of the token itself. Note that the meaning of this | ||||
parameter is different from the meaning of the <tt>issued_token_type</tt> para | ||||
meter, which declares the | ||||
representation of the issued security token; the term "token type" is more | ||||
typically used to mean the structural or syntactical representation of the sec | ||||
urity token, as it is in all <tt>*_token_type</tt> parameters in this specificat | ||||
ion. If the | ||||
issued token is not an access token or usable as an access token, then the | ||||
<tt>token_type</tt> value <tt>N_A</tt> | ||||
is used to indicate that an OAuth 2.0 <tt>token_type</tt> | ||||
identifier is not applicable in that context. | ||||
</dd> | ||||
<dt>expires_in</dt> | ||||
<dd> | ||||
<bcp14>RECOMMENDED</bcp14>. The validity lifetime, in seconds, of the token i | ||||
ssued by the | ||||
authorization server. Oftentimes, the client will not have the inclination or | ||||
capability | ||||
to inspect the content of the token, and this parameter provides a consistent | ||||
and token-type-agnostic | ||||
indication of how long the token can be expected to be valid. | indication of how long the token can be expected to be valid. | |||
For example, the value 1800 denotes that the token will | For example, the value 1800 denotes that the token will | |||
expire in thirty minutes from the time the response was generated. | expire in thirty minutes from the time the response was generated. | |||
</t> | </dd> | |||
<dt>scope</dt> | ||||
<t hangText="scope"> | <dd> | |||
<vspace/> | <bcp14>OPTIONAL</bcp14> if the scope of the issued security token is identical | |||
OPTIONAL, if the scope of the issued security token is identical to the scope | to the scope requested by the client; | |||
requested by the client; | otherwise, it is <bcp14>REQUIRED</bcp14>. | |||
otherwise, REQUIRED. | </dd> | |||
</t> | <dt>refresh_token</dt> | |||
<dd> | ||||
<t hangText="refresh_token"> | <bcp14>OPTIONAL</bcp14>. | |||
<vspace/> | ||||
OPTIONAL. | ||||
A refresh token will typically not be issued when the exchange is of one tempo rary | A refresh token will typically not be issued when the exchange is of one tempo rary | |||
credential (the subject_token) for a different temporary credential (the issue d token) | credential (the subject_token) for a different temporary credential (the issue d token) | |||
for use in some other context. | for use in some other context. | |||
A refresh token can be issued in cases where the client of the token exchange needs the | A refresh token can be issued in cases where the client of the token exchange needs the | |||
ability to access a resource even when the original credential is no longer va lid | ability to access a resource even when the original credential is no longer va lid | |||
(e.g., user-not-present or offline scenarios where there is no longer any user entertaining | (e.g., user-not-present or offline scenarios where there is no longer any user entertaining | |||
an active session with the client). | an active session with the client). | |||
Profiles or deployments of this specification should clearly document the cond itions | Profiles or deployments of this specification should clearly document the cond itions | |||
under which a client should expect a refresh token in response to | under which a client should expect a refresh token in response to | |||
<spanx style="verb">urn:ietf:params:oauth:grant-type:token-exchange</spanx> | <tt>urn:ietf:params:oauth:grant-type:token-exchange</tt> | |||
grant type requests. | grant type requests. | |||
</t> | </dd> | |||
</dl> | ||||
</list> | </section> | |||
</t> | <section anchor="ErrorResponse" numbered="true" toc="default"> | |||
</section> | <name>Error Response</name> | |||
<section anchor="ErrorResponse" title="Error Response"> | <t> | |||
<t> | If the request itself is not valid or if either the <tt>subject_token</tt> o | |||
If the request itself is not valid or if either the <spanx style="verb">subj | r <tt>actor_token</tt> are invalid for any reason, or are | |||
ect_token</spanx> or <spanx style="verb">actor_token</spanx> | unacceptable based on policy, the authorization server <bcp14>MUST</bcp14> c | |||
are invalid for any reason, or are unacceptable based on policy, the authori | onstruct an | |||
zation server | error response, as specified in <xref target="RFC6749" | |||
MUST construct an error response, as specified in Section 5.2 of <xref targe | sectionFormat="of" section="5.2"/>. | |||
t="RFC6749"/>. | The value of the <tt>error</tt> parameter <bcp14>MUST</bcp14> be the | |||
The value of the <spanx style='verb'>error</spanx> | <tt>invalid_request</tt> error code. | |||
parameter MUST be the <spanx style='verb'>invalid_request</spanx> error code | </t> | |||
. | <t> | |||
</t> | ||||
<t> | ||||
If the authorization server is unwilling or unable to issue a token for any target service | If the authorization server is unwilling or unable to issue a token for any target service | |||
indicated by the <spanx style="verb">resource</spanx> or <spanx style="verb" | indicated by the <tt>resource</tt> or <tt>audience</tt> parameters, | |||
>audience</spanx> parameters, | the <tt>invalid_target</tt> error code <bcp14>SHOULD</bcp14> be used in the | |||
the <spanx style="verb">invalid_target</spanx> error code SHOULD be used in | error response. | |||
the error response. | </t> | |||
</t> | <t> | |||
<t> | ||||
The authorization | The authorization | |||
server MAY include additional information regarding the reasons for the erro | server <bcp14>MAY</bcp14> include additional information regarding the reaso | |||
r | ns for the error | |||
using the <spanx style='verb'>error_description</spanx> as discussed in Sect | using the <tt>error_description</tt> as discussed in <xref | |||
ion 5.2 of <xref target="RFC6749"/>. | target="RFC6749" sectionFormat="of" section="5.2"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
Other error codes may also be used, as appropriate. | Other error codes may also be used, as appropriate. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
<section anchor="MainExample" numbered="true" toc="default"> | ||||
</section> | <name>Example Token Exchange</name> | |||
<t> | ||||
<section title="Example Token Exchange" anchor="MainExample"> | ||||
<t> | ||||
The following example demonstrates a hypothetical token exchange in which | The following example demonstrates a hypothetical token exchange in which | |||
an OAuth resource server | an OAuth resource server | |||
assumes the role of the client during the exchange. It | assumes the role of the client during the exchange. It | |||
trades an access token, which it received in a protected resource request, for a new | trades an access token, which it received in a protected resource request, for a new | |||
token that it will use to call to a backend service | token that it will use to call to a backend service | |||
(extra line breaks and indentation in the examples are for display purposes on ly). | (extra line breaks and indentation in the examples are for display purposes on ly). | |||
</t> | </t> | |||
<t> | <t> | |||
<xref target="main-prr"/> shows the resource server receiving a protected reso | <xref target="main-prr" format="default"/> shows the resource server receiving | |||
urce request containing | a protected resource request containing | |||
an OAuth access token in the Authorization header, as specified in | an OAuth access token in the Authorization header, as specified in | |||
Section 2.1 of <xref target="RFC6750"/>. | <xref target="RFC6750" sectionFormat="of" section="2.1"/>. | |||
</t> | </t> | |||
<figure anchor="main-prr"> | ||||
<figure title="Protected Resource Request" anchor="main-prr"> | <name>Protected Resource Request</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
GET /resource HTTP/1.1 | GET /resource HTTP/1.1 | |||
Host: frontend.example.com | Host: frontend.example.com | |||
Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC | Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> | ||||
<t> | In <xref target="main-tereq" format="default"/>, the resource server assumes t | |||
In <xref target="main-tereq"/>, the resource server assumes the role of clien | he role of | |||
t for the token exchange | client for the token exchange, and the access token from the request in | |||
and the access token from the request in <xref target="main-prr"/> is sent | <xref target="main-prr" format="default"/> is sent to the authorization server | |||
to the authorization | using a | |||
server using a request as specified in <xref target="Request"/>. | request as specified in <xref target="Request" format="default"/>. The value | |||
The value of the <spanx style="verb">subject_token</spanx> parameter carries t | of the <tt>subject_token</tt> parameter carries the access token, and | |||
he | the value of the <tt>subject_token_type</tt> parameter | |||
access token and the value of | indicates that it is an OAuth 2.0 access token. The resource server, acting | |||
the <spanx style="verb">subject_token_type</spanx> parameter indicates that it | in the role of the client, uses its identifier and secret to authenticate to | |||
is | the authorization server using the HTTP Basic authentication scheme. The | |||
an OAuth 2.0 access token. | <tt>resource</tt> parameter indicates the location of the | |||
The resource server, acting in the role of the client, uses its identifier and | backend service, <https://backend.example.com/api>, where the issued tok | |||
secret to authenticate to | en | |||
the authorization server using the HTTP Basic authentication scheme. | will be used. | |||
The <spanx style="verb">resource</spanx> parameter indicates the location | ||||
of the backend service, https://backend.example.com/api, | ||||
where the issued token will be used. | ||||
</t> | </t> | |||
<figure anchor="main-tereq"> | ||||
<figure title="Token Exchange Request" anchor="main-tereq"> | <name>Token Exchange Request</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
POST /as/token.oauth2 HTTP/1.1 | POST /as/token.oauth2 HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Authorization: Basic cnMwODpsb25nLXNlY3VyZS1yYW5kb20tc2VjcmV0 | Authorization: Basic cnMwODpsb25nLXNlY3VyZS1yYW5kb20tc2VjcmV0 | |||
Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange | grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange | |||
&resource=https%3A%2F%2Fbackend.example.com%2Fapi | &resource=https%3A%2F%2Fbackend.example.com%2Fapi | |||
&subject_token=accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC | &subject_token=accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC | |||
&subject_token_type= | &subject_token_type= | |||
urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token | urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> | ||||
<t> | ||||
The authorization server validates the client credentials and the | The authorization server validates the client credentials and the | |||
<spanx style="verb">subject_token</spanx> presented in the token | <tt>subject_token</tt> presented in the token | |||
exchange request. From the <spanx style="verb">resource</spanx> | exchange request. From the <tt>resource</tt> | |||
parameter, the authorization server is able to determine the | parameter, the authorization server is able to determine the | |||
appropriate policy to apply to the request and issues a token | appropriate policy to apply to the request and issues a token | |||
suitable for use at https://backend.example.com. | suitable for use at <https://backend.example.com>. | |||
The <spanx style="verb">access_token</spanx> parameter of the | The <tt>access_token</tt> parameter of the | |||
response shown in <xref target="main-teresp"/> contains the new token, which i | response shown in <xref target="main-teresp" format="default"/> contains the n | |||
s itself a bearer OAuth | ew token, which is itself a bearer OAuth | |||
access token that is valid for one minute. The token happens to be | access token that is valid for one minute. The token happens to be | |||
a JWT; however, its structure and format are opaque to | a JWT; however, its structure and format are opaque to | |||
the client so the <spanx style="verb">issued_token_type</spanx> | the client, so the <tt>issued_token_type</tt> | |||
indicates only that it is an access token. | indicates only that it is an access token. | |||
</t> | </t> | |||
<figure anchor="main-teresp"> | ||||
<figure title="Token Exchange Response" anchor="main-teresp"> | <name>Token Exchange Response</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Cache-Control: no-cache, no-store | Cache-Control: no-cache, no-store | |||
{ | { | |||
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQiOiJo | "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQiOiJo | |||
dHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2FzLmV | dHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2FzLmV | |||
4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1MzMsIn | 4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1MzMsIn | |||
N1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQedw6rx | N1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQedw6rx | |||
f59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIWvmDCM | f59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIWvmDCM | |||
y5-kdXjwhw", | y5-kdXjwhw", | |||
"issued_token_type": | "issued_token_type": | |||
"urn:ietf:params:oauth:token-type:access_token", | "urn:ietf:params:oauth:token-type:access_token", | |||
"token_type":"Bearer", | "token_type":"Bearer", | |||
"expires_in":60 | "expires_in":60 | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> | ||||
<t> | ||||
The resource server can then use the newly acquired access token in making | The resource server can then use the newly acquired access token in making | |||
a request to the backend server as illustrated in <xref target="main-beprr"/>. | a request to the backend server as illustrated in <xref target="main-beprr" fo rmat="default"/>. | |||
</t> | </t> | |||
<figure anchor="main-beprr"> | ||||
<figure title="Backend Protected Resource Request" anchor="main-beprr"> | <name>Backend Protected Resource Request</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
GET /api HTTP/1.1 | GET /api HTTP/1.1 | |||
Host: backend.example.com | Host: backend.example.com | |||
Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQ | Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQ | |||
iOiJodHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2 | iOiJodHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2 | |||
FzLmV4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1M | FzLmV4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1M | |||
zMsInN1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQe | zMsInN1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQe | |||
dw6rxf59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIW | dw6rxf59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIW | |||
vmDCMy5-kdXjwhw | vmDCMy5-kdXjwhw | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> | ||||
<!-- JWT signing key | Additional examples can be found in <xref target="AdditionalExamples" format | |||
{"kty":"EC","kid":"9er","use":"sig","alg":"ES256", | ="default"/>. | |||
"x":"5yoR9FjZHn7kJDALhDzhZ8i8F06mc12YswUMTBv4BoA", | </t> | |||
"y":"4uxuIItWj5Duzspth5mUbpLXWrPFzFPQkOCeAGGI6KM", | </section> | |||
"crv":"P-256", | ||||
"d":"LncS7zrx6c8X5qZRxoSN18ZEYDeI2wfKfUvX_DgwRH8"} | ||||
--> | ||||
<t> | ||||
Additional examples can be found in <xref target="AdditionalExamples"/>. | ||||
</t> | ||||
</section> | ||||
</section> | </section> | |||
<section anchor="TokenTypeIdentifiers" title="Token Type Identifiers"> | <section anchor="TokenTypeIdentifiers" numbered="true" toc="default"> | |||
<t> | <name>Token Type Identifiers</name> | |||
<t> | ||||
Several parameters in this specification utilize an identifier as the value to | Several parameters in this specification utilize an identifier as the value to | |||
describe the token in question. | describe the token in question. | |||
Specifically, they are the | Specifically, they are the | |||
<spanx style="verb">requested_token_type</spanx>, | <tt>requested_token_type</tt>, | |||
<spanx style="verb">subject_token_type</spanx>, <spanx style="verb">actor_toke | <tt>subject_token_type</tt>, and <tt>actor_token_type</tt> | |||
n_type</spanx> | parameters of the request and the <tt>issued_token_type</tt> member of the res | |||
parameters of the request and the <spanx style="verb">issued_token_type</spanx | ponse. | |||
> member of the response. | ||||
Token type identifiers are URIs. | Token type identifiers are URIs. | |||
Token Exchange can work with both tokens issued by other parties and tokens fr | Token exchange can work with both tokens issued by other parties and tokens fr | |||
om | om | |||
the given authorization server. For the former the token type identifier indic | the given authorization server. For the former, the token type identifier indi | |||
ates | cates | |||
the syntax (e.g., JWT or SAML 2.0) so the authorization server can parse it; f | the syntax (e.g., JWT or SAML 2.0) so the authorization server can parse it; f | |||
or the latter it indicates | or the latter, it indicates | |||
what the given authorization server issued it for (e.g., access_token or refre | what the given authorization server issued it for (e.g., <tt>access_token</tt> | |||
sh_token). | or <tt>refresh_token</tt>). | |||
</t> | </t> | |||
<t> | <t> | |||
The following token type identifiers are defined by this specification. | The following token type identifiers are defined by this specification. | |||
Other URIs MAY be used to indicate other token types. | Other URIs <bcp14>MAY</bcp14> be used to indicate other token types. | |||
</t> | </t> | |||
<t> | <dl newline="true" spacing="normal"> | |||
<list style="hanging"> | <dt>urn:ietf:params:oauth:token-type:access_token</dt> | |||
<dd> | ||||
<t hangText="urn:ietf:params:oauth:token-type:access_token"> | ||||
<vspace/> | ||||
Indicates that the token is an OAuth 2.0 access token issued by the given au thorization server. | Indicates that the token is an OAuth 2.0 access token issued by the given au thorization server. | |||
</t> | </dd> | |||
<dt>urn:ietf:params:oauth:token-type:refresh_token</dt> | ||||
<t hangText="urn:ietf:params:oauth:token-type:refresh_token"> | <dd> | |||
<vspace/> | ||||
Indicates that the token is an OAuth 2.0 refresh token issued by the given a uthorization server. | Indicates that the token is an OAuth 2.0 refresh token issued by the given a uthorization server. | |||
</t> | </dd> | |||
<dt>urn:ietf:params:oauth:token-type:id_token</dt> | ||||
<t hangText="urn:ietf:params:oauth:token-type:id_token"> | <dd> | |||
<vspace/> | Indicates that the token is an ID Token as defined in Section 2 of <xref | |||
Indicates that the token is an ID Token, as defined in Section 2 of <xref ta | target="OpenID.Core" format="default"/>. | |||
rget="OpenID.Core"/>. | </dd> | |||
</t> | <dt>urn:ietf:params:oauth:token-type:saml1</dt> | |||
<dd> | ||||
<t hangText="urn:ietf:params:oauth:token-type:saml1"> | Indicates that the token is a base64url-encoded SAML 1.1 <xref target="OASIS | |||
<vspace/> | .saml-core-1.1" format="default"/> assertion. | |||
Indicates that the token is a base64url-encoded SAML 1.1 <xref target="OASIS | </dd> | |||
.saml-core-1.1"/> assertion. | <dt>urn:ietf:params:oauth:token-type:saml2</dt> | |||
</t> | <dd> | |||
Indicates that the token is a base64url-encoded SAML 2.0 <xref target="OASIS | ||||
<t hangText="urn:ietf:params:oauth:token-type:saml2"> | .saml-core-2.0-os" format="default"/> assertion. | |||
<vspace/> | </dd> | |||
Indicates that the token is a base64url-encoded SAML 2.0 <xref target="OASIS | </dl> | |||
.saml-core-2.0-os"/> assertion. | <t> | |||
</t> | The value <tt>urn:ietf:params:oauth:token-type:jwt</tt>, which is defined in | |||
</list> | <xref target="RFC7519" sectionFormat="of" section="9"/>, indicates that the to | |||
</t> | ken is a JWT. | |||
<t> | ||||
The value <spanx style="verb">urn:ietf:params:oauth:token-type:jwt</spanx>, wh | ||||
ich is defined in | ||||
Section 9 of <xref target="JWT"/>, indicates that the token is a JWT. | ||||
</t> | </t> | |||
<t> | <t> | |||
The distinction between an access token and a JWT is subtle. | The distinction between an access token and a JWT is subtle. | |||
An access token represents a delegated authorization decision, whereas JWT is a token format. | An access token represents a delegated authorization decision, whereas JWT is a token format. | |||
An access token can be formatted as a JWT but doesn't necessarily have to be. And a | An access token can be formatted as a JWT but doesn't necessarily have to be. And a | |||
JWT might well be an access token but not all JWTs are access tokens. | JWT might well be an access token, but not all JWTs are access tokens. | |||
The intent of this specification is that <spanx style="verb">urn:ietf:params:o auth:token-type:access_token</spanx> | The intent of this specification is that <tt>urn:ietf:params:oauth:token-type: access_token</tt> | |||
be an indicator that the token is a typical OAuth access token issued by the a uthorization server in question, opaque to the client, | be an indicator that the token is a typical OAuth access token issued by the a uthorization server in question, opaque to the client, | |||
and usable the same manner as any other access token obtained from that author ization server. | and usable the same manner as any other access token obtained from that author ization server. | |||
(It could well be a JWT, but the client isn't and needn't be aware of that fac t.) | (It could well be a JWT, but the client isn't and needn't be aware of that fac t.) | |||
Whereas, <spanx style="verb">urn:ietf:params:oauth:token-type:jwt</spanx> is t | Whereas, <tt>urn:ietf:params:oauth:token-type:jwt</tt> is to indicate specific | |||
o indicate specifically that a JWT is | ally that a JWT is | |||
being requested or sent (perhaps in a cross-domain use-case where the JWT is u | being requested or sent (perhaps in a cross-domain use case where the JWT is u | |||
sed as an authorization grant to | sed as an authorization grant to | |||
obtain an access token from a different authorization server as is facilitated | obtain an access token from a different authorization server as is facilitated | |||
by <xref target="RFC7523"/>). | by <xref target="RFC7523" format="default"/>). | |||
</t> | </t> | |||
<t> | <t> | |||
Note that for tokens which are binary in nature, the URI used for conveying th | Note that for tokens that are binary in nature, the URI used for conveying the | |||
em | m | |||
needs to be associated with the semantics of a base64 or other | needs to be associated with the semantics of a base64 or other | |||
encoding suitable for usage with HTTP and OAuth. | encoding suitable for usage with HTTP and OAuth. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="JWTClaims" numbered="true" toc="default"> | ||||
<section title="JSON Web Token Claims and Introspection Response Parameters" | <name>JSON Web Token Claims and Introspection Response Parameters</name> | |||
anchor="JWTClaims"> | <t> | |||
<t> | It is useful to have defined mechanisms to express delegation within a | |||
It is useful to have defined mechanisms to express delegation within a token | token as well as to express authorization to delegate or | |||
as well as to express | impersonate. Although the token exchange protocol described herein can be | |||
authorization to delegate or impersonate. Although the token exchange protoco | used with any type of token, this section defines claims to express such | |||
l described | semantics specifically for JWTs and in an OAuth 2.0 Token Introspection <xref | |||
herein can be used with any type of token, this section defines claims to exp | target="RFC7662" | |||
ress such | format="default"></xref> response. Similar | |||
semantics specifically for JWTs and in an <xref target="RFC7662">OAuth 2.0 To | definitions for other types of tokens are possible but beyond the scope of | |||
ken Introspection</xref> response. | this specification. | |||
Similar definitions for other types of tokens are possible but | </t> | |||
beyond the scope of this specification. | <t> | |||
</t> | ||||
<t> | ||||
Note that the claims not established herein but used in examples and descript ions, | Note that the claims not established herein but used in examples and descript ions, | |||
such as <spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>, | such as <tt>iss</tt>, <tt>sub</tt>, | |||
<spanx style="verb">exp</spanx>, etc., are defined by <xref target="JWT"/>. | <tt>exp</tt>, etc., are defined by <xref target="RFC7519" format="default"/>. | |||
</t> | </t> | |||
<section title='"act" (Actor) Claim' anchor="actor"> | <section anchor="actor" numbered="true" toc="default"> | |||
<t> | <name>"act" (Actor) Claim</name> | |||
The <spanx style="verb">act</spanx> (actor) claim provides a means within | <t> | |||
a JWT | The <tt>act</tt> (actor) claim provides a means | |||
to express that delegation has occurred and identify the acting party to w | within a JWT to express that delegation has occurred and identify the | |||
hom authority has been delegated. | acting party to whom authority has been delegated. The <tt>act</tt> claim | |||
The <spanx style="verb">act</spanx> claim value is a JSON object and | value is a JSON object, and members in | |||
members in the JSON object are claims that identify the actor. | the JSON object are claims that identify the actor. The claims that | |||
The claims that make up the <spanx style="verb">act</spanx> | make up the <tt>act</tt> claim identify and possibly | |||
claim identify and possibly provide additional information about the actor | provide additional information about the actor. For example, the | |||
. | combination of the two claims <tt>iss</tt> and <tt>sub</tt> might be neces | |||
For example, the combination of the two claims <spanx style="verb">iss</sp | sary to uniquely identify an | |||
anx> | actor. | |||
and <spanx style="verb">sub</spanx> might be necessary to uniquely identif | </t> | |||
y an actor. | <t> | |||
</t> | However, claims within the <tt>act</tt> claim pertain only to the identity | |||
<t> | of the actor | |||
However, claims within the <spanx style="verb">act</spanx> claim pertain o | ||||
nly to the identity of the actor | ||||
and are not relevant to the validity of the containing JWT in the same man ner as the top-level claims. | and are not relevant to the validity of the containing JWT in the same man ner as the top-level claims. | |||
Consequently, non-identity claims (e.g., <spanx style="verb">exp</spanx>, | Consequently, non-identity claims (e.g., <tt>exp</tt>, <tt>nbf</tt>, | |||
<spanx style="verb">nbf</spanx>, | and <tt>aud</tt>) are not meaningful when used within an | |||
and <spanx style="verb">aud</spanx>) are not meaningful when used within a | <tt>act</tt> claim and are therefore not used. | |||
n | </t> | |||
<spanx style="verb">act</spanx> claim, and therefore are not used. | <t><xref target="act-ex" format="default"/> illustrates the <tt>act</tt> | |||
</t> | (actor) claim within a JWT Claims Set. The | |||
claims of the token itself are about user@example.com while the <tt>act< | ||||
<figure title="Actor Claim" anchor="act-ex"> | /tt> claim indicates that admin@example.com is the | |||
<preamble> | current actor. | |||
<xref target="act-ex"/> illustrates the <spanx style="verb">act</spanx> | </t> | |||
(actor) claim within a JWT Claims Set. | <figure anchor="act-ex"> | |||
The claims of the token itself are about user@example.com while the <spa | <name>Actor Claim</name> | |||
nx style="verb">act</spanx> claim indicates | <sourcecode type="json"><![CDATA[ | |||
that admin@example.com is the current actor. | ||||
</preamble> | ||||
<artwork><![CDATA[ | ||||
{ | { | |||
"aud":"https://consumer.example.com", | "aud":"https://consumer.example.com", | |||
"iss":"https://issuer.example.com", | "iss":"https://issuer.example.com", | |||
"exp":1443904177, | "exp":1443904177, | |||
"nbf":1443904077, | "nbf":1443904077, | |||
"sub":"user@example.com", | "sub":"user@example.com", | |||
"act": | "act": | |||
{ | { | |||
"sub":"admin@example.com" | "sub":"admin@example.com" | |||
} | } | |||
} | }]]></sourcecode></figure> | |||
]]></artwork> | <t> | |||
</figure> | A chain of delegation can be expressed by nesting one <tt>act</tt> claim w | |||
ithin | ||||
<t> | another. The outermost <tt>act</tt> claim represents the current actor whi | |||
A chain of delegation can be expressed by nesting one <spanx style="verb"> | le nested | |||
act</spanx> claim within | <tt>act</tt> claims represent prior actors. The least recent actor is the | |||
another. The outermost <spanx style="verb">act</spanx> claim represents th | most deeply | |||
e current actor while nested | nested. The nested <tt>act</tt> claims | |||
<spanx style="verb">act</spanx> claims represent prior actors. The least r | ||||
ecent actor is the most deeply | ||||
nested. The nested <spanx style="verb">act</spanx> claims | ||||
serve as a history trail that connects the initial request and subject | serve as a history trail that connects the initial request and subject | |||
through the various delegation steps undertaken before reaching the | through the various delegation steps undertaken before reaching the | |||
current actor. In this sense, the current actor is considered to | current actor. In this sense, the current actor is considered to | |||
include the entire authorization/delegation history, leading naturally | include the entire authorization/delegation history, leading naturally | |||
to the nested structure described here. | to the nested structure described here. | |||
</t> | </t> | |||
<t> | <t> | |||
For the purpose of applying access control policy, the consumer of a token | For the purpose of applying access control policy, the consumer of a token | |||
MUST only consider the token's | <bcp14>MUST</bcp14> only consider the token's | |||
top-level claims and the party identified as the current actor by the <spa | top-level claims and the party identified as the current actor by the <tt> | |||
nx style="verb">act</spanx> | act</tt> | |||
claim. Prior actors identified by any nested <spanx style="verb">act</span | claim. Prior actors identified by any nested <tt>act</tt> claims are | |||
x> claims are | ||||
informational only and are not to be considered in access control decision s. | informational only and are not to be considered in access control decision s. | |||
</t> | </t> | |||
<figure title="Nested Actor Claim" anchor="acts-ex"> | <t> | |||
<preamble> | The following example in <xref target="acts-ex" format="default"/> illus | |||
The following example in <xref target="acts-ex"/> illustrates nested <sp | trates nested <tt>act</tt> (actor) claims within a JWT Claims Set. | |||
anx style="verb">act</spanx> (actor) claims within a JWT Claims Set. | The claims of the token itself are about user@example.com while the <tt> | |||
The claims of the token itself are about user@example.com while the <spa | act</tt> claim indicates | |||
nx style="verb">act</spanx> claim indicates | that the system <https://service16.example.com> is the current act | |||
that the system https://service16.example.com is the current actor and h | or and <https://service77.example.com> was a prior actor. | |||
ttps://service77.example.com was a prior actor. | ||||
Such a token might come about as the result of service16 receiving a tok en in a call from service77 | Such a token might come about as the result of service16 receiving a tok en in a call from service77 | |||
and exchanging it for a token suitable to call service26 while the autho rization server | and exchanging it for a token suitable to call service26 while the autho rization server | |||
notes the situation in the newly issued token. | notes the situation in the newly issued token. | |||
</preamble> | </t> | |||
<artwork><![CDATA[ | <figure anchor="acts-ex"> | |||
<name>Nested Actor Claim</name> | ||||
<sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"aud":"https://service26.example.com", | "aud":"https://service26.example.com", | |||
"iss":"https://issuer.example.com", | "iss":"https://issuer.example.com", | |||
"exp":1443904100, | "exp":1443904100, | |||
"nbf":1443904000, | "nbf":1443904000, | |||
"sub":"user@example.com", | "sub":"user@example.com", | |||
"act": | "act": | |||
{ | { | |||
"sub":"https://service16.example.com", | "sub":"https://service16.example.com", | |||
"act": | "act": | |||
{ | { | |||
"sub":"https://service77.example.com" | "sub":"https://service77.example.com" | |||
} | } | |||
} | } | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t> | <t> | |||
When included as a top-level member of an OAuth token introspection respon | When included as a top-level member of an OAuth token introspection respon | |||
se, <spanx style="verb">act</spanx> | se, <tt>act</tt> | |||
has the same semantics and format as the claim of the same name. | has the same semantics and format as the claim of the same name. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='"scope" (Scopes) Claim' anchor="scopes"> | <section anchor="scopes" numbered="true" toc="default"> | |||
<t> | <name>"scope" (Scopes) Claim</name> | |||
The value of the <spanx style="verb">scope</spanx> claim is a | <t> | |||
The value of the <tt>scope</tt> claim is a | ||||
JSON string containing a space-separated list of | JSON string containing a space-separated list of | |||
scopes associated with the token, in the format described in | scopes associated with the token, in the format described in | |||
Section 3.3 of <xref target="RFC6749"/>. | <xref target="RFC6749" sectionFormat="of" section="3.3"/>. | |||
</t> | </t> | |||
<figure title="Scopes Claim" anchor="scope-ex"> | <t><xref target="scope-ex" format="default"/> illustrates the <tt>scope< | |||
<preamble> | /tt> claim within a JWT Claims Set. | |||
<xref target="scope-ex"/> illustrates the <spanx style="verb">scope</spa | </t> | |||
nx> claim within a JWT Claims Set. | <figure anchor="scope-ex"> | |||
</preamble> | <name>Scopes Claim</name> | |||
<artwork><![CDATA[ | <sourcecode type="json"><![CDATA[ | |||
{ | { | |||
"aud":"https://consumer.example.com", | "aud":"https://consumer.example.com", | |||
"iss":"https://issuer.example.com", | "iss":"https://issuer.example.com", | |||
"exp":1443904177, | "exp":1443904177, | |||
"nbf":1443904077, | "nbf":1443904077, | |||
"sub":"dgaf4mvfs75Fci_FL3heQA", | "sub":"dgaf4mvfs75Fci_FL3heQA", | |||
"scope":"email profile phone address" | "scope":"email profile phone address" | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t> | <t> | |||
<xref target="RFC7662">OAuth 2.0 Token Introspection</xref> already define | <xref target="RFC7662" format="default">OAuth 2.0 Token Introspection</xre | |||
s the <spanx style="verb">scope</spanx> | f> already defines the <tt>scope</tt> | |||
parameter to convey the scopes associated with the token. | parameter to convey the scopes associated with the token. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="client_id" numbered="true" toc="default"> | ||||
<section title='"client_id" (Client Identifier) Claim' anchor="client_id"> | <name>"client_id" (Client Identifier) Claim</name> | |||
<t> | <t> | |||
The <spanx style="verb">client_id</spanx> claim carries the | The <tt>client_id</tt> claim carries the | |||
client identifier of the <xref target="RFC6749">OAuth 2.0</xref> client th | client identifier of the <xref target="RFC6749" format="default">OAuth 2.0 | |||
at | </xref> client that | |||
requested the token. | requested the token. | |||
</t> | </t> | |||
<t> | ||||
<figure title="Client Identifier Claim" anchor="client_id-ex"> | The following example in <xref target="client_id-ex" format="default"/> | |||
<preamble> | illustrates the <tt>client_id</tt> claim within a JWT Claims Set | |||
The following example in <xref target="client_id-ex"/> illustrates the < | ||||
spanx style="verb">client_id</spanx> claim within a JWT Claims Set | ||||
indicating an OAuth 2.0 client with "s6BhdRkqt3" as its identifier. | indicating an OAuth 2.0 client with "s6BhdRkqt3" as its identifier. | |||
</preamble> | </t> | |||
<artwork><![CDATA[ | <figure anchor="client_id-ex"> | |||
<name>Client Identifier Claim</name> | ||||
<sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"aud":"https://consumer.example.com", | "aud":"https://consumer.example.com", | |||
"iss":"https://issuer.example.com", | "iss":"https://issuer.example.com", | |||
"exp":1443904177, | "exp":1443904177, | |||
"sub":"user@example.com", | "sub":"user@example.com", | |||
"client_id":"s6BhdRkqt3" | "client_id":"s6BhdRkqt3" | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t> | <t> | |||
<xref target="RFC7662">OAuth 2.0 Token Introspection</xref> already define | <xref target="RFC7662" format="default">OAuth 2.0 Token Introspection</xre | |||
s the <spanx style="verb">client_id</spanx> | f> already defines the <tt>client_id</tt> | |||
parameter as the client identifier for the OAuth 2.0 client that requested the token. | parameter as the client identifier for the OAuth 2.0 client that requested the token. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="may_act" numbered="true" toc="default"> | ||||
<section title='"may_act" (Authorized Actor) Claim' anchor="may_act"> | <name>"may_act" (Authorized Actor) Claim</name> | |||
<t> | <t> | |||
The <spanx style="verb">may_act</spanx> claim makes a statement that one p | The <tt>may_act</tt> claim makes a statement that one party is authorized | |||
arty is authorized to | to | |||
become the actor and act on behalf of another party. | become the actor and act on behalf of another party. | |||
The claim might be used, for example, when a <spanx style="verb">subject_t oken</spanx> is | The claim might be used, for example, when a <tt>subject_token</tt> is | |||
presented to the token endpoint in a token exchange request and | presented to the token endpoint in a token exchange request and | |||
<spanx style="verb">may_act</spanx> claim in the subject token can be used by the authorization | <tt>may_act</tt> claim in the subject token can be used by the authorizati on | |||
server to determine whether the client (or party identified in the | server to determine whether the client (or party identified in the | |||
<spanx style="verb">actor_token</spanx>) is authorized to engage in the re quested delegation or | <tt>actor_token</tt>) is authorized to engage in the requested delegation or | |||
impersonation. | impersonation. | |||
The claim value is a JSON object and members in the JSON object are claims that identify the party that | The claim value is a JSON object, and members in the JSON object are claim s that identify the party that | |||
is asserted as being eligible to act for the party identified by | is asserted as being eligible to act for the party identified by | |||
the JWT containing the claim. | the JWT containing the claim. | |||
The claims that make up the <spanx style="verb">may_act</spanx> | The claims that make up the <tt>may_act</tt> | |||
claim identify and possibly provide additional information about the autho rized actor. | claim identify and possibly provide additional information about the autho rized actor. | |||
For example, the combination of the two claims <spanx style="verb">iss</sp | For example, the combination of the two claims <tt>iss</tt> | |||
anx> | and <tt>sub</tt> are sometimes necessary to uniquely identify an authorize | |||
and <spanx style="verb">sub</spanx> are sometimes necessary to uniquely id | d actor, | |||
entify an authorized actor, | while the <tt>email</tt> claim might be used to provide additional useful | |||
while the <spanx style="verb">email</spanx> claim might be used to provide | information about | |||
additional useful information about | ||||
that party. | that party. | |||
</t> | </t> | |||
<t> | <t> | |||
However, claims within the <spanx style="verb">may_act</spanx> claim perta | However, claims within the <tt>may_act</tt> claim pertain only to the iden | |||
in only to the identity of that party | tity of that party | |||
and are not relevant to the validity of the containing JWT | and are not relevant to the validity of the containing JWT | |||
in the same manner as top-level claims. | in the same manner as top-level claims. | |||
Consequently, claims such as <spanx style="verb">exp</spanx>, <spanx style | Consequently, claims such as <tt>exp</tt>, <tt>nbf</tt>, and | |||
="verb">nbf</spanx>, and | <tt>aud</tt> are not meaningful when used within a <tt>may_act</tt> | |||
<spanx style="verb">aud</spanx> are not meaningful when used within a <spa | claim and are therefore not used. | |||
nx style="verb">may_act</spanx> | </t> | |||
claim, and therefore are not used. | ||||
</t> | ||||
<t> | ||||
</t> | <t><xref target="may_act-ex" format="default"/> illustrates the <tt>may_ | |||
<figure title="Authorized Actor Claim" anchor="may_act-ex"> | act</tt> claim within a JWT Claims Set. | |||
<preamble> | The claims of the token itself are about user@example.com while the <tt> | |||
<xref target="may_act-ex"/> illustrates the <spanx style="verb">may_act< | may_act</tt> claim indicates | |||
/spanx> claim within a JWT Claims Set. | ||||
The claims of the token itself are about user@example.com while the <spa | ||||
nx style="verb">may_act</spanx> claim indicates | ||||
that admin@example.com is authorized to act on behalf of user@example.co m. | that admin@example.com is authorized to act on behalf of user@example.co m. | |||
</preamble> | </t> | |||
<artwork><![CDATA[ | <figure anchor="may_act-ex"> | |||
<name>Authorized Actor Claim</name> | ||||
<sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"aud":"https://consumer.example.com", | "aud":"https://consumer.example.com", | |||
"iss":"https://issuer.example.com", | "iss":"https://issuer.example.com", | |||
"exp":1443904177, | "exp":1443904177, | |||
"nbf":1443904077, | "nbf":1443904077, | |||
"sub":"user@example.com", | "sub":"user@example.com", | |||
"may_act": | "may_act": | |||
{ | { | |||
"sub":"admin@example.com" | "sub":"admin@example.com" | |||
} | } | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t> | <t> | |||
When included as a top-level member of an OAuth token introspection respon | When included as a top-level member of an OAuth token introspection respon | |||
se, <spanx style="verb">may_act</spanx> | se, <tt>may_act</tt> | |||
has the same semantics and format as the claim of the same name. | has the same semantics and format as the claim of the same name. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="Security" numbered="true" toc="default"> | ||||
<section anchor="Security" title="Security Considerations"> | <name>Security Considerations</name> | |||
<t> | <t> | |||
Much of the guidance from Section 10 of <xref target="RFC6749"/>, | Much of the guidance from <xref target="RFC6749" | |||
sectionFormat="of" section="10"/>, | ||||
the Security Considerations in The OAuth 2.0 Authorization Framework, | the Security Considerations in The OAuth 2.0 Authorization Framework, | |||
is also applicable here. | is also applicable here. | |||
Furthermore, <xref target="RFC6819"/> | Furthermore, <xref target="RFC6819" format="default"/> | |||
provides additional security considerations for OAuth and | provides additional security considerations for OAuth, and | |||
<xref target="OAUTH-SECURITY"/> | <xref target="I-D.ietf-oauth-security-topics" format="default"/> | |||
has updated security guidance based on deployment experience and new thr eats that have | has updated security guidance based on deployment experience and new thr eats that have | |||
emerged since OAuth 2.0 was originally published. | emerged since OAuth 2.0 was originally published. | |||
</t> | </t> | |||
<t> | <t> | |||
All of the normal security issues that are discussed in <xref target="JW T"/>, | All of the normal security issues that are discussed in <xref target="RF C7519" format="default"/>, | |||
especially in relationship to comparing URIs and dealing with unrecogniz ed values, | especially in relationship to comparing URIs and dealing with unrecogniz ed values, | |||
also apply here. | also apply here. | |||
</t> | </t> | |||
<t> | <t> | |||
In addition, both delegation and impersonation introduce unique security | In addition, both delegation and impersonation introduce unique | |||
issues. Any time one principal is delegated the rights of | security issues. Any time one principal is delegated the rights of | |||
another principal, the potential for abuse is a concern. | another principal, the potential for abuse is a concern. The use of | |||
The use of the <spanx style="verb">scope</spanx> claim (in addition to o | the <tt>scope</tt> claim (in addition to other | |||
ther typical constraints such as a limited token lifetime) | typical constraints such as a limited token lifetime) is suggested to | |||
is suggested to mitigate | mitigate potential for such abuse, as it restricts the contexts in | |||
potential for such abuse, as it restricts the contexts in which | which the delegated rights can be exercised. | |||
the delegated rights can be exercised. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="Privacy" title="Privacy Considerations"> | <section anchor="Privacy" numbered="true" toc="default"> | |||
<name>Privacy Considerations</name> | ||||
<t> | <t> | |||
Tokens employed in the context of the functionality described herein | Tokens employed in the context of the functionality described herein | |||
may contain privacy-sensitive information and, to prevent | may contain privacy-sensitive information and, to prevent | |||
disclosure of such information to unintended parties, MUST only be | disclosure of such information to unintended parties, <bcp14>MUST</bcp14 > only be | |||
transmitted over encrypted channels, such as Transport Layer Security | transmitted over encrypted channels, such as Transport Layer Security | |||
(TLS). In cases where it is desirable to prevent disclosure of certain | (TLS). In cases where it is desirable to prevent disclosure of certain | |||
information to the client, the token MUST be encrypted to its | information to the client, the token <bcp14>MUST</bcp14> be encrypted to | |||
intended recipient. Deployments SHOULD determine the minimally necessary | its | |||
intended recipient. Deployments <bcp14>SHOULD</bcp14> determine the mini | ||||
mally necessary | ||||
amount of data and only include such information in issued tokens. | amount of data and only include such information in issued tokens. | |||
In some cases, data minimization may include representing only an | In some cases, data minimization may include representing only an | |||
anonymous or pseudonymous user. | anonymous or pseudonymous user. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="IANA" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<section anchor="IANA" title="IANA Considerations"> | <section anchor="URIReg" numbered="true" toc="default"> | |||
<name>OAuth URI Registration</name> | ||||
<section anchor="URIReg" title="OAuth URI Registration"> | <t> | |||
IANA has registered the following values in the | ||||
<t> | "OAuth URI" subregistry of the "OAuth Parameters" registry | |||
This specification registers the following values in the | <xref target="IANA.OAuth.Parameters" format="default"/>. The "OAuth URI | |||
IANA "OAuth URI" registry | " subregistry was | |||
<xref target="IANA.OAuth.Parameters"/> | established by <xref target="RFC6755" format="default"/>. | |||
established by <xref target="RFC6755"/>. | </t> | |||
</t> | <ul spacing="compact"> | |||
<li>URN: urn:ietf:params:oauth:grant-type:token-exchange</li> | ||||
<section title="Registry Contents" anchor="URIContents"> | <li>Common Name: Token exchange grant type for OAuth 2.0</li> | |||
<li>Change Controller: IESG</li> | ||||
<t> | <li>Specification Document: <xref target="Request" format="default"/> | |||
<?rfc subcompact="yes"?> | of RFC 8693</li> | |||
<list style="symbols"> | </ul> | |||
<t>URN: urn:ietf:params:oauth:grant-type:token-exchange</t> | <ul spacing="compact"> | |||
<t>Common Name: Token exchange grant type for OAuth 2.0</t> | <li>URN: urn:ietf:params:oauth:token-type:access_token</li> | |||
<t>Change controller: IESG</t> | <li>Common Name: Token type URI for an OAuth 2.0 access token</li> | |||
<t>Specification Document: <xref target="Request"/> of [[ this spec | <li>Change Controller: IESG</li> | |||
ification ]]</t> | <li>Specification Document: <xref target="TokenTypeIdentifiers" format | |||
</list> | ="default"/> of RFC 8693</li> | |||
</t> | </ul> | |||
<t> | <ul spacing="compact"> | |||
<list style="symbols"> | <li>URN: urn:ietf:params:oauth:token-type:refresh_token</li> | |||
<t>URN: urn:ietf:params:oauth:token-type:access_token</t> | <li>Common Name: Token type URI for an OAuth 2.0 refresh token</li> | |||
<t>Common Name: Token type URI for an OAuth 2.0 access token</t> | <li>Change Controller: IESG</li> | |||
<t>Change controller: IESG</t> | <li>Specification Document: <xref target="TokenTypeIdentifiers" format | |||
<t>Specification Document: <xref target="TokenTypeIdentifiers"/> of | ="default"/> of RFC 8693</li> | |||
[[this specification]]</t> | </ul> | |||
</list> | <ul spacing="compact"> | |||
</t> | <li>URN: urn:ietf:params:oauth:token-type:id_token</li> | |||
<t> | <li>Common Name: Token type URI for an ID Token</li> | |||
<list style="symbols"> | <li>Change Controller: IESG</li> | |||
<t>URN: urn:ietf:params:oauth:token-type:refresh_token</t> | <li>Specification Document: <xref target="TokenTypeIdentifiers" format | |||
<t>Common Name: Token type URI for an OAuth 2.0 refresh token</t> | ="default"/> of RFC 8693</li> | |||
<t>Change controller: IESG</t> | </ul> | |||
<t>Specification Document: <xref target="TokenTypeIdentifiers"/> of | <ul spacing="compact"> | |||
[[this specification]]</t> | <li>URN: urn:ietf:params:oauth:token-type:saml1</li> | |||
</list> | <li>Common Name: Token type URI for a base64url-encoded SAML 1.1 asser | |||
</t> | tion</li> | |||
<t> | <li>Change Controller: IESG</li> | |||
<list style="symbols"> | <li>Specification Document: <xref target="TokenTypeIdentifiers" format | |||
<t>URN: urn:ietf:params:oauth:token-type:id_token</t> | ="default"/> of RFC 8693</li> | |||
<t>Common Name: Token type URI for an ID Token</t> | </ul> | |||
<t>Change controller: IESG</t> | <ul spacing="compact"> | |||
<t>Specification Document: <xref target="TokenTypeIdentifiers"/> of | <li>URN: urn:ietf:params:oauth:token-type:saml2</li> | |||
[[this specification]]</t> | <li>Common Name: Token type URI for a base64url-encoded SAML 2.0 asser | |||
</list> | tion</li> | |||
</t> | <li>Change Controller: IESG</li> | |||
<t> | <li>Specification Document: <xref target="TokenTypeIdentifiers" format | |||
<list style='symbols'> | ="default"/> of RFC 8693</li> | |||
<t>URN: urn:ietf:params:oauth:token-type:saml1</t> | </ul> | |||
<t>Common Name: Token type URI for a base64url-encoded SAML 1.1 ass | ||||
ertion</t> | ||||
<t>Change Controller: IESG</t> | ||||
<t>Specification Document: <xref target="TokenTypeIdentifiers"/> of | ||||
[[this specification]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>URN: urn:ietf:params:oauth:token-type:saml2</t> | ||||
<t>Common Name: Token type URI for a base64url-encoded SAML 2.0 ass | ||||
ertion</t> | ||||
<t>Change Controller: IESG</t> | ||||
<t>Specification Document: <xref target="TokenTypeIdentifiers"/> of | ||||
[[this specification]]</t> | ||||
</list> | ||||
</t> | ||||
<?rfc subcompact="no"?> | ||||
</section> | ||||
</section> | ||||
<section anchor="OAuthParametersReg" title="OAuth Parameters Registration" | ||||
> | ||||
<t> | ||||
This specification registers the following values | ||||
in the IANA "OAuth Parameters" registry | ||||
<xref target="IANA.OAuth.Parameters"/> | ||||
established by <xref target="RFC6749"/>. | ||||
</t> | ||||
<section anchor='ParametersContents' title='Registry Contents'> | ||||
<t> | ||||
<?rfc subcompact="yes"?> | ||||
<list style='symbols'> | ||||
<t>Parameter name: resource</t> | ||||
<t>Parameter usage location: token request</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="Request"/> of [[ this s | ||||
pecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Parameter name: audience</t> | ||||
<t>Parameter usage location: token request</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="Request"/> of [[ this s | ||||
pecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Parameter name: requested_token_type</t> | ||||
<t>Parameter usage location: token request</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="Request"/> of [[ this s | ||||
pecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Parameter name: subject_token</t> | ||||
<t>Parameter usage location: token request</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="Request"/> of [[ this s | ||||
pecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Parameter name: subject_token_type</t> | ||||
<t>Parameter usage location: token request</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="Request"/> of [[ this s | ||||
pecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Parameter name: actor_token</t> | ||||
<t>Parameter usage location: token request</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="Request"/> of [[ this s | ||||
pecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Parameter name: actor_token_type</t> | ||||
<t>Parameter usage location: token request</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="Request"/> of [[ this s | ||||
pecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Parameter name: issued_token_type</t> | ||||
<t>Parameter usage location: token response</t> | ||||
<t>Change controller: IESG</t> | ||||
<t>Specification document(s): <xref target="SuccessfulResponse"/> o | ||||
f [[ this specification ]]</t> | ||||
</list> | ||||
</t> | ||||
<?rfc subcompact="no"?> | ||||
</section> | ||||
</section> | </section> | |||
<section anchor="OAuthParametersReg" numbered="true" toc="default"> | ||||
<section anchor="TokenTypeReg" title='OAuth Access Token Type Registration | <name>OAuth Parameters Registration</name> | |||
'> | ||||
<t> | <t> | |||
This specification registers the following access token type | IANA has registered the following values | |||
in the IANA "OAuth Access Token Types" registry | in the "OAuth Parameters" subregistry of the "OAuth Parameters" registr | |||
<xref target="IANA.OAuth.Parameters"/> | y | |||
established by <xref target="RFC6749"/>. | <xref target="IANA.OAuth.Parameters" format="default"/>. The "OAuth Par | |||
ameters" | ||||
subregistry was | ||||
established by <xref target="RFC6749" format="default"/>. | ||||
</t> | </t> | |||
<section anchor="TokenTypeContents" title='Registry Contents'> | <ul spacing="compact"> | |||
<li>Parameter name: audience</li> | ||||
<t> | <li>Parameter usage location: token request</li> | |||
<?rfc subcompact="yes"?> | <li>Change controller: IESG</li> | |||
<list style='symbols'> | <li>Specification document(s): <xref target="Request" format="default" | |||
<t>Type name: N_A</t> | /> of RFC 8693</li> | |||
<t>Additional Token Endpoint Response Parameters: (none)</t> | </ul> | |||
<t>HTTP Authentication Scheme(s): (none)</t> | <ul spacing="compact"> | |||
<t>Change controller: IESG</t> | <li>Parameter name: requested_token_type</li> | |||
<t>Specification document(s): <xref target="SuccessfulResponse"/> | <li>Parameter usage location: token request</li> | |||
of [[ this specification ]]</t> | <li>Change controller: IESG</li> | |||
</list> | <li>Specification document(s): <xref target="Request" format="default" | |||
</t> | /> of RFC 8693</li> | |||
<?rfc subcompact="no"?> | </ul> | |||
<ul spacing="compact"> | ||||
</section> | <li>Parameter name: subject_token</li> | |||
<li>Parameter usage location: token request</li> | ||||
<li>Change controller: IESG</li> | ||||
<li>Specification document(s): <xref target="Request" format="default" | ||||
/> of RFC 8693</li> | ||||
</ul> | ||||
<ul spacing="compact"> | ||||
<li>Parameter name: subject_token_type</li> | ||||
<li>Parameter usage location: token request</li> | ||||
<li>Change controller: IESG</li> | ||||
<li>Specification document(s): <xref target="Request" format="default" | ||||
/> of RFC 8693</li> | ||||
</ul> | ||||
<ul spacing="compact"> | ||||
<li>Parameter name: actor_token</li> | ||||
<li>Parameter usage location: token request</li> | ||||
<li>Change controller: IESG</li> | ||||
<li>Specification document(s): <xref target="Request" format="default" | ||||
/> of RFC 8693</li> | ||||
</ul> | ||||
<ul spacing="compact"> | ||||
<li>Parameter name: actor_token_type</li> | ||||
<li>Parameter usage location: token request</li> | ||||
<li>Change controller: IESG</li> | ||||
<li>Specification document(s): <xref target="Request" format="default" | ||||
/> of RFC 8693</li> | ||||
</ul> | ||||
<ul spacing="compact"> | ||||
<li>Parameter name: issued_token_type</li> | ||||
<li>Parameter usage location: token response</li> | ||||
<li>Change controller: IESG</li> | ||||
<li>Specification document(s): <xref target="SuccessfulResponse" forma | ||||
t="default"/> of RFC 8693</li> | ||||
</ul> | ||||
</section> | </section> | |||
<section anchor="TokenTypeReg" numbered="true" toc="default"> | ||||
<section anchor="ClaimsReg" title="JSON Web Token Claims Registration"> | <name>OAuth Access Token Type Registration</name> | |||
<t> | ||||
<t> | IANA has registered the following access token type | |||
This specification registers the following Claims | in the "OAuth Access Token Types" subregistry of the "OAuth | |||
in the IANA "JSON Web Token Claims" registry | Parameters" registry | |||
<xref target="IANA.JWT.Claims"/> | <xref target="IANA.OAuth.Parameters" format="default"/>. The "OAuth Acc | |||
established by <xref target="JWT"/>. | ess Token | |||
</t> | Types" subregistry was | |||
established by <xref target="RFC6749" format="default"/>. | ||||
<section anchor='ClaimsContents' title='Registry Contents'> | </t> | |||
<ul spacing="compact"> | ||||
<t> | <li>Type name: N_A</li> | |||
<?rfc subcompact="yes"?> | <li>Additional Token Endpoint Response Parameters: none</li> | |||
<list style='symbols'> | <li>HTTP Authentication Scheme(s): none</li> | |||
<t>Claim Name: <spanx style="verb">act</spanx></t> | <li>Change controller: IESG</li> | |||
<t>Claim Description: Actor</t> | <li>Specification document(s): <xref target="SuccessfulResponse" forma | |||
<t>Change Controller: IESG</t> | t="default"/> of RFC 8693</li> | |||
<t>Specification Document(s): <xref target="actor"/> of [[ this spe | </ul> | |||
cification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Claim Name: <spanx style="verb">scope</spanx></t> | ||||
<t>Claim Description: Scope Values</t> | ||||
<t>Change Controller: IESG</t> | ||||
<t>Specification Document(s): <xref target="scopes"/> of [[ this sp | ||||
ecification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Claim Name: <spanx style="verb">client_id</spanx></t> | ||||
<t>Claim Description: Client Identifier</t> | ||||
<t>Change Controller: IESG</t> | ||||
<t>Specification Document(s): <xref target="client_id"/> of [[ this spec | ||||
ification ]]</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t>Claim Name: <spanx style="verb">may_act</spanx></t> | ||||
<t>Claim Description: Authorized Actor - the party that is authorized to | ||||
become the actor</t> | ||||
<t>Change Controller: IESG</t> | ||||
<t>Specification Document(s): <xref target="may_act"/> of [[ this specif | ||||
ication ]]</t> | ||||
</list> | ||||
</t> | ||||
<?rfc subcompact="no"?> | ||||
</section> | ||||
</section> | </section> | |||
<section anchor="ClaimsReg" numbered="true" toc="default"> | ||||
<section anchor="IntrospectionReg" title="OAuth Token Introspection Respon | <name>JSON Web Token Claims Registration</name> | |||
se Registration"> | ||||
<t> | <t> | |||
This specification registers the following values | IANA has registered the following Claims | |||
in the IANA "OAuth Token Introspection Response" registry | in the "JSON Web Token Claims" subregistry of the "JSON Web Token | |||
<xref target="IANA.OAuth.Parameters"/> | (JWT)" registry | |||
established by <xref target="RFC7662"/>. | <xref target="IANA.JWT" format="default"/>. The "JSON Web Token Claims" | |||
subregistry was | ||||
established by <xref target="RFC7519" format="default"/>. | ||||
</t> | </t> | |||
<ul spacing="compact"> | ||||
<section anchor='IntrospectionContents' title='Registry Contents'> | <li>Claim Name: act</li> | |||
<li>Claim Description: Actor</li> | ||||
<t> | <li>Change Controller: IESG</li> | |||
<?rfc subcompact="yes"?> | <li>Specification Document(s): <xref target="actor" format="default"/> | |||
<list style='symbols'> | of RFC 8693</li> | |||
<t>Claim Name: <spanx style="verb">act</spanx></t> | </ul> | |||
<t>Claim Description: Actor</t> | <ul spacing="compact"> | |||
<t>Change Controller: IESG</t> | <li>Claim Name: scope</li> | |||
<t>Specification Document(s): <xref target="actor"/> of [[ this sp | <li>Claim Description: Scope Values</li> | |||
ecification ]]</t> | <li>Change Controller: IESG</li> | |||
</list> | <li>Specification Document(s): <xref target="scopes" format="default"/ | |||
</t> | > of RFC 8693</li> | |||
<t> | </ul> | |||
<list style='symbols'> | <ul spacing="compact"> | |||
<t>Claim Name: <spanx style="verb">may_act</spanx></t> | <li>Claim Name: client_id</li> | |||
<t>Claim Description: Authorized Actor - the party that is authori | <li>Claim Description: Client Identifier</li> | |||
zed to become the actor</t> | <li>Change Controller: IESG</li> | |||
<t>Change Controller: IESG</t> | <li>Specification Document(s): <xref target="client_id" format="defaul | |||
<t>Specification Document(s): <xref target="may_act"/> of [[ this | t"/> of RFC 8693</li> | |||
specification ]]</t> | </ul> | |||
</list> | <ul spacing="compact"> | |||
</t> | <li>Claim Name: may_act</li> | |||
<?rfc subcompact="no"?> | <li>Claim Description: Authorized Actor - the party that is authorized | |||
to become the actor</li> | ||||
</section> | <li>Change Controller: IESG</li> | |||
<li>Specification Document(s): <xref target="may_act" format="default" | ||||
/> of RFC 8693</li> | ||||
</ul> | ||||
</section> | </section> | |||
<section anchor="IntrospectionReg" numbered="true" toc="default"> | ||||
<section anchor="ErrorReg" title="OAuth Extensions Error Registration"> | <name>OAuth Token Introspection Response Registration</name> | |||
<t> | <t> | |||
This specification registers the following values | IANA has registered the following values | |||
in the IANA "OAuth Extensions Error" registry | in the "OAuth Token Introspection Response" registry of the "OAuth | |||
<xref target="IANA.OAuth.Parameters"/> | Parameters" registry | |||
established by <xref target="RFC6749"/>. | <xref target="IANA.OAuth.Parameters" format="default"/>. The "OAuth To | |||
ken | ||||
Introspection Response" registry was | ||||
established by <xref target="RFC7662" format="default"/>. | ||||
</t> | </t> | |||
<ul spacing="compact"> | ||||
<section anchor='ErrorContents' title='Registry Contents'> | <li>Name: act</li> | |||
<li>Description: Actor</li> | ||||
<t> | <li>Change Controller: IESG</li> | |||
<?rfc subcompact="yes"?> | <li>Specification Document(s): <xref target="actor" format="default"/> | |||
<list style='symbols'> | of RFC 8693</li> | |||
<t>Error Name: <spanx style="verb">invalid_target</spanx></t> | </ul> | |||
<t>Error Usage Location: token error response</t> | <ul spacing="compact"> | |||
<t>Related Protocol Extension: OAuth 2.0 Token Exchange</t> | <li>Name: may_act</li> | |||
<t>Change Controller: IETF</t> | <li>Description: Authorized Actor - the party that is authorized to be | |||
<t>Specification Document(s): <xref target="ErrorResponse"/> of [[ | come the actor</li> | |||
this specification ]]</t> | <li>Change Controller: IESG</li> | |||
</list> | <li>Specification Document(s): <xref target="may_act" format="default" | |||
</t> | /> of RFC 8693</li> | |||
<?rfc subcompact="no"?> | </ul> | |||
</section> | ||||
</section> | </section> | |||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.2119.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6749.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.3986.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8259.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7662.xml' ?> | ||||
<?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8174.xml"?> | ||||
<reference anchor='JWT' target='https://www.rfc-editor.org/info/rfc7519'> | <displayreference target="RFC7519" to="JWT"/> | |||
<front> | ||||
<title>JSON Web Token (JWT)</title> | ||||
<author initials='M.' surname='Jones' fullname='M. Jones'><organization /></auth | ||||
or> | ||||
<author initials='J.' surname='Bradley' fullname='J. Bradley'><organization /></ | ||||
author> | ||||
<author initials='N.' surname='Sakimura' fullname='N. Sakimura'><organization /> | ||||
</author> | ||||
<date year='2015' month='May' /> | ||||
<abstract><t>JSON Web Token (JWT) is a compact, URL-safe means of representing c | ||||
laims 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) structu | ||||
re or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the cl | ||||
aims to be digitally signed or integrity protected with a Message Authentication | ||||
Code (MAC) and/or encrypted.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7519'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7519'/> | ||||
</reference> | ||||
<!-- [rfced] [IANA.JWT.Claims] This URL is correct --> | ||||
<reference anchor="IANA.JWT.Claims" target="http://www.iana.org/assignment | ||||
s/jwt"> | ||||
<front> | ||||
<title>JSON Web Token Claims</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
<!-- [rfced] [IANA.OAuth.Parameters] This URL is correct --> | ||||
<reference anchor="IANA.OAuth.Parameters" target="http://www.iana.org/assi | ||||
gnments/oauth-parameters"> | ||||
<front> | ||||
<title>OAuth Parameters</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
<references title="Informative References"> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6755.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6750.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7521.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7523.xml' ?> | ||||
<?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6819.xml' ?> | ||||
<!-- <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I | ||||
-D.ietf-oauth-security-topics.xml'?>; I-D Exists --> | ||||
<reference anchor='OAUTH-SECURITY'> | ||||
<front> | ||||
<title>OAuth 2.0 Security Best Current Practice</title> | ||||
<author initials='T' surname='Lodderstedt' fullname='Torsten Lodderstedt'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='J' surname='Bradley' fullname='John Bradley'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='A' surname='Labunets' fullname='Andrey Labunets'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='D' surname='Fett' fullname='Daniel Fett'> | ||||
<organization /> | ||||
</author> | ||||
<date month='July' day='8' year='2019' /> | ||||
<abstract><t>This document describes best current security practice for OAuth 2. | ||||
0. It updates and extends the OAuth 2.0 Security Threat Model to incorporate pra | ||||
ctical experiences gathered since OAuth 2.0 was published and covers new threats | ||||
relevant due to the broader application of OAuth 2.0.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='Work in Progress,' value='draft-ietf-oauth-security-topics-13' | ||||
/> | ||||
</reference> | ||||
<!-- <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I | ||||
-D.ietf-oauth-resource-indicators.xml'?>; Waiting for Writeup --> | ||||
<reference anchor='OAUTH-RESOURCE'> | ||||
<front> | ||||
<title>Resource Indicators for OAuth 2.0</title> | ||||
<author initials='B' surname='Campbell' fullname='Brian Campbell'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='J' surname='Bradley' fullname='John Bradley'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='H' surname='Tschofenig' fullname='Hannes Tschofenig'> | ||||
<organization /> | ||||
</author> | ||||
<date month='July' day='24' year='2019' /> | <displayreference target="I-D.ietf-oauth-security-topics" to="OAUTH-SECURITY"/> | |||
<abstract><t>An extension to the OAuth 2.0 Authorization Framework defining requ est parameters that enable a client to explicitly signal to an authorization ser ver about the identity of the protected resource(s) to which it is requesting ac cess.</t></abstract> | <displayreference target="I-D.ietf-oauth-resource-indicators" to="OAUTH-RESOURCE "/> | |||
</front> | <references> | |||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2119.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6749.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.3986.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8259.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7662.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8174.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7519.xml"/> | ||||
<reference anchor="IANA.JWT" target="https://www.iana.org/assignments/jw | ||||
t"> | ||||
<front> | ||||
<title>JSON Web Token (JWT)</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="IANA.OAuth.Parameters" target="https://www.iana.org/a | ||||
ssignments/oauth-parameters"> | ||||
<front> | ||||
<title>OAuth Parameters</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6755.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6750.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7521.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7523.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6819.xml"/> | ||||
<seriesInfo name='Work in Progress,' value='draft-ietf-oauth-resource-indicators | <!-- I-D.ietf-oauth-security-topics; I-D Exists --> | |||
-05' /> | <xi:include | |||
</reference> | href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf-oauth-secur | |||
ity-topics.xml"/> | ||||
<!-- <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml2/reference.O | <!-- < I-D.ietf-oauth-resource-indicators; RFC-EDITOR state --> | |||
ASIS.saml-core-2.0-os.xml' ?>; inserted full entry from http://xml2rfc.tools.iet | <xi:include | |||
f.org/public/rfc/bibxml2/reference.OASIS.saml-core-2.0-os.xml --> | href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf-oauth-resou | |||
rce-indicators.xml"/> | ||||
<reference anchor="OASIS.saml-core-2.0-os"> | <reference anchor="OASIS.saml-core-2.0-os" target="http://docs.oasis-ope | |||
<front> | n.org/security/saml/v2.0/saml-core-2.0-os.pdf"> | |||
<title>Assertions and Protocol for the OASIS Security Assertion Markup L | <front> | |||
anguage (SAML) V2.0</title> | <title>Assertions and Protocol for the OASIS Security Assertion Mark | |||
<author fullname="Scott Cantor" initials="S." surname="Cantor"> | up Language (SAML) V2.0</title> | |||
<organization>Internet2</organization> | <seriesInfo name="OASIS Standard" value="saml-core-2.0-os"/> | |||
<address> | <author fullname="Scott Cantor" initials="S." surname="Cantor"> | |||
<organization>Internet2</organization> | ||||
<address> | ||||
<email>cantor.2@osu.edu</email> | <email>cantor.2@osu.edu</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="John Kemp" initials="J." surname="Kemp"> | <author fullname="John Kemp" initials="J." surname="Kemp"> | |||
<organization>Nokia</organization> | <organization>Nokia</organization> | |||
<address> | <address> | |||
<email>John.Kemp@nokia.com</email> | <email>John.Kemp@nokia.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Rob Philpott" initials="R." surname="Philpott"> | <author fullname="Rob Philpott" initials="R." surname="Philpott"> | |||
<organization>RSA Security</organization> | <organization>RSA Security</organization> | |||
<address> | <address> | |||
<email>rphilpott@rsasecurity.com</email> | <email>rphilpott@rsasecurity.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Eve Maler" initials="E." surname="Maler"> | <author fullname="Eve Maler" initials="E." surname="Maler"> | |||
<organization>Sun Microsystems</organization> | <organization>Sun Microsystems</organization> | |||
<address> | <address> | |||
<email>eve.maler@sun.com</email> | <email>eve.maler@sun.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2005" month="March"/> | <date year="2005" month="March"/> | |||
</front> | </front> | |||
<seriesInfo name="OASIS Standard" value="saml-core-2.0-os"/> | </reference> | |||
<format type="PDF" target="http://docs.oasis-open.org/security/saml/v2.0/sam | <reference anchor="OASIS.saml-core-1.1" target="https://www.oasis-open.o | |||
l-core-2.0-os.pdf"/> | rg/committees/download.php/3406/oasis-sstc-saml-core-1.1.pdf"> | |||
</reference> | <front> | |||
<title>Assertions and Protocol for the OASIS Security Assertion Mark | ||||
<!-- [rfced] [OASIS.saml-core-1.1] This URL is correct --> | up Language | |||
<reference anchor="OASIS.saml-core-1.1"> | ||||
<front> | ||||
<title>Assertions and Protocol for the OASIS Security Assertion Markup | ||||
Language | ||||
(SAML) V1.1</title> | (SAML) V1.1</title> | |||
<author fullname="Eve Maler" initials="E." surname="Maler"> | <seriesInfo name="OASIS Standard" value="oasis-sstc-saml-core-1.1"/> | |||
<organization>Sun Microsystems</organization> | <author fullname="Eve Maler" initials="E." surname="Maler"> | |||
<address> | <organization>Sun Microsystems</organization> | |||
<email>eve.maler@sun.com</email> | <address> | |||
</address> | <email>eve.maler@sun.com</email> | |||
</author> | </address> | |||
<author fullname="Prateek Mishra" initials="P." surname="Mishra"> | </author> | |||
<organization>Netegrity, Inc.</organization> | <author fullname="Prateek Mishra" initials="P." surname="Mishra"> | |||
<address> | <organization>Netegrity, Inc.</organization> | |||
<email>pmishra@netegrity.com</email> | <address> | |||
</address> | <email>pmishra@netegrity.com</email> | |||
</author> | </address> | |||
<author fullname="Rob Philpott" initials="R." surname="Philpott"> | </author> | |||
<organization>RSA Security</organization> | <author fullname="Rob Philpott" initials="R." surname="Philpott"> | |||
<address> | <organization>RSA Security</organization> | |||
<email>rphilpott@rsasecurity.com</email> | <address> | |||
</address> | <email>rphilpott@rsasecurity.com</email> | |||
</author> | </address> | |||
<date year="2003" month="September" day="2"/> | </author> | |||
</front> | <date year="2003" month="September"/> | |||
<seriesInfo name="OASIS Standard" value="oasis-sstc-saml-core-1.1"/> | </front> | |||
<format type="PDF" target="https://www.oasis-open.org/committees/download | </reference> | |||
.php/3406/oasis-sstc-saml-core-1.1.pdf"/> | <reference anchor="WS-Trust" target="https://docs.oasis-open.org/ws-sx/w | |||
</reference> | s-trust/v1.4/ws-trust.html"> | |||
<front> | ||||
<!-- [rfced] [WS-Trust] This URL is correct --> | <title>WS-Trust 1.4</title> | |||
<author fullname="Anthony Nadalin" initials="A." surname="Nadalin" r | ||||
<reference anchor="WS-Trust" target="http://docs.oasis-open.org/ws-sx/ws-t | ole="editor"/> | |||
rust/v1.4/ws-trust.html"> | <author fullname="Marc Goodner" initials="M." surname="Goodner" role | |||
<front> | ="editor"/> | |||
<title>WS-Trust 1.4</title> | <author fullname="Martin Gudgin" initials="M." surname="Gudgin" role | |||
<author fullname="Anthony Nadalin" initials="A." surname="Nadalin"/> | ="editor"/> | |||
<author fullname="Marc Goodner" initials="M." surname="Goodner"/> | <author fullname="Abbie Barbir" initials="A." surname="Barbir" role= | |||
<author fullname="Martin Gudgin" initials="M." surname="Gudgin"/> | "editor"/> | |||
<author fullname="Abbie Barbir" initials="A." surname="Barbir"/> | <author fullname="Hans Granqvist" initials="H." surname="Granqvist" | |||
<author fullname="Hans Granqvist" initials="H." surname="Granqvist"/> | role="editor"/> | |||
<date day="2" month="February" year="2012"/> | <date month="February" year="2012"/> | |||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="OpenID.Core" target="https://openid.net/specs/openid- | ||||
<!-- <?rfc include='http://openid.net/bibxml/reference.OpenID.Core.xml' ?>; inse | connect-core-1_0.html"> | |||
rted full entry from http://openid.net/bibxml/reference.OpenID.Core.xml --> | <front> | |||
<title abbrev="OpenID Connect Core 1.0">OpenID Connect Core 1.0</tit | ||||
<reference anchor="OpenID.Core" | le> | |||
target="http://openid.net/specs/openid-connect-core-1_0.html"> | <author fullname="Nat Sakimura" initials="N." surname="Sakimura"> | |||
<front> | <organization abbrev="NRI">Nomura Research Institute, Ltd.</organi | |||
<title abbrev="OpenID Connect Core 1.0">OpenID Connect Core 1.0</title> | zation> | |||
<address> | ||||
<author fullname="Nat Sakimura" initials="N." surname="Sakimura"> | <email>n-sakimura@nri.co.jp</email> | |||
<organization abbrev="NRI">Nomura Research Institute, Ltd.</organization> | <uri>https://nat.sakimura.org/</uri> | |||
<address> | </address> | |||
<email>n-sakimura@nri.co.jp</email> | </author> | |||
<uri>http://nat.sakimura.org/</uri> | <author fullname="John Bradley" initials="J." surname="Bradley"> | |||
</address> | <organization abbrev="Ping Identity">Ping Identity</organization> | |||
</author> | <address> | |||
<email>ve7jtb@ve7jtb.com</email> | ||||
<author fullname="John Bradley" initials="J." surname="Bradley"> | <uri>http://www.thread-safe.com/</uri> | |||
<organization abbrev="Ping Identity">Ping Identity</organization> | </address> | |||
<address> | </author> | |||
<email>ve7jtb@ve7jtb.com</email> | <author fullname="Michael B. Jones" initials="M." surname="Jones"> | |||
<uri>http://www.thread-safe.com/</uri> | <organization abbrev="Microsoft">Microsoft</organization> | |||
</address> | <address> | |||
</author> | <email>mbj@microsoft.com</email> | |||
<uri>https://self-issued.info/</uri> | ||||
<author fullname="Michael B. Jones" initials="M.B." surname="Jones"> | </address> | |||
<organization abbrev="Microsoft">Microsoft</organization> | </author> | |||
<address> | <author fullname="Breno de Medeiros" initials="B." surname="de Medei | |||
<email>mbj@microsoft.com</email> | ros"> | |||
<uri>http://self-issued.info/</uri> | <organization abbrev="Google">Google</organization> | |||
</address> | <address> | |||
</author> | <email>breno@google.com</email> | |||
<uri>https://stackoverflow.com/users/311376/breno</uri> | ||||
<author fullname="Breno de Medeiros" initials="B." surname="de Medeiros"> | </address> | |||
<organization abbrev="Google">Google</organization> | </author> | |||
<address> | <author fullname="Chuck Mortimore" initials="C." surname="Mortimore" | |||
<email>breno@google.com</email> | > | |||
<uri>http://stackoverflow.com/users/311376/breno</uri> | <organization abbrev="Visa">Visa</organization> | |||
</address> | <address> | |||
</author> | <email>chuck.mortimore@visa.com</email> | |||
<uri>https://twitter.com/cmort</uri> | ||||
<author fullname="Chuck Mortimore" initials="C." surname="Mortimore"> | </address> | |||
<organization abbrev="Salesforce">Salesforce</organization> | </author> | |||
<address> | <date month="November" year="2014"/> | |||
<email>cmortimore@salesforce.com</email> | <workgroup>OpenID Connect Working Group</workgroup> | |||
<uri>https://twitter.com/cmort</uri> | </front> | |||
</address> | </reference> | |||
</author> | </references> | |||
<date day="8" month="November" year="2014" /> | ||||
<workgroup>OpenID Connect Working Group</workgroup> | ||||
<abstract> | ||||
<t>OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 | ||||
protocol. It enables Clients to verify the identity of the End-User based | ||||
on the authentication performed by an Authorization Server, as well as to | ||||
obtain basic profile information about the End-User in an interoperable an | ||||
d | ||||
REST-like manner.</t> | ||||
<t> | ||||
This specification defines the core OpenID Connect functionality: | ||||
authentication built on top of OAuth 2.0 and | ||||
the use of Claims to communicate information about the End-User. | ||||
It also describes the security and privacy considerations for using OpenID | ||||
Connect. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
</reference> | ||||
</references> | </references> | |||
<section anchor="AdditionalExamples" numbered="true" toc="default"> | ||||
<section title="Additional Token Exchange Examples" anchor="AdditionalExamples | <name>Additional Token Exchange Examples</name> | |||
"> | <t> | |||
<t> | ||||
Two example token exchanges are provided in the following sections | Two example token exchanges are provided in the following sections | |||
illustrating impersonation and delegation, respectively | illustrating impersonation and delegation, respectively | |||
(with extra line breaks and indentation for display purposes only). | (with extra line breaks and indentation for display purposes only). | |||
</t> | </t> | |||
<section title="Impersonation Token Exchange Example" anchor="ImpersonationExa | <section anchor="ImpersonationExample" numbered="true" toc="default"> | |||
mple"> | <name>Impersonation Token Exchange Example</name> | |||
<section anchor="ImpersonationRequest" numbered="true" toc="default"> | ||||
<section anchor="ImpersonationRequest" title="Token Exchange Request"> | <name>Token Exchange Request</name> | |||
<t> | <t> | |||
In the following token exchange request, a client is requesting a token | In the following token exchange request, a client is requesting a token | |||
with impersonation semantics (with only a <spanx style="verb">subject_to | with impersonation semantics (delegation is impossible with only a <tt>s | |||
ken</spanx> | ubject_token</tt> | |||
and no <spanx style="verb">actor_token</spanx>, delegation is impossible | and no <tt>actor_token</tt>). | |||
). | ||||
The client tells the authorization server that it needs a token for use at | The client tells the authorization server that it needs a token for use at | |||
the target service with the logical name | the target service with the logical name | |||
<spanx style="verb">urn:example:cooperation-context</spanx>. | <tt>urn:example:cooperation-context</tt>. | |||
</t> | </t> | |||
<figure title="Token Exchange Request" anchor="ImpersonationRequestEx"> | <figure anchor="ImpersonationRequestEx"> | |||
<artwork><![CDATA[ | <name>Token Exchange Request</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
POST /as/token.oauth2 HTTP/1.1 | POST /as/token.oauth2 HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange | grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange | |||
&audience=urn%3Aexample%3Acooperation-context | &audience=urn%3Aexample%3Acooperation-context | |||
&subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc | &subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc | |||
zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI | zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI | |||
uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTA2MDAsIm5iZiI6MTQ0MTkwOTAwMCwic | uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTA2MDAsIm5iZiI6MTQ0MTkwOTAwMCwic | |||
3ViIjoiYmRjQGV4YW1wbGUubmV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN | 3ViIjoiYmRjQGV4YW1wbGUubmV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN | |||
0b3J5In0.PRBg-jXn4cJuj1gmYXFiGkZzRuzbXZ_sDxdE98ddW44ufsbWLKd3JJ1VZ | 0b3J5In0.PRBg-jXn4cJuj1gmYXFiGkZzRuzbXZ_sDxdE98ddW44ufsbWLKd3JJ1VZ | |||
hF64pbTtfjy4VXFVBDaQpKjn5JzAw | hF64pbTtfjy4VXFVBDaQpKjn5JzAw | |||
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt | &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<!-- JWT signing key for example.net | </section> | |||
{"kty":"EC","kid":"16","use":"sig","alg":"ES256", | <section anchor="ImpersonationSubjectClaims" numbered="true" toc="defaul | |||
"x":"N_MqlYd_Iq0rfzTqXAX7TUC0r7fQSp3YQKh42tn7uSc", | t"> | |||
"y":"9tGuwMFkHYWPqkLa51f8GazZNQqdgMOVvJEd6fJ18PI", | <name>Subject Token Claims</name> | |||
"crv":"P-256", | <t> | |||
"d":"cZ_4DqRSAWMMErQbKv6dCYqI9G1pi6lxvlvHU152Uts"} | The <tt>subject_token</tt> in the prior request is a JWT, and | |||
--> | ||||
</section> | ||||
<section anchor="ImpersonationSubjectClaims" title="Subject Token Claims"> | ||||
<t> | ||||
The <spanx style="verb">subject_token</spanx> in the prior request is a JWT an | ||||
d | ||||
the decoded JWT Claims Set is shown here. The JWT is | the decoded JWT Claims Set is shown here. The JWT is | |||
intended for consumption by the authorization server within a specific time wi ndow. | intended for consumption by the authorization server within a specific time wi ndow. | |||
The subject of the JWT (<spanx style="verb">bdc@example.net</spanx>) is | The subject of the JWT (<tt>bdc@example.net</tt>) is | |||
the party on behalf of whom the new token is being requested. | the party on behalf of whom the new token is being requested. | |||
</t> | </t> | |||
<figure title="Subject Token Claims" anchor="ImpersonationSubjectClaimsEx"> | <figure anchor="ImpersonationSubjectClaimsEx"> | |||
<artwork><![CDATA[ | <name>Subject Token Claims</name> | |||
<sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"aud":"https://as.example.com", | "aud":"https://as.example.com", | |||
"iss":"https://original-issuer.example.net", | "iss":"https://original-issuer.example.net", | |||
"exp":1441910600, | "exp":1441910600, | |||
"nbf":1441909000, | "nbf":1441909000, | |||
"sub":"bdc@example.net", | "sub":"bdc@example.net", | |||
"scope":"orders profile history" | "scope":"orders profile history" | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="ImpersonationResponse" numbered="true" toc="default"> | ||||
<section anchor="ImpersonationResponse" title="Token Exchange Response"> | <name>Token Exchange Response</name> | |||
<t> | <t> | |||
The <spanx style="verb">access_token</spanx> parameter of the token exchange | The <tt>access_token</tt> parameter of the token exchange | |||
response shown below contains the new token that the client requested. | response shown below contains the new token that the client requested. | |||
The other parameters of the response indicate that the token is a bearer acces s token | The other parameters of the response indicate that the token is a bearer acces s token | |||
that expires in an hour. | that expires in an hour. | |||
</t> | </t> | |||
<figure title="Token Exchange Response" anchor="ImpersonationResponseEx"> | <figure anchor="ImpersonationResponseEx"> | |||
<artwork><![CDATA[ | <name>Token Exchange Response</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Cache-Control: no-cache, no-store | Cache-Control: no-cache, no-store | |||
{ | { | |||
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4 | "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4 | |||
6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l | 6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l | |||
eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic3ViIjoiYmRjQGV4YW1wbGUub | eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic3ViIjoiYmRjQGV4YW1wbGUub | |||
mV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN0b3J5In0.rMdWpSGNACTvnF | mV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN0b3J5In0.rMdWpSGNACTvnF | |||
uOL74sYZ6MVuld2Z2WkGLmQeR9ztj6w2OXraQlkJmGjyiCq24kcB7AI2VqVxl3wSW | uOL74sYZ6MVuld2Z2WkGLmQeR9ztj6w2OXraQlkJmGjyiCq24kcB7AI2VqVxl3wSW | |||
nVKh85A", | nVKh85A", | |||
"issued_token_type": | "issued_token_type": | |||
"urn:ietf:params:oauth:token-type:access_token", | "urn:ietf:params:oauth:token-type:access_token", | |||
"token_type":"Bearer", | "token_type":"Bearer", | |||
"expires_in":3600 | "expires_in":3600 | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<!-- JWT signing key for example.com | </section> | |||
{"kty":"EC","kid":"72","use":"sig","alg":"ES256", | <section anchor="ImpersonationIssuedClaims" numbered="true" toc="default | |||
"x":"472aI8TvDdm2qfBRpXYw0uZ7feumuQOM-RPRkkTukSo", | "> | |||
"y":"VNNStdPhuxY6q7XfVIeYSW7xh_a4z5W2MCtNmQDcILc", | <name>Issued Token Claims</name> | |||
"crv":"P-256", | <t> | |||
"d":"dtJiut8QBJxACG6fcX8NYnzIsAN1muCJvaMiLSrOjIc"} | ||||
--> | ||||
</section> | ||||
<section anchor="ImpersonationIssuedClaims" title="Issued Token Claims"> | ||||
<t> | ||||
The decoded JWT Claims Set of the issued token is shown below. The new JWT is | The decoded JWT Claims Set of the issued token is shown below. The new JWT is | |||
issued by the authorization server and intended for consumption by a system en tity | issued by the authorization server and intended for consumption by a system en tity | |||
known by the logical name <spanx style="verb">urn:example:cooperation-context< /spanx> | known by the logical name <tt>urn:example:cooperation-context</tt> | |||
any time before its expiration. | any time before its expiration. | |||
The subject (<spanx style="verb">sub</spanx>) of the JWT | The subject (<tt>sub</tt>) of the JWT | |||
is the same as the subject the token used to make the request, | is the same as the subject the token used to make the request, | |||
which effectively enables the client to impersonate that subject | which effectively enables the client to impersonate that subject | |||
at the system entity known by the logical name of | at the system entity known by the logical name of | |||
<spanx style="verb">urn:example:cooperation-context</spanx> by using the token . | <tt>urn:example:cooperation-context</tt> by using the token. | |||
</t> | </t> | |||
<figure anchor="ImpersonationIssuedClaimsEx" title="Issued Token Claims"> | <figure anchor="ImpersonationIssuedClaimsEx"> | |||
<artwork><![CDATA[ | <name>Issued Token Claims</name> | |||
<sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"aud":"urn:example:cooperation-context", | "aud":"urn:example:cooperation-context", | |||
"iss":"https://as.example.com", | "iss":"https://as.example.com", | |||
"exp":1441913610, | "exp":1441913610, | |||
"sub":"bdc@example.net", | "sub":"bdc@example.net", | |||
"scope":"orders profile history" | "scope":"orders profile history" | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="DelegationExample" numbered="true" toc="default"> | |||
<name>Delegation Token Exchange Example</name> | ||||
<section title="Delegation Token Exchange Example" anchor="DelegationExample"> | <section anchor="DelegationRequest" numbered="true" toc="default"> | |||
<name>Token Exchange Request</name> | ||||
<section anchor="DelegationRequest" title="Token Exchange Request"> | <t> | |||
<t> | ||||
In the following token exchange request, a client is requesting a token | In the following token exchange request, a client is requesting a token | |||
and providing both a <spanx style="verb">subject_token</spanx> and an <s panx style="verb">actor_token</spanx>. | and providing both a <tt>subject_token</tt> and an <tt>actor_token</tt>. | |||
The client tells the authorization server that it needs a token for use at | The client tells the authorization server that it needs a token for use at | |||
the target service with the logical name | the target service with the logical name | |||
<spanx style="verb">urn:example:cooperation-context</spanx>. Policy at th e | <tt>urn:example:cooperation-context</tt>. Policy at the | |||
authorization server dictates that the issued token be a composite. | authorization server dictates that the issued token be a composite. | |||
</t> | </t> | |||
<figure anchor="DelegationRequestEx" title="Token Exchange Request"> | <figure anchor="DelegationRequestEx"> | |||
<artwork><![CDATA[ | <name>Token Exchange Request</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
POST /as/token.oauth2 HTTP/1.1 | POST /as/token.oauth2 HTTP/1.1 | |||
Host: as.example.com | Host: as.example.com | |||
Content-Type: application/x-www-form-urlencoded | Content-Type: application/x-www-form-urlencoded | |||
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange | grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange | |||
&audience=urn%3Aexample%3Acooperation-context | &audience=urn%3Aexample%3Acooperation-context | |||
&subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc | &subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc | |||
zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI | zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI | |||
uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInNjb3BlIjoic3RhdHVzIGZlZ | uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInNjb3BlIjoic3RhdHVzIGZlZ | |||
WQiLCJzdWIiOiJ1c2VyQGV4YW1wbGUubmV0IiwibWF5X2FjdCI6eyJzdWIiOiJhZG1 | WQiLCJzdWIiOiJ1c2VyQGV4YW1wbGUubmV0IiwibWF5X2FjdCI6eyJzdWIiOiJhZG1 | |||
pbkBleGFtcGxlLm5ldCJ9fQ.4rPRSWihQbpMIgAmAoqaJojAxj-p2X8_fAtAGTXrvM | pbkBleGFtcGxlLm5ldCJ9fQ.4rPRSWihQbpMIgAmAoqaJojAxj-p2X8_fAtAGTXrvM | |||
xU-eEZHnXqY0_AOZgLdxw5DyLzua8H_I10MCcckF-Q_g | xU-eEZHnXqY0_AOZgLdxw5DyLzua8H_I10MCcckF-Q_g | |||
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt | &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt | |||
&actor_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwczo | &actor_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwczo | |||
vL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXIuZ | vL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXIuZ | |||
XhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInN1YiI6ImFkbWluQGV4YW1wbGU | XhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInN1YiI6ImFkbWluQGV4YW1wbGU | |||
ubmV0In0.7YQ-3zPfhUvzje5oqw8COCvN5uP6NsKik9CVV6cAOf4QKgM-tKfiOwcgZ | ubmV0In0.7YQ-3zPfhUvzje5oqw8COCvN5uP6NsKik9CVV6cAOf4QKgM-tKfiOwcgZ | |||
oUuDL2tEs6tqPlcBlMjiSzEjm3yBg | oUuDL2tEs6tqPlcBlMjiSzEjm3yBg | |||
&actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt | &actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<!-- JWT signing key for example.net | </section> | |||
{"kty":"EC","kid":"16","use":"sig","alg":"ES256", | <section anchor="DelegationSubjectClaims" numbered="true" toc="default"> | |||
"x":"N_MqlYd_Iq0rfzTqXAX7TUC0r7fQSp3YQKh42tn7uSc", | <name>Subject Token Claims</name> | |||
"y":"9tGuwMFkHYWPqkLa51f8GazZNQqdgMOVvJEd6fJ18PI", | <t> | |||
"crv":"P-256", | The <tt>subject_token</tt> in the prior request is a JWT, and | |||
"d":"cZ_4DqRSAWMMErQbKv6dCYqI9G1pi6lxvlvHU152Uts"} | ||||
--> | ||||
</section> | ||||
<section anchor="DelegationSubjectClaims" title="Subject Token Claims"> | ||||
<t> | ||||
The <spanx style="verb">subject_token</spanx> in the prior request is a | ||||
JWT and | ||||
the decoded JWT Claims Set is shown here. The JWT is | the decoded JWT Claims Set is shown here. The JWT is | |||
intended for consumption by the authorization server | intended for consumption by the authorization server | |||
before a specific expiration time. | before a specific expiration time. | |||
The subject of the JWT | The subject of the JWT | |||
(<spanx style="verb">user@example.net</spanx>) is | (<tt>user@example.net</tt>) is | |||
the party on behalf of whom the new token is being requested. | the party on behalf of whom the new token is being requested. | |||
</t> | </t> | |||
<figure anchor="DelegationSubjectClaimsEx" title="Subject Token Claims"> | <figure anchor="DelegationSubjectClaimsEx"> | |||
<artwork><![CDATA[ | <name>Subject Token Claims</name> | |||
<sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"aud":"https://as.example.com", | "aud":"https://as.example.com", | |||
"iss":"https://original-issuer.example.net", | "iss":"https://original-issuer.example.net", | |||
"exp":1441910060, | "exp":1441910060, | |||
"scope":"status feed", | "scope":"status feed", | |||
"sub":"user@example.net", | "sub":"user@example.net", | |||
"may_act": | "may_act": | |||
{ | { | |||
"sub":"admin@example.net" | "sub":"admin@example.net" | |||
} | } | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="DelegationActorClaims" numbered="true" toc="default"> | ||||
<section anchor="DelegationActorClaims" title="Actor Token Claims"> | <name>Actor Token Claims</name> | |||
<t> | <t> | |||
The <spanx style="verb">actor_token</spanx> in the prior request is a JW | The <tt>actor_token</tt> in the prior request is a JWT, and | |||
T and | ||||
the decoded JWT Claims Set is shown here. This JWT is also | the decoded JWT Claims Set is shown here. This JWT is also | |||
intended for consumption by the authorization server | intended for consumption by the authorization server | |||
before a specific expiration time. | before a specific expiration time. | |||
The subject of the JWT | The subject of the JWT | |||
(<spanx style="verb">admin@example.net</spanx>) is | (<tt>admin@example.net</tt>) is | |||
the actor that will wield the security token being requested. | the actor that will wield the security token being requested. | |||
</t> | </t> | |||
<figure anchor="DelegationActorClaimsEx" title="Actor Token Claims"> | <figure anchor="DelegationActorClaimsEx"> | |||
<artwork><![CDATA[ | <name>Actor Token Claims</name> | |||
<sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"aud":"https://as.example.com", | "aud":"https://as.example.com", | |||
"iss":"https://original-issuer.example.net", | "iss":"https://original-issuer.example.net", | |||
"exp":1441910060, | "exp":1441910060, | |||
"sub":"admin@example.net" | "sub":"admin@example.net" | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="DelegationResponse" numbered="true" toc="default"> | ||||
<section anchor="DelegationResponse" title="Token Exchange Response"> | <name>Token Exchange Response</name> | |||
<t> | <t> | |||
The <spanx style="verb">access_token</spanx> parameter of the token exch | The <tt>access_token</tt> parameter of the token exchange | |||
ange | ||||
response shown below contains the new token that the client requested. | response shown below contains the new token that the client requested. | |||
The other parameters of the response indicate that the token is a JWT | The other parameters of the response indicate that the token is a JWT | |||
that expires in an hour and that the access token type is not applicable | that expires in an hour and that the access token type is not applicable | |||
since the issued token is not an access token. | since the issued token is not an access token. | |||
</t> | </t> | |||
<figure anchor="DelegationResponseEx" title="Token Exchange Response"> | <figure anchor="DelegationResponseEx"> | |||
<artwork><![CDATA[ | <name>Token Exchange Response</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Cache-Control: no-cache, no-store | Cache-Control: no-cache, no-store | |||
{ | { | |||
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4 | "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4 | |||
6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l | 6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l | |||
eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic2NvcGUiOiJzdGF0dXMgZmVlZ | eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic2NvcGUiOiJzdGF0dXMgZmVlZ | |||
CIsInN1YiI6InVzZXJAZXhhbXBsZS5uZXQiLCJhY3QiOnsic3ViIjoiYWRtaW5AZX | CIsInN1YiI6InVzZXJAZXhhbXBsZS5uZXQiLCJhY3QiOnsic3ViIjoiYWRtaW5AZX | |||
hhbXBsZS5uZXQifX0.3paKl9UySKYB5ng6_cUtQ2qlO8Rc_y7Mea7IwEXTcYbNdwG | hhbXBsZS5uZXQifX0.3paKl9UySKYB5ng6_cUtQ2qlO8Rc_y7Mea7IwEXTcYbNdwG | |||
9-G1EKCFe5fW3H0hwX-MSZ49Wpcb1SiAZaOQBtw", | 9-G1EKCFe5fW3H0hwX-MSZ49Wpcb1SiAZaOQBtw", | |||
"issued_token_type":"urn:ietf:params:oauth:token-type:jwt", | "issued_token_type":"urn:ietf:params:oauth:token-type:jwt", | |||
"token_type":"N_A", | "token_type":"N_A", | |||
"expires_in":3600 | "expires_in":3600 | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<!-- JWT signing key for example.com | </section> | |||
{"kty":"EC","kid":"72","use":"sig","alg":"ES256", | <section anchor="DelegationIssuedClaims" numbered="true" toc="default"> | |||
"x":"472aI8TvDdm2qfBRpXYw0uZ7feumuQOM-RPRkkTukSo", | <name>Issued Token Claims</name> | |||
"y":"VNNStdPhuxY6q7XfVIeYSW7xh_a4z5W2MCtNmQDcILc", | <t> | |||
"crv":"P-256", | ||||
"d":"dtJiut8QBJxACG6fcX8NYnzIsAN1muCJvaMiLSrOjIc"} | ||||
--> | ||||
</section> | ||||
<section anchor="DelegationIssuedClaims" title="Issued Token Claims"> | ||||
<t> | ||||
The decoded JWT Claims Set of the issued token is shown below. The new J WT is | The decoded JWT Claims Set of the issued token is shown below. The new J WT is | |||
issued by the authorization server and intended for consumption by a sys tem entity | issued by the authorization server and intended for consumption by a sys tem entity | |||
known by the logical name | known by the logical name | |||
<spanx style="verb">urn:example:cooperation-context</spanx> | <tt>urn:example:cooperation-context</tt> | |||
any time before its expiration. | any time before its expiration. | |||
The subject (<spanx style="verb">sub</spanx>) | The subject (<tt>sub</tt>) | |||
of the JWT | of the JWT | |||
is the same as the subject of | is the same as the subject of | |||
the <spanx style="verb">subject_token</spanx> used to make the request. | the <tt>subject_token</tt> used to make the request. | |||
The actor (<spanx style="verb">act</spanx>) of the JWT is the same as the subj | The actor (<tt>act</tt>) of the JWT is the same as the subject | |||
ect | of the <tt>actor_token</tt> used to make the request. | |||
of the <spanx style="verb">actor_token</spanx> used to make the request. | ||||
This indicates delegation and identifies | This indicates delegation and identifies | |||
<spanx style="verb">admin@example.net</spanx> as the current actor to who | <tt>admin@example.net</tt> as the current actor to whom authority | |||
m authority | has been delegated to act on behalf of <tt>user@example.net</tt>. | |||
has been delegated to act on behalf of <spanx style="verb">user@example. | </t> | |||
net</spanx>. | <figure anchor="DelegationIssuedClaimsEx"> | |||
</t> | <name>Issued Token Claims</name> | |||
<figure anchor="DelegationIssuedClaimsEx" title="Issued Token Claims"> | <sourcecode type="json"><![CDATA[ | |||
<artwork><![CDATA[ | ||||
{ | { | |||
"aud":"urn:example:cooperation-context", | "aud":"urn:example:cooperation-context", | |||
"iss":"https://as.example.com", | "iss":"https://as.example.com", | |||
"exp":1441913610, | "exp":1441913610, | |||
"scope":"status feed", | "scope":"status feed", | |||
"sub":"user@example.net", | "sub":"user@example.net", | |||
"act": | "act": | |||
{ | { | |||
"sub":"admin@example.net" | "sub":"admin@example.net" | |||
} | } | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | ||||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="Acknowledgements" numbered="false" toc="default"> | |||
<name>Acknowledgements</name> | ||||
</section> | ||||
<section anchor="Acknowledgements" title="Acknowledgements"> | ||||
<t> | <t> | |||
This specification was developed within the OAuth Working Group, which | This specification was developed within the OAuth Working Group, which | |||
includes dozens of active and dedicated participants. | includes dozens of active and dedicated participants. | |||
It was produced under the chairmanship of | It was produced under the chairmanship of | |||
Hannes Tschofenig, Derek Atkins, and Rifaat Shekh-Yusef | <contact fullname="Hannes Tschofenig"/>, <contact fullname="Derek | |||
with Kathleen Moriarty, Stephen Farrell, Eric Rescorla, Roman Danyliw, a | Atkins"/>, and <contact fullname="Rifaat Shekh-Yusef"/>, | |||
nd Benjamin Kaduk serving as | with <contact fullname="Kathleen Moriarty"/>, <contact fullname="Stephen | |||
Farrell"/>, <contact fullname="Eric Rescorla"/>, <contact fullname="Roman | ||||
Danyliw"/>, and <contact fullname="Benjamin Kaduk"/> serving as | ||||
Security Area Directors. | Security Area Directors. | |||
The following individuals contributed ideas, feedback, and wording | ||||
to this specification: | ||||
</t> | </t> | |||
<t> | <t> | |||
Caleb Baker, | The following individuals contributed ideas, feedback, and wording | |||
Vittorio Bertocci, | to this specification: | |||
Mike Brown, | <contact fullname="Caleb Baker"/>, | |||
Thomas Broyer, | <contact fullname="Vittorio Bertocci"/>, | |||
Roman Danyliw, | <contact fullname="Mike Brown"/>, | |||
William Denniss, | <contact fullname="Thomas Broyer"/>, | |||
Vladimir Dzhuvinov, | <contact fullname="Roman Danyliw"/>, | |||
Eric Fazendin, | <contact fullname="William Denniss"/>, | |||
Phil Hunt, | <contact fullname="Vladimir Dzhuvinov"/>, | |||
Benjamin Kaduk, | <contact fullname="Eric Fazendin"/>, | |||
Jason Keglovitz, | <contact fullname="Phil Hunt"/>, | |||
Torsten Lodderstedt, | <contact fullname="Benjamin Kaduk"/>, | |||
Barry Leiba, | <contact fullname="Jason Keglovitz"/>, | |||
Adam Lewis, | <contact fullname="Torsten Lodderstedt"/>, | |||
James Manger, | <contact fullname="Barry Leiba"/>, | |||
Nov Matake, | <contact fullname="Adam Lewis"/>, | |||
Matt Miller, | <contact fullname="James Manger"/>, | |||
Hilarie Orman, | <contact fullname="Nov Matake"/>, | |||
Matthew Perry, | <contact fullname="Matt Miller"/>, | |||
Eric Rescorla, | <contact fullname="Hilarie Orman"/>, | |||
Justin Richer, | <contact fullname="Matthew Perry"/>, | |||
Adam Roach, | <contact fullname="Eric Rescorla"/>, | |||
Rifaat Shekh-Yusef, | <contact fullname="Justin Richer"/>, | |||
Scott Tomilson, | <contact fullname="Adam Roach"/>, | |||
<contact fullname="Rifaat Shekh-Yusef"/>, | ||||
<contact fullname="Scott Tomilson"/>, | ||||
and | and | |||
Hannes Tschofenig. | <contact fullname="Hannes Tschofenig"/>. | |||
</t> | ||||
</section> | ||||
<section anchor="History" title="Document History"> | ||||
<?rfc subcompact="yes"?> | ||||
<t> | ||||
[[ to be removed by the RFC Editor before publication as an RFC ]] | ||||
</t> | ||||
<t> | ||||
-19 | ||||
<list style='symbols'> | ||||
<t>Fix-up changes introduced in -18.</t> | ||||
<t>Fix invalid JSON in the Nested Actor Claim example.</t> | ||||
<t>Reference figure numbers in text when introducing the examples in S | ||||
ection 2 and 4.</t> | ||||
<t>Editorial updates from additional IESG evaluation comments.</t> | ||||
<t>Add an informational reference to ietf-oauth-resource-indicators</t | ||||
> | ||||
<t>Update ietf-oauth-security-topics ref to 13</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-18 | ||||
<list style='symbols'> | ||||
<t>Editorial updates based on a few more IESG evaluation comments.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-17 | ||||
<list style='symbols'> | ||||
<t>Editorial improvements and example fixes resulting from IESG evalua | ||||
tion comments.</t> | ||||
<t>Added a pointer to RFC6749's Appendix B. on the | ||||
"Use of application/x-www-form-urlencoded Media Type" as a way of | ||||
providing a normative citation (by reference) for the media type.</t | ||||
> | ||||
<t>Strengthened some of the wording in the privacy considerations to b | ||||
ring it inline | ||||
with RFC 7519 Sec. 12 and RFC 6749 Sec. 10.8.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-16 | ||||
<list style='symbols'> | ||||
<t>Fixed typo and added an AD to Acknowledgements.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-15 | ||||
<list style='symbols'> | ||||
<t>Updated the nested actor claim example to (hopefully) be more strai | ||||
ghtforward.</t> | ||||
<t>Reworked Privacy Considerations to say to use TLS in transit, minim | ||||
ize the amount of | ||||
information in the token, and encrypt the token if disclosure of its | ||||
information to the | ||||
client is a concern per https://mailarchive.ietf.org/arch/msg/secdir | ||||
/KJhx4aq_U5uk3k6zpYP-CEHbpVM | ||||
</t> | ||||
<t>Moved the Security and Privacy Considerations sections to before th | ||||
e IANA Considerations.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-14 | ||||
<list style='symbols'> | ||||
<t>Added text in <xref target="actor"/> about the "act" claim stating that | ||||
only the top-level claims | ||||
and the current actor are to be considered in applying access control de | ||||
cisions.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-13 | ||||
<list style='symbols'> | ||||
<t>Updated the claim name and value syntax for scope to be consistent with | ||||
the treatment | ||||
of scope in RFC 7662 OAuth 2.0 Token Introspection.</t> | ||||
<t>Updated the client identifier claim name to be consistent with the trea | ||||
tment of client id | ||||
in RFC 7662 OAuth 2.0 Token Introspection.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-12 | ||||
<list style='symbols'> | ||||
<t>Updated to use the boilerplate from RFC 8174.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-11 | ||||
<list style='symbols'> | ||||
<t>Added new WG chair and AD to the Acknowledgements.</t> | ||||
<t>Applied clarifications suggested during AD review by EKR.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-10 | ||||
<list style='symbols'> | ||||
<t> | ||||
Defined token type URIs for base64url-encoded SAML 1.1 and SAML 2.0 a | ||||
ssertions. | ||||
</t> | ||||
<t> | ||||
Applied editorial fixes. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-09 | ||||
<list style='symbols'> | ||||
<t>Changed "security tokens obtained could be used in a number of contexts" | ||||
to | ||||
"security tokens obtained may be used in a number of contexts" per a WGLC | ||||
suggestion.</t> | ||||
<t>Clarified that the validity of the subject or actor token have no impact | ||||
on the validity | ||||
of the issued token after the exchange has occurred per a WGLC comment.</t | ||||
> | ||||
<t>Changed use of invalid_target error code to a SHOULD per a WGLC comment.< | ||||
/t> | ||||
<t>Clarified text about non-identity claims within the "act" claim being mea | ||||
ningless | ||||
per a WGLC comment.</t> | ||||
<t>Added brief Privacy Considerations section per WGLC comments.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-08 | ||||
<list style='symbols'> | ||||
<t>Use the bibxml reference for OpenID.Core rather than defining it inline.< | ||||
/t> | ||||
<t>Added editor role for Campbell.</t> | ||||
<t>Minor clarification of the text for actor_token.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-07 | ||||
<list style='symbols'> | ||||
<t>Fixed typo (desecration -> discretion).</t> | ||||
<t> | ||||
Added an explanation of the relationship between scope, audience and resourc | ||||
e in the request | ||||
and added an "invalid_target" error code enabling the AS to tell the client | ||||
that the requested audiences/resources were too broad. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-06 | ||||
<list style='symbols'> | ||||
<t>Drop "An STS for the REST of Us" from the title.</t> | ||||
<t>Drop "heavyweight" and "lightweight" from the abstract and introduction.</t | ||||
> | ||||
<t>Clarifications on the language around xxxxxx_token_type.</t> | ||||
<t>Remove the want_composite parameter.</t> | ||||
<t> | ||||
Add a short mention of proof-of-possession style tokens to the introduction | ||||
and remove the respective open issue. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-05 | ||||
<list style='symbols'> | ||||
<t> | ||||
Defined the JWT claim <spanx style="verb">cid</spanx> to express | ||||
the OAuth 2.0 client identifier of the client that requested the token. | ||||
</t> | ||||
<t> | ||||
Defined and requested registration for <spanx style="verb">act</spanx> and | ||||
<spanx style="verb">may_act</spanx> as Token introspection response paramete | ||||
rs | ||||
(in addition to being JWT claims). | ||||
</t> | ||||
<t> | ||||
Loosen up the language about refresh_token in the response to OPTIONAL from | ||||
NOT RECOMMENDED | ||||
based on feedback form real world deployment experience. | ||||
</t> | ||||
<t> | ||||
Add clarifying text about the distinction between JWT and access token URIs. | ||||
</t> | ||||
<t> | ||||
Close out (remove) some of the Open Issues bullets that have been resolved. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-04 | ||||
<list style='symbols'> | ||||
<t> | ||||
Clarified that the "resource" and "audience" request parameters can b | ||||
e used at the same | ||||
time (via http://www.ietf.org/mail-archive/web/oauth/current/msg15335 | ||||
.html). | ||||
</t> | ||||
<t> | ||||
Clarified subject/actor token validity after token exchange and expla | ||||
ined a | ||||
bit more about the recommendation to not issue refresh tokens | ||||
(via http://www.ietf.org/mail-archive/web/oauth/current/msg15318.html | ||||
). | ||||
</t> | ||||
<t> | ||||
Updated the examples appendix to use an issuer value that doesn't imply | ||||
that the client issued and signed the tokens and used "Bearer" and | ||||
"urn:ietf:params:oauth:token-type:access_token" in one of the responses | ||||
(via http://www.ietf.org/mail-archive/web/oauth/current/msg15335.html). | ||||
</t> | ||||
<t> | ||||
Defined and registered urn:ietf:params:oauth:token-type:id_token, | ||||
since some use cases perform token exchanges for ID Tokens | ||||
and no URI to indicate that a token is an ID Token had previously bee | ||||
n defined. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-03 | ||||
<list style='symbols'> | ||||
<t>Updated the document editors (adding Campbell, Bradley, and Mortimo | ||||
re).</t> | ||||
<t>Added to the title.</t> | ||||
<t>Added to the abstract and introduction.</t> | ||||
<t> | ||||
Updated the format of the request to use application/x-www-form-urle | ||||
ncoded | ||||
request parameters and the response to use the existing token endpoin | ||||
t | ||||
JSON parameters defined in OAuth 2.0. | ||||
</t> | ||||
<t>Changed the grant type identifier to urn:ietf:params:oauth:grant-ty | ||||
pe:token-exchange.</t> | ||||
<t> | ||||
Added RFC 6755 registration requests for | ||||
urn:ietf:params:oauth:token-type:refresh_token, | ||||
urn:ietf:params:oauth:token-type:access_token, and | ||||
urn:ietf:params:oauth:grant-type:token-exchange. | ||||
</t> | ||||
<t> | ||||
Added RFC 6749 registration requests for request/response parameters | ||||
. | ||||
</t> | ||||
<t> | ||||
Removed the Implementation Considerations and the requirement to supp | ||||
ort JWTs. | ||||
</t> | ||||
<t>Clarified many aspects of the text.</t> | ||||
<t> | ||||
Changed <spanx style="verb">on_behalf_of</spanx> to | ||||
<spanx style="verb">subject_token</spanx>, | ||||
<spanx style="verb">on_behalf_of_token_type</spanx> to | ||||
<spanx style="verb">subject_token_type</spanx>, | ||||
<spanx style="verb">act_as</spanx> to | ||||
<spanx style="verb">actor_token</spanx>, and | ||||
<spanx style="verb">act_as_token_type</spanx> to | ||||
<spanx style="verb">actor_token_type</spanx>. | ||||
</t> | ||||
<t> | ||||
Added an <spanx style="verb">audience</spanx> request parameter used | ||||
to | ||||
indicate the logical names of the target services at which the client | ||||
intends to use the requested security token. | ||||
</t> | ||||
<t> | ||||
Added a <spanx style="verb">want_composite</spanx> request parameter used | ||||
to | ||||
indicate the desire for a composite token rather than trying to infer it f | ||||
rom the | ||||
presence/absence of token(s) in the request. | ||||
</t> | ||||
<t> | ||||
Added a <spanx style="verb">resource</spanx> request parameter used | ||||
to | ||||
indicate the URLs of resources at which the client | ||||
intends to use the requested security token. | ||||
</t> | ||||
<t> | ||||
Specified that multiple <spanx style="verb">audience</spanx> and | ||||
<spanx style="verb">resource</spanx> request parameter values may be | ||||
used. | ||||
</t> | ||||
<t> | ||||
Defined the JWT claim <spanx style="verb">act</spanx> (actor) to express | ||||
the current actor or delegation principal. | ||||
</t> | ||||
<t> | ||||
Defined the JWT claim <spanx style="verb">may_act</spanx> to express | ||||
that one party is authorized to act on behalf of another party. | ||||
</t> | ||||
<t> | ||||
Defined the JWT claim <spanx style="verb">scp</spanx> (scopes) to exp | ||||
ress | ||||
OAuth 2.0 scope-token values. | ||||
</t> | ||||
<t> | ||||
Added the <spanx style="verb">N_A</spanx> (not applicable) | ||||
OAuth Access Token Type definition for use in contexts in which | ||||
the token exchange syntax requires a <spanx style="verb">token_type</ | ||||
spanx> | ||||
value, but in which the token being issued is not an access token. | ||||
</t> | ||||
<t>Added examples.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-02 | ||||
<list style='symbols'> | ||||
<t> | ||||
Enabled use of Security Token types other than JWTs for | ||||
<spanx style="verb">act_as</spanx> and | ||||
<spanx style="verb">on_behalf_of</spanx> request values. | ||||
</t> | ||||
<t> | ||||
Referenced the JWT and OAuth Assertions RFCs. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-01 | ||||
<list style='symbols'> | ||||
<t> | ||||
Updated references. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
-00 | ||||
<list style='symbols'> | ||||
<t> | ||||
Created initial working group draft from draft-jones-oauth-token-exc | ||||
hange-01. | ||||
</t> | ||||
</list> | ||||
</t> | </t> | |||
<?rfc subcompact="no"?> | ||||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
<!-- code used to create the JWTs in examples | ||||
public class TokenExExamplesTest | ||||
{ | ||||
@Test | ||||
public void go() throws Exception | ||||
{ | ||||
main(null); | ||||
} | ||||
public static void main(String[] args) throws Exception | ||||
{ | ||||
AlgorithmFactoryFactory.getInstance(); // init to get the logging out of | ||||
the way | ||||
System.out.println("\nmain-example"); | ||||
System.out.println(" main :::::"); | ||||
PublicJsonWebKey mainExKey = PublicJsonWebKey.Factory.newPublicJwk("{\"k | ||||
ty\":\"EC\",\"kid\":\"9er\",\"use\":\"sig\",\"alg\":\"ES256\",\"x\":\"5yoR9FjZHn | ||||
7kJDALhDzhZ8i8F06mc12YswUMTBv4BoA\",\"y\":\"4uxuIItWj5Duzspth5mUbpLXWrPFzFPQkOCe | ||||
AGGI6KM\",\"crv\":\"P-256\",\"d\":\"LncS7zrx6c8X5qZRxoSN18ZEYDeI2wfKfUvX_DgwRH8\ | ||||
"}"); | ||||
System.out.println(mainExKey.toJson(JsonWebKey.OutputControlLevel.INCLUD | ||||
E_PRIVATE)); | ||||
NumericDate iat = NumericDate.fromSeconds(1441917533); | ||||
System.out.println(iat); | ||||
NumericDate exp = NumericDate.fromSeconds(iat.getValue()); | ||||
exp.addSeconds(60); | ||||
JwtClaims claims = new JwtClaims(); | ||||
claims.setAudience("https://backend.example.com"); | ||||
final String asDotComUri = "https://as.example.com"; | ||||
claims.setIssuer(asDotComUri); | ||||
claims.setExpirationTime(exp); | ||||
claims.setIssuedAt(iat); | ||||
claims.setSubject("bdc@example.com"); | ||||
claims.setClaim("scope", "api"); | ||||
JsonWebSignature jws = new JsonWebSignature(); | ||||
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_ | ||||
AND_SHA256); | ||||
jws.setKeyIdHeaderValue(mainExKey.getKeyId()); | ||||
jws.setKey(mainExKey.getPrivateKey()); | ||||
jws.setPayload(claims.toJson()); | ||||
System.out.println(jws.getCompactSerialization()); | ||||
System.out.println("\n\n\n\nimpersonation-example"); | ||||
System.out.println("\n subject :::::"); | ||||
PublicJsonWebKey dotNetKey = PublicJsonWebKey.Factory.newPublicJwk("{\"k | ||||
ty\":\"EC\",\"kid\":\"16\",\"use\":\"sig\",\"alg\":\"ES256\",\"x\":\"N_MqlYd_Iq0 | ||||
rfzTqXAX7TUC0r7fQSp3YQKh42tn7uSc\",\"y\":\"9tGuwMFkHYWPqkLa51f8GazZNQqdgMOVvJEd6 | ||||
fJ18PI\",\"crv\":\"P-256\",\"d\":\"cZ_4DqRSAWMMErQbKv6dCYqI9G1pi6lxvlvHU152Uts\" | ||||
}"); | ||||
System.out.println(dotNetKey.toJson(JsonWebKey.OutputControlLevel.INCLUD | ||||
E_PRIVATE)); | ||||
iat = NumericDate.fromSeconds(1441910000); | ||||
System.out.println(iat); | ||||
exp = NumericDate.fromSeconds(iat.getValue()); | ||||
exp.addSeconds(600); | ||||
NumericDate nbf = NumericDate.fromSeconds(iat.getValue()); | ||||
nbf.addSeconds(-1000); | ||||
claims = new JwtClaims(); | ||||
claims.setAudience(asDotComUri); | ||||
String originalIssuerDotNetUri = "https://original-issuer.example.net"; | ||||
claims.setIssuer(originalIssuerDotNetUri); | ||||
claims.setExpirationTime(exp); | ||||
claims.setNotBefore(nbf); | ||||
claims.setSubject("bdc@example.net"); | ||||
claims.setStringClaim("scope", "orders profile history"); | ||||
jws = new JsonWebSignature(); | ||||
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_ | ||||
AND_SHA256); | ||||
jws.setKeyIdHeaderValue(dotNetKey.getKeyId()); | ||||
jws.setKey(dotNetKey.getPrivateKey()); | ||||
String payload = claims.toJson(); | ||||
jws.setPayload(payload); | ||||
System.out.println("sub token: " + jws.getCompactSerialization()); | ||||
System.out.println("sub token claims: " + payload); | ||||
System.out.println("\n issued :::::"); | ||||
PublicJsonWebKey dotComKey = PublicJsonWebKey.Factory.newPublicJwk("{\"k | ||||
ty\":\"EC\",\"kid\":\"72\",\"use\":\"sig\",\"alg\":\"ES256\",\"x\":\"472aI8TvDdm | ||||
2qfBRpXYw0uZ7feumuQOM-RPRkkTukSo\",\"y\":\"VNNStdPhuxY6q7XfVIeYSW7xh_a4z5W2MCtNm | ||||
QDcILc\",\"crv\":\"P-256\",\"d\":\"dtJiut8QBJxACG6fcX8NYnzIsAN1muCJvaMiLSrOjIc\" | ||||
}"); | ||||
System.out.println(dotComKey.toJson(JsonWebKey.OutputControlLevel.INCLUD | ||||
E_PRIVATE)); | ||||
iat = NumericDate.fromSeconds(1441910010); | ||||
System.out.println(iat); | ||||
exp = NumericDate.fromSeconds(iat.getValue()); | ||||
exp.addSeconds(3600); | ||||
claims = new JwtClaims(); | ||||
claims.setAudience("urn:example:cooperation-context"); | ||||
claims.setIssuer(asDotComUri); | ||||
claims.setExpirationTime(exp); | ||||
claims.setSubject("bdc@example.net"); | ||||
claims.setStringClaim("scope", "orders profile history"); | ||||
jws = new JsonWebSignature(); | ||||
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_ | ||||
AND_SHA256); | ||||
jws.setKeyIdHeaderValue(dotComKey.getKeyId()); | ||||
jws.setKey(dotComKey.getPrivateKey()); | ||||
payload = claims.toJson(); | ||||
jws.setPayload(payload); | ||||
System.out.println("issued token: " + jws.getCompactSerialization()); | ||||
System.out.println("issued token claims: " + payload); | ||||
System.out.println("\n\n\ndelegation-example"); | ||||
System.out.println("\n :::::"); | ||||
iat = NumericDate.fromSeconds(1441910000); | ||||
System.out.println(iat); | ||||
exp = NumericDate.fromSeconds(iat.getValue()); | ||||
exp.addSeconds(60); | ||||
String admin = "admin@example.net"; | ||||
claims = new JwtClaims(); | ||||
claims.setAudience(asDotComUri); | ||||
claims.setIssuer(originalIssuerDotNetUri); | ||||
claims.setExpirationTime(exp); | ||||
claims.setStringClaim("scope", "status feed"); | ||||
String sub = "user@example.net"; | ||||
claims.setSubject(sub); | ||||
JwtClaims mayAct = new JwtClaims(); | ||||
mayAct.setSubject(admin); | ||||
claims.setClaim("may_act", mayAct.getClaimsMap()); | ||||
jws = new JsonWebSignature(); | ||||
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_ | ||||
AND_SHA256); | ||||
jws.setKeyIdHeaderValue(dotNetKey.getKeyId()); | ||||
jws.setKey(dotNetKey.getPrivateKey()); | ||||
payload = claims.toJson(); | ||||
jws.setPayload(payload); | ||||
System.out.println("sub token: " + jws.getCompactSerialization()); | ||||
System.out.println("sub token claims: " + payload); | ||||
claims = new JwtClaims(); | ||||
claims.setAudience(asDotComUri); | ||||
claims.setIssuer(originalIssuerDotNetUri); | ||||
claims.setExpirationTime(exp); | ||||
claims.setSubject(admin); | ||||
jws = new JsonWebSignature(); | ||||
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_ | ||||
AND_SHA256); | ||||
jws.setKeyIdHeaderValue(dotNetKey.getKeyId()); | ||||
jws.setKey(dotNetKey.getPrivateKey()); | ||||
payload = claims.toJson(); | ||||
jws.setPayload(payload); | ||||
System.out.println("actor token: " + jws.getCompactSerialization()); | ||||
System.out.println("actor token claims: " + payload); | ||||
iat = NumericDate.fromSeconds(1441910010); | ||||
System.out.println(iat); | ||||
exp = NumericDate.fromSeconds(iat.getValue()); | ||||
exp.addSeconds(3600); | ||||
claims = new JwtClaims(); | ||||
claims.setAudience("urn:example:cooperation-context"); | ||||
claims.setIssuer(asDotComUri); | ||||
claims.setExpirationTime(exp); | ||||
claims.setStringClaim("scope", "status feed"); | ||||
claims.setSubject(sub); | ||||
JwtClaims actor = new JwtClaims(); | ||||
actor.setSubject(admin); | ||||
claims.setClaim("act", actor.getClaimsMap()); | ||||
jws = new JsonWebSignature(); | ||||
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_ | ||||
AND_SHA256); | ||||
jws.setKeyIdHeaderValue(dotComKey.getKeyId()); | ||||
jws.setKey(dotComKey.getPrivateKey()); | ||||
payload = claims.toJson(); | ||||
jws.setPayload(payload); | ||||
System.out.println("issued token: " + jws.getCompactSerialization()); | ||||
System.out.println("issued token claims: " + payload); | ||||
} | ||||
} | ||||
End of changes. 214 change blocks. | ||||
1797 lines changed or deleted | 1141 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |