draft-ietf-ace-oauth-authz-01.txt | draft-ietf-ace-oauth-authz-02.txt | |||
---|---|---|---|---|
ACE Working Group L. Seitz | ACE Working Group L. Seitz | |||
Internet-Draft SICS | Internet-Draft SICS | |||
Intended status: Standards Track G. Selander | Intended status: Standards Track G. Selander | |||
Expires: August 28, 2016 Ericsson | Expires: December 12, 2016 Ericsson | |||
E. Wahlstroem | E. Wahlstroem | |||
S. Erdtman | ||||
Nexus Technology | Nexus Technology | |||
S. Erdtman | ||||
Spotify AB | ||||
H. Tschofenig | H. Tschofenig | |||
ARM Ltd. | ARM Ltd. | |||
February 25, 2016 | June 10, 2016 | |||
Authorization for the Internet of Things using OAuth 2.0 | Authentication and Authorization for Constrained Environments (ACE) | |||
draft-ietf-ace-oauth-authz-01 | draft-ietf-ace-oauth-authz-02 | |||
Abstract | Abstract | |||
This memo defines how to use OAuth 2.0 as an authorization framework | This specification defines the ACE framework for authentication and | |||
with Internet of Things (IoT) deployments, thus bringing a well-known | authorization in Internet of Things (IoT) deployments. The ACE | |||
and widely used security solution to IoT devices. Where possible | framework is based on a set of building blocks including OAuth 2.0 | |||
vanilla OAuth 2.0 is used, but where the limitations of IoT devices | and CoAP, thus making a well-known and widely used authorization | |||
require it, profiles and extensions are provided. | solution suitable for IoT devices. Existing specifications are used | |||
where possible, but where the limitations of IoT devices require it, | ||||
profiles and extensions are provided. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on August 28, 2016. | This Internet-Draft will expire on December 12, 2016. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2016 IETF Trust and the persons identified as the | Copyright (c) 2016 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
3.1. OAuth 2.0 . . . . . . . . . . . . . . . . . . . . . . . . 5 | 3.1. OAuth 2.0 . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.2. CoAP . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 3.2. CoAP . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
3.3. Object Security . . . . . . . . . . . . . . . . . . . . . 8 | ||||
4. Protocol Interactions . . . . . . . . . . . . . . . . . . . . 9 | 4. Protocol Interactions . . . . . . . . . . . . . . . . . . . . 9 | |||
5. OAuth 2.0 Profiling . . . . . . . . . . . . . . . . . . . . . 12 | 5. Framework . . . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
5.1. Client Information . . . . . . . . . . . . . . . . . . . 12 | 6. The 'Token' Resource . . . . . . . . . . . . . . . . . . . . 14 | |||
5.2. CoAP Access-Token Option . . . . . . . . . . . . . . . . 15 | 6.1. Client-to-AS Request . . . . . . . . . . . . . . . . . . 14 | |||
5.3. Authorization Information Resource at the Resource Server 15 | 6.2. AS-to-Client Response . . . . . . . . . . . . . . . . . . 17 | |||
5.3.1. Authorization Information Request . . . . . . . . . . 16 | 6.3. Error Response . . . . . . . . . . . . . . . . . . . . . 18 | |||
5.3.2. Authorization Information Response . . . . . . . . . 16 | 6.4. New Request and Response Parameters . . . . . . . . . . . 18 | |||
5.3.2.1. Success Response . . . . . . . . . . . . . . . . 16 | 6.4.1. Grant Type . . . . . . . . . . . . . . . . . . . . . 19 | |||
5.3.2.2. Error Response . . . . . . . . . . . . . . . . . 16 | 6.4.2. Token Type and Algorithms . . . . . . . . . . . . . . 19 | |||
5.4. Authorization Information Format . . . . . . . . . . . . 17 | 6.4.3. Profile . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
5.5. CBOR Data Formats . . . . . . . . . . . . . . . . . . . . 17 | 6.4.4. Confirmation . . . . . . . . . . . . . . . . . . . . 20 | |||
5.6. Token Expiration . . . . . . . . . . . . . . . . . . . . 17 | 6.5. Mapping parameters to CBOR . . . . . . . . . . . . . . . 22 | |||
6. Deployment Scenarios . . . . . . . . . . . . . . . . . . . . 18 | 7. The 'Introspect' Resource . . . . . . . . . . . . . . . . . . 22 | |||
6.1. Client and Resource Server are Offline . . . . . . . . . 19 | 7.1. RS-to-AS Request . . . . . . . . . . . . . . . . . . . . 23 | |||
6.2. Resource Server Offline . . . . . . . . . . . . . . . . . 22 | 7.2. AS-to-RS Response . . . . . . . . . . . . . . . . . . . . 23 | |||
6.3. Token Introspection with an Offline Client . . . . . . . 26 | 7.3. Error Response . . . . . . . . . . . . . . . . . . . . . 24 | |||
6.4. Always-On Connectivity . . . . . . . . . . . . . . . . . 30 | 7.4. Client Token . . . . . . . . . . . . . . . . . . . . . . 25 | |||
6.5. Token-less Authorization . . . . . . . . . . . . . . . . 31 | 7.5. Mapping Introspection parameters to CBOR . . . . . . . . 26 | |||
6.6. Securing Group Communication . . . . . . . . . . . . . . 34 | 8. The Access Token . . . . . . . . . . . . . . . . . . . . . . 27 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 35 | 8.1. The 'Authorization Information' Resource . . . . . . . . 27 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35 | 8.2. Token Expiration . . . . . . . . . . . . . . . . . . . . 28 | |||
8.1. CoAP Option Number Registration . . . . . . . . . . . . . 35 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 28 | |||
9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 36 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29 | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 10.1. OAuth Introspection Response Parameter Registration . . 29 | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . 36 | 10.2. OAuth Parameter Registration . . . . . . . . . . . . . . 30 | |||
10.2. Informative References . . . . . . . . . . . . . . . . . 38 | 10.3. OAuth Access Token Types . . . . . . . . . . . . . . . . 30 | |||
10.4. Token Type Mappings . . . . . . . . . . . . . . . . . . 30 | ||||
10.4.1. Registration Template . . . . . . . . . . . . . . . 30 | ||||
10.4.2. Initial Registry Contents . . . . . . . . . . . . . 31 | ||||
10.5. JSON Web Token Claims . . . . . . . . . . . . . . . . . 31 | ||||
10.6. ACE Profile Registry . . . . . . . . . . . . . . . . . . 31 | ||||
10.6.1. Registration Template . . . . . . . . . . . . . . . 31 | ||||
10.7. OAuth Parameter Mappings Registry . . . . . . . . . . . 32 | ||||
10.7.1. Registration Template . . . . . . . . . . . . . . . 32 | ||||
10.7.2. Initial Registry Contents . . . . . . . . . . . . . 32 | ||||
10.8. Introspection Resource CBOR Mappings Registry . . . . . 34 | ||||
10.8.1. Registration Template . . . . . . . . . . . . . . . 35 | ||||
10.8.2. Initial Registry Contents . . . . . . . . . . . . . 35 | ||||
10.9. CoAP Option Number Registration . . . . . . . . . . . . 37 | ||||
11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 37 | ||||
12. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 | ||||
12.1. Normative References . . . . . . . . . . . . . . . . . . 38 | ||||
12.2. Informative References . . . . . . . . . . . . . . . . . 38 | ||||
Appendix A. Design Justification . . . . . . . . . . . . . . . . 40 | Appendix A. Design Justification . . . . . . . . . . . . . . . . 40 | |||
Appendix B. Roles and Responsibilites -- a Checklist . . . 41 | Appendix B. Roles and Responsibilites . . . . . . . . . . . . . 42 | |||
Appendix C. Optimizations . . . . . . . . . . . . . . . . . . . 44 | Appendix C. Deployment Examples . . . . . . . . . . . . . . . . 44 | |||
Appendix D. CoAP and CBOR profiles for OAuth 2.0 . . . . . . . . 45 | C.1. Local Token Validation . . . . . . . . . . . . . . . . . 44 | |||
D.1. Profile for Token resource . . . . . . . . . . . . . . . 45 | C.2. Introspection Aided Token Validation . . . . . . . . . . 48 | |||
D.1.1. Token Request . . . . . . . . . . . . . . . . . . . . 46 | Appendix D. Document Updates . . . . . . . . . . . . . . . . . . 51 | |||
D.1.2. Token Response . . . . . . . . . . . . . . . . . . . 47 | D.1. Version -01 to -02 . . . . . . . . . . . . . . . . . . . 52 | |||
D.2. Version -00 to -01 . . . . . . . . . . . . . . . . . . . 52 | ||||
D.2. CoAP Profile for OAuth Introspection . . . . . . . . . . 48 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 53 | |||
D.2.1. Introspection Request . . . . . . . . . . . . . . . . 48 | ||||
D.2.2. Introspection Response . . . . . . . . . . . . . . . 49 | ||||
Appendix E. Document Updates . . . . . . . . . . . . . . . . . . 51 | ||||
E.1. Version -00 to -01 . . . . . . . . . . . . . . . . . . . 51 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 52 | ||||
1. Introduction | 1. Introduction | |||
Authorization is the process for granting approval to an entity to | Authorization is the process for granting approval to an entity to | |||
access a resource [RFC4949]. Managing authorization information for | access a resource [RFC4949]. The authorization task itself can best | |||
a large number of devices and users is often a complex task where | be described as granting access to a requesting client, for a | |||
dedicated servers are used. | resource hosted on a device, the resource server (RS). This exchange | |||
is mediated by one or multiple authorization servers (AS). Managing | ||||
authorization for a large number of devices and users is a complex | ||||
task. | ||||
Managing authorization of users, services and their devices with the | We envision that end consumers and enterprises will manage access to | |||
help of dedicated authorization servers (AS) is a common task, found | resources on, or produced by, Internet of Things (IoT) devices in the | |||
in enterprise networks as well as on the Web. In its simplest form | same style as they do today with data, services and applications on | |||
the authorization task can be described as granting access to a | the Web or with their mobile devices. This desire will increase with | |||
requesting client, for a resource hosted on a device, the resource | the number of exposed services and capabilities provided by | |||
server (RS). This exchange is mediated by one or multiple | applications hosted on the IoT devices. | |||
authorization servers. | ||||
We envision that end consumers and enterprises will want to manage | While prior work on authorization solutions for the Web and for the | |||
access-control and authorization for their Internet of Things (IoT) | mobile environment also applies to the IoT environment many IoT | |||
devices in the same style and this desire will increase with the | devices are constrained, for example in terms of processing | |||
number of exposed services and capabilities provided by applications | capabilities, available memory, etc. For web applications on | |||
hosted on the IoT devices. The IoT devices may be constrained in | constrained nodes this specification makes use of CoAP [RFC7252]. | |||
various ways including processing, memory, code-size, energy, etc., | ||||
as defined in [RFC7228], and the different IoT deployments present a | ||||
continuous range of device and network capabilities. Taking energy | ||||
consumption as an example: At one end there are energy-harvesting or | ||||
battery powered devices which have a tight power budget, on the other | ||||
end there are devices connected to a continuous power supply which | ||||
are not constrained in terms of power, and all levels in between. | ||||
Thus IoT devices are very different in terms of available processing | ||||
and message exchange capabilities. | ||||
This memo describes how to re-use OAuth 2.0 [RFC6749] to extend | A detailed treatment of constraints can be found in [RFC7228], and | |||
authorization to Internet of Things devices with different kinds of | the different IoT deployments present a continuous range of device | |||
constraints. At the time of writing, OAuth 2.0 is already used with | and network capabilities. Taking energy consumption as an example: | |||
certain types of IoT devices and this document will provide | ||||
implementers additional guidance for using it in a secure and | At one end there are energy-harvesting or battery powered devices | |||
privacy-friendly way. Where possible the basic OAuth 2.0 mechanisms | which have a tight power budget, on the other end there are mains- | |||
are used; in some circumstances profiles are defined, for example to | powered devices, and all levels in between. | |||
support smaller the over-the-wire message size and smaller code size. | ||||
Hence, IoT devices may be very different in terms of available | ||||
processing and message exchange capabilities and there is a need to | ||||
support many different authorization use cases [RFC7744]. | ||||
This specification describes a framework for authentication and | ||||
authorization in constrained environments (ACE) built on re-use of | ||||
OAuth 2.0 [RFC6749], thereby extending authorization to Internet of | ||||
Things devices. This specification contains the necessary building | ||||
blocks for adjusting OAuth 2.0 to IoT environments. | ||||
More detailed, interoperable specifications can be found in profiles. | ||||
Implementations may claim conformance with a specific profile, | ||||
whereby implementations utilizing the same profile interoperate while | ||||
implementations of different profiles are not expected to be | ||||
interoperable. Some devices, such as mobile phones and tablets, may | ||||
implement multiple profiles and will therefore be able to interact | ||||
with a wider range of low end devices. | ||||
2. Terminology | 2. Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
Certain security-related terms such as "authentication", | Certain security-related terms such as "authentication", | |||
"authorization", "confidentiality", "(data) integrity", "message | "authorization", "confidentiality", "(data) integrity", "message | |||
authentication code", and "verify" are taken from [RFC4949]. | authentication code", and "verify" are taken from [RFC4949]. | |||
Since we describe exchanges as RESTful protocol interactions HTTP | Since we describe exchanges as RESTful protocol interactions HTTP | |||
[RFC7231] offers useful terminology. | [RFC7231] offers useful terminology. | |||
Terminology for entities in the architecture is defined in OAuth 2.0 | Terminology for entities in the architecture is defined in OAuth 2.0 | |||
[RFC6749] and [I-D.ietf-ace-actors], such as client (C), resource | [RFC6749] and [I-D.ietf-ace-actors], such as client (C), resource | |||
server (RS), and authorization server (AS). OAuth 2.0 uses the term | server (RS), and authorization server (AS). | |||
"endpoint" to denote HTTP resources such as /token and /authorize at | ||||
the AS, but we will use the term "resource" in this memo to avoid | ||||
confusion with the CoAP [RFC7252] term "endpoint". | ||||
Since this draft focuses on the problem of access control to | Note that the term "endpoint" is used here following its OAuth | |||
definition, which is to denote resources such as /token and | ||||
/introspect at the AS and /authz-info at the RS. The CoAP [RFC7252] | ||||
definition, which is "An entity participating in the CoAP protocol" | ||||
is not used in this memo. | ||||
Since this specification focuses on the problem of access control to | ||||
resources, we simplify the actors by assuming that the client | resources, we simplify the actors by assuming that the client | |||
authorization server (CAS) functionality is not stand-alone but | authorization server (CAS) functionality is not stand-alone but | |||
subsumed by either the authorization server or the client (see | subsumed by either the authorization server or the client (see | |||
section 2.2 in [I-D.ietf-ace-actors]). | section 2.2 in [I-D.ietf-ace-actors]). | |||
3. Overview | 3. Overview | |||
This specification describes a framework for authorization in the | This specification describes the ACE framework for authorization in | |||
Internet of Things consisting of a set of building blocks. | the Internet of Things consisting of a set of building blocks. | |||
The basic block is the OAuth 2.0 [RFC6749] framework, which enjoys | The basic block is the OAuth 2.0 [RFC6749] framework, which enjoys | |||
widespread deployment. Many IoT devices can support OAuth 2.0 | widespread deployment. Many IoT devices can support OAuth 2.0 | |||
without any additional extensions, but for certain constrained | without any additional extensions, but for certain constrained | |||
settings additional profiling is needed. | settings additional profiling is needed. | |||
Another building block is the lightweight web transfer protocol CoAP | Another building block is the lightweight web transfer protocol CoAP | |||
[RFC7252] for those communication environments where HTTP is not | [RFC7252] for those communication environments where HTTP is not | |||
appropriate. CoAP typically runs on top of UDP which further reduces | appropriate. CoAP typically runs on top of UDP which further reduces | |||
overhead and message exchanges. Transport layer security can be | overhead and message exchanges. While this specification defines | |||
provided either by DTLS 1.2 [RFC6347] or TLS 1.2 [RFC5246]. | extensions for the use of OAuth over CoAP, we do envision further | |||
underlying protocols to be supported in the future, such as MQTT or | ||||
QUIC. | ||||
A third building block is CBOR [RFC7049] for encodings where JSON | A third building block is CBOR [RFC7049] for encodings where JSON | |||
[RFC7159] is not sufficiently compact. CBOR is a binary encoding | [RFC7159] is not sufficiently compact. CBOR is a binary encoding | |||
designed for extremely small code size and fairly small message size. | designed for small code and message size, which may be used for | |||
OAuth 2.0 allows access tokens to use different encodings and this | encoding of self contained tokens, and also for encoding CoAP POST | |||
document defines such an alternative encoding. The COSE message | parameters and CoAP responses. | |||
format [I-D.ietf-cose-msg] is also based on CBOR. | ||||
A fourth building block is application layer security, which is used | A fourth building block is the compact CBOR-based secure message | |||
where transport layer security is insufficient. At the time of | format COSE [I-D.ietf-cose-msg], which enables application layer | |||
writing the preferred approach for securing CoAP at the application | security as an alternative or complement to transport layer security | |||
layer is via the use of COSE [I-D.ietf-cose-msg], which adds object | (DTLS [RFC6347] or TLS [RFC5246]). COSE is used to secure self | |||
security to CBOR-encoded data. More details about applying COSE to | contained tokens such as proof-of-possession (PoP) tokens | |||
CoAP can be found in OSCOAP [I-D.selander-ace-object-security]. | [I-D.ietf-oauth-pop-architecture], which is an extension to the OAuth | |||
access tokens, and "client tokens" which are defined in this | ||||
framework (see Section 7.4). The default access token format is | ||||
defined in CBOR web token (CWT) [I-D.ietf-ace-cbor-web-token]. | ||||
Application layer security for CoAP using COSE can be provided with | ||||
OSCOAP [I-D.selander-ace-object-security]. | ||||
With the building blocks listed above, solutions satisfying various | With the building blocks listed above, solutions satisfying various | |||
IoT device and network constraints are possible. A list of | IoT device and network constraints are possible. A list of | |||
constraints is described in detail in RFC 7228 [RFC7228] and a | constraints is described in detail in RFC 7228 [RFC7228] and a | |||
description of how the building blocks mentioned above relate to the | description of how the building blocks mentioned above relate to the | |||
various constraints can be found in Appendix A. | various constraints can be found in Appendix A. | |||
Luckily, not every IoT device suffers from all constraints. The | Luckily, not every IoT device suffers from all constraints. The ACE | |||
described framework nevertheless takes all these aspects into account | framework nevertheless takes all these aspects into account and | |||
and allows several different deployment variants to co-exist rather | allows several different deployment variants to co-exist rather than | |||
than mandating a one-size-fits-all solution. We believe this is | mandating a one-size-fits-all solution. We believe this is important | |||
important to cover the wide range of possible interworking use cases | to cover the wide range of possible interworking use cases and the | |||
and the different requirements from a security point of view. Once | different requirements from a security point of view. Once IoT | |||
IoT deployments mature, popular deployment variants will be | deployments mature, popular deployment variants will be documented in | |||
documented in form of profiles. | form of ACE profiles. | |||
In the subsections below we provide further details about the | In the subsections below we provide further details about the | |||
different building blocks. | different building blocks. | |||
3.1. OAuth 2.0 | 3.1. OAuth 2.0 | |||
The OAuth 2.0 authorization framework enables a client to obtain | The OAuth 2.0 authorization framework enables a client to obtain | |||
limited access to a resource with the permission of a resource owner. | limited access to a resource with the permission of a resource owner. | |||
Authorization related information is passed between the nodes using | Authorization information, or references to it, is passed between the | |||
access tokens. These access tokens are issued to clients by an | nodes using access tokens. These access tokens are issued to clients | |||
authorization server with the approval of the resource owner. The | by an authorization server with the approval of the resource owner. | |||
client uses the access token to access the protected resources hosted | The client uses the access token to access the protected resources | |||
by the resource server. | hosted by the resource server. | |||
A number of OAuth 2.0 terms are used within this memo: | A number of OAuth 2.0 terms are used within this specification: | |||
The token and introspect Endpoints: | ||||
The AS hosts the /token endpoint that allows a client to request | ||||
access tokens. The client makes a POST request to the /token | ||||
endpoint on the AS and receives the access token in the response | ||||
(if the request was successful). | ||||
The token introspection endpoint, /introspect, is used by the RS | ||||
when requesting additional information regarding a received access | ||||
token. The RS makes a POST request to /introspect on the AS and | ||||
receives information about the access token contain in the | ||||
response. (See "Introspection" below.) | ||||
Access Tokens: | Access Tokens: | |||
Access tokens are credentials used to access protected resources. | Access tokens are credentials needed to access protected | |||
An access token is a data structure representing authorization | resources. An access token is a data structure representing | |||
permissions issued to the client. Access tokens are generated by | authorization permissions issued by the AS to the client. Access | |||
the authorization server and consumed by the resource server. The | tokens are generated by the authorization server and consumed by | |||
access token is opaque to the client. | the resource server. The access token content is opaque to the | |||
client. | ||||
Access tokens can have different formats, and various methods of | Access tokens can have different formats, and various methods of | |||
utilization (e.g., cryptographic properties) based on the security | utilization (e.g., cryptographic properties) based on the security | |||
requirements of the given deployment. | requirements of the given deployment. | |||
Proof of Possession Tokens: | Proof of Possession Tokens: | |||
An access token may be bound to a cryptographic key, which is then | An access token may be bound to a cryptographic key, which is then | |||
used by an RS to authenticate requests from a client. Such tokens | used by an RS to authenticate requests from a client. Such tokens | |||
are called proof-of-possession tokens (or PoP tokens) | are called proof-of-possession tokens (or PoP tokens) | |||
[I-D.ietf-oauth-pop-architecture]. | [I-D.ietf-oauth-pop-architecture]. | |||
The proof-of-possession (PoP) security concept assumes that the AS | The proof-of-possession (PoP) security concept assumes that the AS | |||
acts as a trusted third party that binds keys to access tokens. | acts as a trusted third party that binds keys to access tokens. | |||
These so called PoP keys are then used by the client to | These so called PoP keys are then used by the client to | |||
demonstrate the possession of the secret to the RS when accessing | demonstrate the possession of the secret to the RS when accessing | |||
the resource. The RS, when receiving an access token, needs to | the resource. The RS, when receiving an access token, needs to | |||
verify that the key used by the client matches the one included in | verify that the key used by the client matches the one included in | |||
the access token. When this memo uses the term "access token" it | the access token. When this specification uses the term "access | |||
is assumed to be a PoP token unless specifically stated otherwise. | token" it is assumed to be a PoP token unless specifically stated | |||
otherwise. | ||||
The key bound to the access token (aka PoP key) may be based on | The key bound to the access token (aka PoP key) may be based on | |||
symmetric as well as on asymmetric cryptography. The appropriate | symmetric as well as on asymmetric cryptography. The appropriate | |||
choice of security depends on the constraints of the IoT devices | choice of security depends on the constraints of the IoT devices | |||
as well as on the security requirements of the use case. | as well as on the security requirements of the use case. | |||
Symmetric PoP key: | Symmetric PoP key: The AS generates a random symmetric PoP key, | |||
encrypts it for the RS and includes it inside an access token. | ||||
The AS generates a random symmetric PoP key, encrypts it for | The PoP key is also encrypted for the client and sent together | |||
the RS and includes it inside an access token. The PoP key is | with the access token to the client.> | |||
also encrypted for the client and sent together with the access | ||||
token to the client. | ||||
Asymmetric PoP key: | ||||
An asymmetric key pair is generated on the client and the | Asymmetric PoP key: An asymmetric key pair is generated on the | |||
public key is sent to the AS (if it does not already have | client and the public key is sent to the AS (if it does not | |||
knowledge of the client's public key). Information about the | already have knowledge of the client's public key). | |||
public key, which is the PoP key in this case, is then included | Information about the public key, which is the PoP key in this | |||
inside the access token and sent back to the requesting client. | case, is then included inside the access token and sent back to | |||
The RS can identify the client's public key from the | the requesting client. The RS can identify the client's public | |||
information in the token, which allows the client to use the | key from the information in the token, which allows the client | |||
corresponding private key for the proof of possession. | to use the corresponding private key for the proof of | |||
possession. | ||||
The access token is protected against modifications using a MAC or | The access token is protected against modifications using a MAC or | |||
a digital signature of the AS. The choice of PoP key does not | a digital signature, which is added by the AS. The choice of PoP | |||
necessarily imply a specific credential type for the integrity | key does not necessarily imply a specific credential type for the | |||
protection of the token. More information about PoP tokens can be | integrity protection of the token. More information about PoP | |||
found in [I-D.ietf-oauth-pop-architecture]. | tokens can be found in [I-D.ietf-oauth-pop-architecture]. | |||
Scopes and Permissions: | Scopes and Permissions: | |||
In OAuth 2.0, the client specifies the type of permissions it is | In OAuth 2.0, the client specifies the type of permissions it is | |||
seeking to obtain (via the scope parameter) in the access request. | seeking to obtain (via the scope parameter) in the access request. | |||
In turn, the AS may use the "scope" response parameter to inform | In turn, the AS may use the scope response parameter to inform the | |||
the client of the scope of the access token issued. As the client | client of the scope of the access token issued. As the client | |||
could be a constrained device as well, this memo uses CBOR encoded | could be a constrained device as well, this specification uses | |||
messages defined in Appendix D to request scopes and to be | CBOR encoded messages for CoAP, defined in Section 5, to request | |||
informed what scopes the access token was actually authorized for | scopes and to be informed what scopes the access token was | |||
by the AS. | actually authorized for by the AS. | |||
The values of the scope parameter are expressed as a list of | The values of the scope parameter are expressed as a list of | |||
space- delimited, case-sensitive strings, with a semantic that is | space- delimited, case-sensitive strings, with a semantic that is | |||
well-known to the AS and the RS. More details about the concept | well-known to the AS and the RS. More details about the concept | |||
of scopes is found under Section 3.3 in [RFC6749]. | of scopes is found under Section 3.3 in [RFC6749]. | |||
Claims: | Claims: | |||
The information carried in the access token in the form of type- | Information carried in the access token, called claims, is in the | |||
value pairs is called claims. An access token may for example | form of type-value pairs. An access token may, for example, | |||
include a claim about the AS that issued the token (the "iss" | include a claim identifying the AS that issued the token (via the | |||
claim) and what audience the access token is intended for (the | "iss" claim) and what audience the access token is intended for | |||
"aud" claim). The audience of an access token can be a specific | (via the "aud" claim). The audience of an access token can be a | |||
resource or one or many resource servers. The resource owner | specific resource or one or many resource servers. The resource | |||
policies influence the what claims are put into the access token | owner policies influence what claims are put into the access token | |||
by the authorization server. | by the authorization server. | |||
While the structure and encoding of the access token varies | While the structure and encoding of the access token varies | |||
throughout deployments, a standardized format has been defined | throughout deployments, a standardized format has been defined | |||
with the JSON Web Token (JWT) [RFC7519] where claims are encoded | with the JSON Web Token (JWT) [RFC7519] where claims are encoded | |||
as a JSON object. In [I-D.wahlstroem-ace-cbor-web-token] an | as a JSON object. In [I-D.ietf-ace-cbor-web-token] an equivalent | |||
equivalent format using CBOR encoding (CWT) has been defined. | format using CBOR encoding (CWT) has been defined. | |||
Introspection: | Introspection: | |||
Introspection is a method for a resource server to query the | Introspection is a method for a resource server to query the | |||
authorization server for the active state and content of a | authorization server for the active state and content of a | |||
received access token. This is particularly useful in those cases | received access token. This is particularly useful in those cases | |||
where the authorization decisions are very dynamic and/or where | where the authorization decisions are very dynamic and/or where | |||
the received access token itself is a reference rather than a | the received access token itself is a reference rather than a | |||
self-contained token. More information about introspection in | self-contained token. More information about introspection in | |||
OAuth 2.0 can be found in [I-D.ietf-oauth-introspection]. | OAuth 2.0 can be found in [RFC7662]. | |||
3.2. CoAP | 3.2. CoAP | |||
CoAP is an application layer protocol similar to HTTP, but | CoAP is an application layer protocol similar to HTTP, but | |||
specifically designed for constrained environments. CoAP typically | specifically designed for constrained environments. CoAP typically | |||
uses datagram-oriented transport, such as UDP, where reordering and | uses datagram-oriented transport, such as UDP, where reordering and | |||
loss of packets can occur. A security solution need to take the | loss of packets can occur. A security solution need to take the | |||
latter aspects into account. | latter aspects into account. | |||
While HTTP uses headers and query-strings to convey additional | While HTTP uses headers and query-strings to convey additional | |||
information about a request, CoAP encodes such information in so- | information about a request, CoAP encodes such information in so- | |||
called 'options'. | called 'options'. | |||
CoAP supports application-layer fragmentation of the CoAP payloads | CoAP supports application-layer fragmentation of the CoAP payloads | |||
through blockwise transfers [I-D.ietf-core-block]. However, this | through blockwise transfers [I-D.ietf-core-block]. However, block- | |||
method does not allow the fragmentation of large CoAP options, | wise transfer does not increase the size limits of CoAP options, | |||
therefore data encoded in options has to be kept small. | therefore data encoded in options has to be kept small. | |||
3.3. Object Security | Transport layer security for CoAP can be provided by DTLS 1.2 | |||
[RFC6347] or TLS 1.2 [RFC5246]. CoAP defines a number of proxy | ||||
Transport layer security is not always sufficient and application | operations which requires transport layer security to be terminated | |||
layer security has to be provided. COSE [I-D.ietf-cose-msg] defines | at the proxy. One approach for protecting CoAP communication end-to- | |||
a message format for cryptographic protection of data using CBOR | end through proxies, and also to support security for CoAP over | |||
encoding. There are two main approaches for application layer | different transport in a uniform way, is to provide security on | |||
security: | application layer using an object-based security mechanism such as | |||
CBOR Encoded Message Syntax [I-D.ietf-cose-msg]. | ||||
Object Security of CoAP (OSCOAP) | ||||
OSCOAP [I-D.selander-ace-object-security] is a method for | ||||
protecting CoAP request/response message exchanges, including CoAP | ||||
payloads, CoAP header fields as well as CoAP options. OSCOAP | ||||
provides end-to-end confidentiality, integrity and replay | ||||
protection, and a secure binding between CoAP request and response | ||||
messages. | ||||
A CoAP message protected with OSCOAP contains the CoAP option | ||||
"Object-Security" which signals that the CoAP message carries a | ||||
COSE message ([I-D.ietf-cose-msg]). OSCOAP defines a profile of | ||||
COSE which includes replay protection. | ||||
Object Security of Content (OSCON) | ||||
For the case of wrapping of application layer payload data | ||||
("content") only, such as resource representations or claims of | ||||
access tokens, the same COSE profile can be applied to obtain end- | ||||
to-end confidentiality, integrity and replay protection. | ||||
[I-D.selander-ace-object-security] defines this functionality as | ||||
Object Security of Content (OSCON). | ||||
In this case, the message is not bound to the underlying | One application of COSE is OSCOAP [I-D.selander-ace-object-security], | |||
application layer protocol and can therefore be used with HTTP, | which provides end-to-end confidentiality, integrity and replay | |||
CoAP, Bluetooth Smart, etc. While OSCOAP integrity protects | protection, and a secure binding between CoAP request and response | |||
specific CoAP message meta-data like request/response code, and | messages. In OSCOAP, the CoAP messages are wrapped in COSE objects | |||
binds a response to a specific request, OSCON protects only | and sent using CoAP. | |||
payload/content, therefore those security features are lost. The | ||||
advantages are that an OSCON message can be passed across | ||||
different protocols, from request to response, and used to secure | ||||
group communications. | ||||
4. Protocol Interactions | 4. Protocol Interactions | |||
This framework is based on the same protocol interactions as OAuth | The ACE framework is based on the OAuth 2.0 protocol interactions | |||
2.0: A client obtains an access token from an AS and presents the | using the /token and /introspect endpoints. A client obtains an | |||
token to an RS to gain access to a protected resource. These | access token from an AS using the /token endpoint and subsequently | |||
interactions are shown in Figure 1. An overview of various OAuth | presents the access token to a RS to gain access to a protected | |||
concepts is provided in Section 3.1. | resource. The RS, after receiving an access token, may present it to | |||
the AS via the /introspect endpoint to get information about the | ||||
access token. In other deployments the RS may process the access | ||||
token locally without the need to contact an AS. These interactions | ||||
are shown in Figure 1. An overview of various OAuth concepts is | ||||
provided in Section 3.1. | ||||
The consent of the resource owner, for giving a client access to a | The consent of the resource owner, for giving a client access to a | |||
protected resource, can be pre-configured authorization policies or | protected resource, can be pre-configured authorization policies or | |||
dynamically at the time when the request is sent. The resource owner | dynamically at the time when the request is sent. The resource owner | |||
and the requesting party (= client owner) are not shown in Figure 1. | and the requesting party (i.e. client owner) are not shown in | |||
Figure 1. | ||||
For the description in this document we assume that the client has | This framework supports a wide variety of communication security | |||
been registered to an AS. Registration means that the two share | mechanisms between the ACE entities, such as client, AS, and RS. We | |||
credentials, configuration parameters and that some form of | assume that the client has been registered (also called enrolled or | |||
authorization has taken place. These credentials are used to protect | onboarded) to an AS using a mechanism defined outside the scope of | |||
the token request by the client and the transport of access tokens | this document. In practice, various techniques for onboarding have | |||
and client information from AS to the client. | been used, such as factory-based provisioning or the use of | |||
commissioning tools. Regardless of the onboarding technique, this | ||||
registration procedure implies that the client and the AS share | ||||
credentials, and configuration parameters. These credentials are | ||||
used to mutually authenticate each other and to protect messages | ||||
exchanged between the client and the AS. | ||||
It is also assumed that the RS has been registered with the AS. | It is also assumed that the RS has been registered with the AS, | |||
Established keying material between the AS and the RS allows the AS | potentially in a similar way as the client has been registered with | |||
to apply cryptographic protection to the access token to ensure that | the AS. Established keying material between the AS and the RS allows | |||
the content cannot be modified, and if needed, that the content is | the AS to apply cryptographic protection to the access token to | |||
confidentiality protected. | ensure that its content cannot be modified, and if needed, that the | |||
content is confidentiality protected. | ||||
The keying material necessary for establishing communication security | The keying material necessary for establishing communication security | |||
between C and RS is dynamically established as part of the protocol | between C and RS is dynamically established as part of the protocol | |||
described in this document. | described in this document. | |||
At the start of the protocol there is an optional discovery step | At the start of the protocol there is an optional discovery step | |||
where the client discovers the resource server and the resources this | where the client discovers the resource server and the resources this | |||
server hosts. In this step the client might also determine what | server hosts. In this step the client might also determine what | |||
permissions are needed to access the protected resource. The exact | permissions are needed to access the protected resource. The | |||
procedure depends on the protocols being used and the specific | detailed procedures for this discovery process may be defined in an | |||
deployment environment. In Bluetooth Smart, for example, | ACE profile and depend on the protocols being used and the specific | |||
advertisements are broadcasted by a peripheral, including information | deployment environment. | |||
about the supported services. In CoAP, as a second example, a client | ||||
can makes a request to "/.well-known/core" to obtain information | ||||
about available resources, which are returned in a standardized | ||||
format as described in [RFC6690]. | ||||
+--------+ +---------------+ | In Bluetooth Low Energy, for example, advertisements are broadcasted | |||
| |---(A)-- Token Request ------------->| | | by a peripheral, including information about the primary services. | |||
| | | Authorization | | In CoAP, as a second example, a client can makes a request to | |||
| |<--(B)-- Access Token ---------------| Server | | "/.well-known/core" to obtain information about available resources, | |||
| | + Client Information | | | which are returned in a standardized format as described in | |||
| | +---------------+ | [RFC6690]. | |||
| | ^ | | ||||
| | Introspection Request & Response (D)| |(E) | ||||
| Client | | v | ||||
| | +--------------+ | ||||
| |---(C)-- Token + Request ----------->| | | ||||
| | | Resource | | ||||
| |<--(F)-- Protected Resource ---------| Server | | ||||
| | | | | ||||
+--------+ +--------------+ | ||||
Figure 1: Overview of the basic protocol flow | +--------+ +---------------+ | |||
| |---(A)-- Token Request ------->| | | ||||
| | | Authorization | | ||||
| |<--(B)-- Access Token ---------| Server | | ||||
| | + Client Information | | | ||||
| | +---------------+ | ||||
| | ^ | | ||||
| | Introspection Request (D)| | | ||||
| Client | | | | ||||
| | Response + Client Token | |(E) | ||||
| | | v | ||||
| | +--------------+ | ||||
| |---(C)-- Token + Request ----->| | | ||||
| | | Resource | | ||||
| |<--(F)-- Protected Resource ---| Server | | ||||
| | | | | ||||
+--------+ +--------------+ | ||||
Figure 1: Basic Protocol Flow. | ||||
Requesting an Access Token (A): | Requesting an Access Token (A): | |||
The client makes an access token request to the AS. This memo | The client makes an access token request to the /token endpoint at | |||
assumes the use of PoP tokens (see Section 3.1 for a short | the AS. This framework assumes the use of PoP tokens (see | |||
description) wherein the AS binds a key to an access token. The | Section 3.1 for a short description) wherein the AS binds a key to | |||
client may include permissions it seeks to obtain, and information | an access token. The client may include permissions it seeks to | |||
about the type of credentials it wants to use (i.e., symmetric or | obtain, and information about the credentials it wants to use | |||
asymmetric cryptography). | (e.g., symmetric/asymmetric cryptography or a reference to a | |||
specific credential). | ||||
Access Token Response (B): | Access Token Response (B): | |||
If the AS successfully processes the request from the client, it | If the AS successfully processes the request from the client, it | |||
returns an access token. It also includes various parameters, | returns an access token. It also returns various parameters, | |||
which we call "Client Information". In addition to the response | referred as "Client Information". In addition to the response | |||
parameters defined by OAuth 2.0 and the PoP token extension, we | parameters defined by OAuth 2.0 and the PoP token extension, | |||
consider new kinds of response parameters in Section 5, including | further response parameters, such as information on which profile | |||
information on which security protocol the client should use with | the client should use with the resource server(s). More | |||
the resource server(s) that it has just been authorized to access. | information about these parameters can be found in in Section 6.4. | |||
Communication security between client and RS may be based on pre- | ||||
provisioned keys/security contexts or dynamically established. | ||||
The RS authenticates the client via the PoP token; and the client | ||||
authenticates the RS via the client information as described in | ||||
Section 5.1. | ||||
Resource Request (C): | Resource Request (C): | |||
The client interacts with the RS to request access to the | The client interacts with the RS to request access to the | |||
protected resource and provides the access token. The protocol to | protected resource and provides the access token. The protocol to | |||
use between the client and the RS is not restricted to CoAP; HTTP, | use between the client and the RS is not restricted to CoAP. | |||
HTTP/2, Bluetooth Smart etc., are also possible candidates. | HTTP, HTTP/2, QUIC, MQTT, Bluetooth Low Energy, etc., are also | |||
viable candidates. | ||||
Depending on the device limitations and the selected protocol this | Depending on the device limitations and the selected protocol this | |||
exchange may be split up into two phases: | exchange may be split up into two parts: | |||
(1) the client sends the access token to a newly defined | ||||
authorization endpoint at the RS (see Section 5.3) , which | ||||
conveys authorization information to the RS that may be used by | ||||
the client for subsequent resource requests, and | ||||
(1) the client sends the access token containing, or | ||||
referencing, the authorization information to the RS, that may | ||||
be used for subsequent resource requests by the client, and | ||||
(2) the client makes the resource access request, using the | (2) the client makes the resource access request, using the | |||
communication security protocol and other client information | communication security protocol and other client information | |||
obtained from the AS. | obtained from the AS. | |||
The RS verifies that the token is integrity protected by the AS | The Client and the RS mutually authenticate using the security | |||
and compares the claims contained in the access token with the | protocol specified in the profile (see step B) and the keys | |||
resource request. If the RS is online, validation can be handed | obtained in the access token or the client information or the | |||
over to the AS using token introspection (see messages D and E) | client token. The RS verifies that the token is integrity | |||
over HTTP or CoAP, in which case the different parts of step C may | protected by the AS and compares the claims contained in the | |||
be interleaved with introspection. | access token with the resource request. If the RS is online, | |||
validation can be handed over to the AS using token introspection | ||||
(see messages D and E) over HTTP or CoAP, in which case the | ||||
different parts of step C may be interleaved with introspection. | ||||
Token Introspection Request (D): | Token Introspection Request (D): | |||
A resource server may be configured to use token introspection to | A resource server may be configured to introspect the access token | |||
interact with the AS to obtain the most recent claims, such as | by including it in a request to the /introspect endpoint at that | |||
scope, audience, validity etc. associated with a specific access | AS. Token introspection over CoAP is defined in Section 7 and for | |||
token. Token introspection over CoAP is defined in | HTTP in [RFC7662]. | |||
[I-D.wahlstroem-ace-oauth-introspection] and for HTTP in | ||||
[I-D.ietf-oauth-introspection]. | ||||
Note that token introspection is an optional step and can be | Note that token introspection is an optional step and can be | |||
omitted if the token is self-contained and the resource server is | omitted if the token is self-contained and the resource server is | |||
prepared to perform the token validation on its own. | prepared to perform the token validation on its own. | |||
Token Introspection Response (E): | Token Introspection Response (E): | |||
The AS validates the token and returns the claims associated with | The AS validates the token and returns the most recent parameters, | |||
it back to the RS. The RS then uses the received claims to | such as scope, audience, validity etc. associated with it back to | |||
process the request to either accept or to deny it. | the RS. The RS then uses the received parameters to process the | |||
request to either accept or to deny it. The AS can additionally | ||||
return information that the RS needs to pass on to the client in | ||||
the form of a client token. The latter is used to establish keys | ||||
for mutual authentication between client and RS, when the client | ||||
has no direct connectivity to the AS. | ||||
Protected Resource (F): | Protected Resource (F): | |||
If the request from the client is authorized, the RS fulfills the | If the request from the client is authorized, the RS fulfills the | |||
request and returns a response with the appropriate response code. | request and returns a response with the appropriate response code. | |||
The RS uses the dynamically established keys to protect the | The RS uses the dynamically established keys to protect the | |||
response, according to used communication security protocol. | response, according to used communication security protocol. | |||
5. OAuth 2.0 Profiling | 5. Framework | |||
This section describes profiles of OAuth 2.0 adjusting it to | The following sections detail the profiling and extensions of OAuth | |||
constrained environments for use cases where this is necessary. | 2.0 for constrained environments which constitutes the ACE framework. | |||
Profiling for JSON Web Tokens (JWT) is provided in | ||||
[I-D.wahlstroem-ace-cbor-web-token]. | ||||
5.1. Client Information | Credential Provisioning | |||
OAuth 2.0 using bearer tokens, as described in [RFC6749] and in | For IoT we cannot generally assume that the client and RS are part | |||
[RFC6750], requires TLS for all communication interactions between | of a common key infrastructure, so the AS provisions credentials | |||
client, authorization server, and resource server. This is possible | or associated information to allow mutual authentication. These | |||
in the scope where OAuth 2.0 was originally developed: web and mobile | credentials need to be provided to the parties before or during | |||
applications. In these environments resources like computational | the authentication protocol is executed, and may be re-used for | |||
power and bandwidth are not scarce and operating systems as well as | subsequent token requests. | |||
browser platforms are pre-provisioned with trust anchors that enable | ||||
clients to authenticate servers based on the Web PKI. In a more | ||||
heterogeneous IoT environment a wider range of use cases needs to be | ||||
supported. Therefore, this document suggests extensions to OAuth 2.0 | ||||
that enables the AS to inform the client on how to communicate | ||||
securely with a RS and that allows the client to indicate | ||||
communication security preferences to the AS. | ||||
In the OAuth memo defining the key distribution for proof-of- | Proof-of-Possession | |||
possession (PoP) tokens [I-D.ietf-oauth-pop-key-distribution], the | ||||
authors suggest to use Uri-query parameters in order to submit the | ||||
parameters of the client's token request. To avoid large headers if | ||||
the client uses CoAP to communicate with the AS, this memo specifies | ||||
the following alternative for submitting client request parameters to | ||||
the AS: The client encodes the parameters of it's request as a CBOR | ||||
map and submits that map as the payload of the client request. The | ||||
Content-format MUST be application/cbor in that case. | ||||
The OAuth memo further specifies that the AS SHALL use a JSON | The ACE framework by default implements proof-of-possession for | |||
structure in the payload of the response to encode the response | access tokens, i.e. that the authenticated token holder is bound | |||
parameters. These parameters include the access token, destined for | to the token. The binding is provided by the "cnf" claim | |||
the RS and additional information for the client, such as e.g. the | indicating what key is used for mutual authentication. If clients | |||
PoP key. We call this information "client information". If the | need to update a token, e.g. to get additional rights, they can | |||
client is using CoAP to communicate with the AS the AS SHOULD use | request that the AS binds the new access token to the same | |||
CBOR instead of JSON for encoding it's response. The client can | credential as the previous token. | |||
explicitly request this encoding by using the CoAP Accept option. | ||||
If the channel between client and AS is not secure, the whole | ACE Profile Negotiation | |||
messages from client to AS and vice-versa MUST be wrapped in JWEs | ||||
[RFC7516] or COSE_Encrypted structures [I-D.ietf-cose-msg]. | ||||
The client may be a constrained device and could therefore be limited | The client or RS may be limited in the encodings or protocols it | |||
in the communication security protocols it supports. It can | supports. To support a variety of different deployment settings, | |||
therefore signal to the AS which protocols it can support for | specific interactions between client and RS are defined in an ACE | |||
securing their mutual communication. This is done by using the "csp" | profile. The ACE framework supports the negotiation of different | |||
parameter defined below in the Token Request message sent to the AS. | ACE profiles between client and AS using the "profile" parameter | |||
in the token request and token response. | ||||
Note that The OAuth key distribution specification | OAuth 2.0 requires the use of TLS both to protect the communication | |||
[I-D.ietf-oauth-pop-key-distribution] describes in section 6 how the | between AS and client when requesting an access token and between AS | |||
client can request specific types of keys (symmetric vs. asymmetric) | and RS for introspection. In constrained settings TLS is not always | |||
and proof-of-possession algorithms in the PoP token request. | feasible, or desirable. Nevertheless it is REQUIRED that the data | |||
exchanged with the AS is encrypted and integrity protected. It is | ||||
furthermore REQUIRED that the AS and the endpoint communicating with | ||||
it (client or RS) perform mutual authentication. | ||||
The client and the RS might not have any prior knowledge about each | Profiles are expected to specify the details of how this is done, | |||
other, therefore the AS needs to help them to establish a security | depending e.g. on the communication protocol and the credentials used | |||
context or at least a key. The AS does this by indicating | by the client or the RS. | |||
communication security protocol ("csp") and additional key parameters | ||||
in the client information. | ||||
The "csp" parameter specifies how client and RS communication is | In OAuth 2.0 the communication with the Token and the Introspection | |||
going to be secured based on returned keys. Currently defined values | resources at the AS is assumed to be via HTTP and may use Uri-query | |||
are "TLS", "DTLS", "ObjectSecurity" with the encodings specified in | parameters. This framework RECOMMENDS to use CoAP instead and | |||
Figure 2. Depending on the value different additional parameters | RECOMMENDS the use of the following alternative instead of Uri-query | |||
become mandatory. | parameters: The sender (client or RS) encodes the parameters of its | |||
request as a CBOR map and submits that map as the payload of the POST | ||||
request. The Content-format MUST be "application/cbor" in that case. | ||||
/-----------+--------------+-----------------------\ | The OAuth 2.0 AS uses a JSON structure in the payload of its | |||
| Value | Major Type | Key | | responses both to client and RS. This framework RECOMMENDS the use | |||
|-----------+--------------+-----------------------| | of CBOR [RFC7049] instead. The requesting device can explicitly | |||
| 0 | 0 | TLS | | request this encoding by setting the CoAP Accept option in the | |||
| 1 | 0 | DTLS | | request to "application/cbor". | |||
| 2 | 0 | ObjectSecurity | | ||||
\-----------+--------------+-----------------------/ | ||||
Figure 2: Table of 'csp' parameter value encodings for Client | 6. The 'Token' Resource | |||
Information. | ||||
CoAP specifies three security modes of DTLS: PreSharedKey, | In plain OAuth 2.0 the AS provides the /token resource for submitting | |||
RawPublicKey and Certificate. The same modes may be used with TLS. | access token requests. This framework extends the functionality of | |||
The client is to infer from the type of key provided, which (D)TLS | the /token resource, giving the AS the possibility to help client and | |||
mode the RS supports as follows. | RS to establish shared keys or to exchange their public keys. | |||
If PreSharedKey mode is used, the AS MUST provide the client with the | Communication between the client and the token resource at the AS | |||
pre-shared key to be used with the RS. This key MUST be the same as | MUST be integrity protected and encrypted. Furthermore AS and client | |||
the PoP key (i.e. a symmetric key as in section 4 of | MUST perform mutual authentication. Profiles of this framework are | |||
[I-D.ietf-oauth-pop-key-distribution]). | expected to specify how authentication and communication security is | |||
implemented. | ||||
The client MUST use the PoP key as DTLS pre-shared key. The client | The figures of this section uses CBOR diagnostic notation without the | |||
MUST furthermore use the "kid" parameter provided as part of the JWK/ | integer abbreviations for the parameters or their values for better | |||
COSE_Key as the psk_identity in the DTLS handshake [RFC4279]. | readability. | |||
If RawPublicKey mode is used, the AS MUST provide the client with the | 6.1. Client-to-AS Request | |||
RS's raw public key using the "rpk" parameter defined in the | ||||
following. This parameter MUST contain a JWK or a COSE_Key. The | ||||
client MUST provide a raw public key to the AS, and the AS MUST use | ||||
this key as PoP key in the token. The token MUST thus use asymmetric | ||||
keys for the proof-of-possession. | ||||
In order to get the proof-of-possession a RS configured to use this | When requesting an access token from the AS, the client MAY include | |||
mode together with PoP tokens MUST require client authentication in | the following parameters in the request in addition to the ones | |||
the DTLS handshake. The client MUST use the raw public key bound to | required or optional according to the OAuth 2.0 specification | |||
the PoP token for client authentication in DTLS. | [RFC6749]: | |||
TLS or DTLS with certificates MAY make use of pre-established trust | token_type | |||
anchors or MAY be configured more tightly with additional client | OPTIONAL. See Section 6.4 for more details. | |||
information parameters, such as x5c, x5t, or x5t#S256. An overview | ||||
of these parameters is given below. | ||||
For when communication security is based on certificates this | alg | |||
attribute can be used to define the server certificate or CA | OPTIONAL. See Section 6.4 for more details. | |||
certificate. Semantics for this attribute is defined by [RFC7517] or | ||||
COSE_Key [I-D.ietf-cose-msg]. | ||||
For when communication security is based on certificates this | profile | |||
attribute can be used to define the specific server certificate to | OPTIONAL. This indicates the profile that the client would like | |||
expect or the CA certificate. Semantics for this attribute is | to use with the RS. See Section 6.4 for more details on the | |||
defined by JWK/COSE_Key. | formatting of this parameter. If the RS cannot support the | |||
requested profile, the AS MUST reply with an error message. | ||||
To use object security (such as OSCOAP and OSCON) requires security | cnf | |||
context to be established, which can be provisioned with PoP token | OPTIONAL. This field contains information about a public key the | |||
and client information, or derived from that information. Object | client would like to bind to the access token. If the client | |||
security specifications designed to be used with this protocol MUST | requests an asymmetric proof-of-possession algorithm, but does not | |||
specify the parameters that an AS has to provide to the client in | provide a public key, the AS MUST respond with an error message. | |||
order to set up the necessary security context. | See Section 6.4 for more details on the formatting of the 'cnf' | |||
parameter. | ||||
The RS may support different ways of receiving the access token from | These new parameters are optional in the case where the AS has prior | |||
the client (see Section 5.3 and Appendix C). The AS MAY signal the | knowledge of the capabilities of the client, otherwise these | |||
required method for access token transfer in the client information | parameters are required. This prior knowledge may, for example, be | |||
by using the "tktr" (token transport) parameter using the values | set by the use of a dynamic client registration protocol exchange | |||
defined in table Figure 3. If no "tktn" parameter is present, the | [RFC7591]. | |||
client MUST use the default Authorization Information resource as | ||||
specified in Section 5.3. | ||||
/-----------+--------------+-------------------------\ | The following examples illustrate different types of requests for | |||
| Value | Major Type | Key | | proof-of-possession tokens. | |||
|-----------+--------------+-------------------------| | ||||
| 0 | 0 | POST to /authz-info | | ||||
| 1 | 0 | RFC 4680 | | ||||
| 2 | 0 | CoAP option "Ref-Token" | | ||||
\-----------+--------------+-------------------------/ | ||||
Figure 3: Table of 'tktn' parameter value encodings for Client | Figure 2 shows a request for a token with a symmetric proof-of- | |||
Information. | possession key. | |||
Table Figure 4 summarizes the additional parameters defined here for | Header: POST (Code=0.02) | |||
use by the client or the AS in the PoP token request protocol. | Uri-Host: "server.example.com" | |||
Uri-Path: "token" | ||||
Content-Type: "application/cbor" | ||||
Payload: | ||||
{ | ||||
"grant_type" : "client_credentials", | ||||
"aud" : "tempSensor4711", | ||||
"client_id" : "myclient", | ||||
"client_secret" : b64'FWRUVGZUZmZFRkWSRlVGhA', | ||||
"token_type" : "pop", | ||||
"alg" : "HS256", | ||||
"profile" : "coap_dtls" | ||||
} | ||||
/-----------+--------------+----------------------------------\ | Figure 2: Example request for an access token bound to a symmetric | |||
| Parameter | Used by | Description | | key. | |||
|-----------+--------------+----------------------------------| | ||||
| csp | client or AS | Communication security protocol | | ||||
| rpk | AS | RS's raw public key | | ||||
| x5c | AS | RS's X.509 certificate chain | | ||||
| x5t | AS | RS's SHA-1 cert thumb print | | ||||
| x5t#S256 | AS | RS's SHA-256 cert thumb print | | ||||
| tktn | AS | Mode of token transfer C -> RS | | ||||
\-----------+--------------+----------------------------------/ | ||||
Figure 4: Table of additional parameters defined for the PoP | Figure 3 shows a request for a token with an asymmetric proof-of- | |||
protocol. | possession key. | |||
5.2. CoAP Access-Token Option | Header: POST (Code=0.02) | |||
Uri-Host: "server.example.com" | ||||
Uri-Path: "token" | ||||
Content-Type: "application/cbor" | ||||
Payload: | ||||
{ | ||||
"grant_type" : "token", | ||||
"aud" : "lockOfDoor0815", | ||||
"client_id" : "myclient", | ||||
"token_type" : "pop", | ||||
"alg" : "ES256", | ||||
"profile" : "coap_oscoap" | ||||
"cnf" : { | ||||
"COSE_Key" : { | ||||
"kty" : "EC", | ||||
"kid" : h'11', | ||||
"crv" : "P-256", | ||||
"x" : b64'usWxHK2PmfnHKwXPS54m0kTcGJ90UiglWiGahtagnv8', | ||||
"y" : b64'IBOL+C3BttVivg+lSreASjpkttcsz+1rb7btKLv8EX4' | ||||
} | ||||
} | ||||
} | ||||
OAuth 2.0 access tokens are usually transferred as authorization | Figure 3: Example request for an access token bound to an asymmetric | |||
header. CoAP has no authorization header equivalence. This document | key. | |||
therefor register the option Access-Token. The Access-Token option | ||||
is an alternative for transferring the access token when it is | ||||
smaller then 255 bytes. If token is larger the 255 bytes lager | ||||
authorization information resources MUST at the RS be user when CoAP. | ||||
5.3. Authorization Information Resource at the Resource Server | Figure 4 shows a request for a token where a previously communicated | |||
proof-of-possession key is only referenced. | ||||
A consequence of allowing the use of CoAP as web transfer protocol is | Header: POST (Code=0.02) | |||
that we cannot rely on HTTP specific mechanisms, such as transferring | Uri-Host: "server.example.com" | |||
information elements in HTTP headers since those are not necessarily | Uri-Path: "token" | |||
gracefully mapped to CoAP. In case the access token is larger than | Content-Type: "application/cbor" | |||
255 bytes it should not be sent as a CoAP option. | Payload: | |||
{ | ||||
"grant_type" : "client_credentials", | ||||
"aud" : "valve424", | ||||
"scope" : "read", | ||||
"client_id" : "myclient", | ||||
"token_type" : "pop", | ||||
"alg" : "ES256", | ||||
"profile" : "coap_oscoap" | ||||
"cnf" : { | ||||
"kid" : b64'6kg0dXJM13U' | ||||
} | ||||
} | ||||
For conveying authorization information to the RS a new resource is | Figure 4: Example request for an access token bound to a key | |||
introduced to which the PoP tokens can be sent to convey | reference. | |||
authorization information before the first resource request is made | ||||
by the client. This specification calls this resource "/authz-info"; | ||||
the URI may, however, vary in deployments. | ||||
The RS needs to store the PoP token for when later authorizing | 6.2. AS-to-Client Response | |||
requests from the client. The RS is not mandated to be able to | ||||
manage multiple client at once. how the RS manages clients is out of | ||||
scope for this specification. | ||||
5.3.1. Authorization Information Request | If the access token request has been successfully verified by the AS | |||
and the client is authorized to obtain a PoP token for the indicated | ||||
audience and scopes (if any), the AS issues an access token. If | ||||
client authentication failed or is invalid, the authorization server | ||||
returns an error response as described in Section 6.3. | ||||
The client makes a POST request to the authorization information | The following parameters may also be part of a successful response in | |||
resource by sending its PoP token as request data. | addition to those defined in section 5.1 of [RFC6749]: | |||
Client MUST send the Content-Format option indicate token format | profile | |||
REQUIRED. This indicates the profile that the client MUST use | ||||
towards the RS. See Section 6.4 for the formatting of this | ||||
parameter. | ||||
5.3.2. Authorization Information Response | cnf | |||
REQUIRED. This field contains information about the proof-of | ||||
possession key for this access token. See Section 6.4 for the | ||||
formatting of this parameter. | ||||
The RS MUST resonde to a requests to the authorization information | Note that the access token can also contains a 'cnf' claim, however, | |||
resource. The response MUST match CoAP response codes according to | these two values are consumed by different parties. The access token | |||
success or error response section | is created by the AS and processed by the RS (and opaque to the | |||
client) whereas the Client Information is created by the AS and | ||||
processed by the client; it is never forwarded to the resource | ||||
server. | ||||
5.3.2.1. Success Response | The following examples illustrate different types of responses for | |||
proof-of-possession tokens. | ||||
Successful requests MUST be answered with 2.01 Created to indicate | Figure 5 shows a response containing a token and a 'cnf' parameter | |||
that a "session" for the PoP Token has been created. No location | with a symmetric proof-of-possession key. | |||
path is required to be returned. | ||||
Resource | Header: Created (Code=2.01) | |||
Client Server | Content-Type: "application/cbor" | |||
| | | Payload: | |||
| | | { | |||
A: +-------->| Header: POST (Code=0.02) | "access_token" : b64'SlAV32hkKG ... | |||
| POST | Uri-Path: "/authz-info" | (remainder of CWT omitted for brevity; | |||
| | Content-Format: "application/cwt" | CWT contains COSE_Key in the 'cnf' claim)', | |||
| | Payload: <PoP Token> | "token_type" : "pop", | |||
| | | "alg" : "HS256", | |||
B: |<--------+ Header: 2.01 Created | "expires_in" : "3600", | |||
| 2.01 | | "profile" : "coap_dtls" | |||
| | | "cnf" : { | |||
"COSE_Key" : { | ||||
"kty" : "Symmetric", | ||||
"kid" : b64'39Gqlw', | ||||
"k" : b64'hJtXhkV8FJG+Onbc6mxCcQh' | ||||
} | ||||
} | ||||
} | ||||
Figure 5: Authorization Information Resource Success Response | Figure 5: Example AS response with an access token bound to a | |||
symmetric key. | ||||
5.3.2.2. Error Response | 6.3. Error Response | |||
The resource server MUST user appropriate CoAP response code to | The error responses for CoAP-based interactions with the AS are | |||
convey the error to the Client. For request that are not valid, e.g. | equivalent to the ones for HTTP-based interactions as defined in | |||
unknown Content-Format, 4.00 Bad Request MUST be returned. If token | section 5.2 of [RFC6749], with the following differences: The | |||
is not valid, e.g. wrong audience, the RS MUST return 4.01 | Content-Type MUST be set to "application/cbor", the payload MUST be | |||
Unauthorized. | encoded in a CBOR map and the CoAP response code 4.00 Bad Request | |||
MUST be used unless specified otherwise. | ||||
Resource | 6.4. New Request and Response Parameters | |||
Client Server | ||||
| | | ||||
| | | ||||
A: +-------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/authz-info" | ||||
| | Content-Format: "application/cwt" | ||||
| | Payload: <PoP Token> | ||||
| | | ||||
B: |<--------+ Header: 4.01 Unauthorized | ||||
| 2.01 | | ||||
| | | ||||
Figure 6: Authorization Information Resource Error Response | This section defines parameters that can be used in access token | |||
requests and responses, as well as abbreviations for more compact | ||||
encoding of existing parameters and common values. | ||||
5.4. Authorization Information Format | 6.4.1. Grant Type | |||
We introduce a new claim for describing access rights with a specific | The abbreviations in Figure 6 MAY be used in CBOR encodings instead | |||
format, the "aif" claim. In this memo we propose to use the compact | of the string values defined in [RFC6749]. | |||
format provided by AIF [I-D.bormann-core-ace-aif]. Access rights may | ||||
be specified as a list of URIs of resources together with allowed | ||||
actions (GET, POST, PUT, PATCH, or DELETE). Other formats may be | ||||
mandated by specific applications or requirements (e.g. specifying | ||||
local conditions on access). | ||||
5.5. CBOR Data Formats | /--------------------+----------+--------------\ | |||
| grant_type | CBOR Key | Major Type | | ||||
|--------------------+----------+--------------| | ||||
| password | 0 | 0 (uint) | | ||||
| authorization_code | 1 | 0 | | ||||
| client_credentials | 2 | 0 | | ||||
| refresh_token | 3 | 0 | | ||||
\--------------------+----------+--------------/ | ||||
The /token resource (called "endpoint" in OAuth 2.0), defined in | Figure 6: CBOR abbreviations for common grant types | |||
Section 3.2 of [RFC6749], is used by the client to obtain an access | ||||
token. Requests sent to the /token resource use the HTTP POST method | ||||
and the payload includes a query component, which is formatted as | ||||
application/x-www-form-urlencoded. CoAP payloads cannot be formatted | ||||
in the same way which requires the /token resource on the AS to be | ||||
profiled. Appendix D defines a CBOR-based format for sending | ||||
parameters to the /token resource. | ||||
5.6. Token Expiration | 6.4.2. Token Type and Algorithms | |||
Depending on the capabilities of the RS, there are various ways in | To allow clients to indicate support for specific token types and | |||
which it can verify the validity of a received access token. We list | respective algorithms they need to interact with the AS. They can | |||
the possibilities here including what functionality they require of | either provide this information out-of-band or via the 'token_type' | |||
the RS. | and 'alg' parameter in the client request. | |||
o The token is a CWT/JWT and includes a 'exp' claim and possibly the | The value in the 'alg' parameter together with value from the | |||
'nbf' claim. The RS verifies these by comparing them to values | 'token_type' parameter allow the client to indicate the supported | |||
from its internal clock as defined in [RFC7519]. In this case the | algorithms for a given token type. The token type refers to the | |||
RS must have a real time chip (RTC) or some other way of reliably | specification used by the client to interact with the resource server | |||
measuring time. | to demonstrate possession of the key. The 'alg' parameter provides | |||
further information about the algorithm, such as whether a symmetric | ||||
or an asymmetric crypto-system is used. Hence, a client supporting a | ||||
specific token type also knows how to populate the values to the | ||||
'alg' parameter. | ||||
o The RS verifies the validity of the token by performing an | This document registers the new value "pop" for the OAuth Access | |||
introspection request as specified in Appendix D.2. This requires | Token Types registry, specifying a Proof-of-Possession token. How | |||
the RS to have a reliable network connection to the AS and to be | the proof-of-possession is performed is specified by the 'alg' | |||
able to handle two secure sessions in parallel (C to RS and AS to | parameter. Profiles of this framework are responsible for defining | |||
RS). | values for the 'alg' parameter together with the corresponding proof- | |||
of-possession mechanisms. | ||||
o The RS and the AS both store a sequence number linked to their | The values in the 'alg' parameter are case-sensitive. If the client | |||
common security association. The AS increments this number for | supports more than one algorithm then each individual value MUST be | |||
each access token it issues and includes it in the access token, | separated by a space. | |||
which is a CWT/JWT. The RS keeps track of the most recently | ||||
received sequence number, and only accepts tokens as valid, that | ||||
are in a certain range around this number. This method does only | ||||
require the RS to keep track of the sequence number. The method | ||||
does not provide timely expiration, but it makes sure that older | ||||
tokens cease to be valid after a specified number of newer ones | ||||
got issued. For a constrained RS with no network connectivity and | ||||
no means of reliably measuring time, this is the best that can be | ||||
achieved. | ||||
6. Deployment Scenarios | 6.4.3. Profile | |||
There is a large variety of IoT deployments, as is indicated in | The "profile" parameter identifies the communication protocol and the | |||
Appendix A, and this section highlights common variants. This | communication security protocol between the client and the RS. | |||
section is not normative but illustrates how the framework can be | ||||
applied. | ||||
For each of the deployment variants there are a number of possible | An initial set of profile identifiers and their CBOR encodings are | |||
security setups between clients, resource servers and authorization | specified in Figure 7. Profiles using other combinations of | |||
servers. The main focus in the following subsections is on how | protocols are expected to define their own profile identifiers. | |||
authorization of a client request for a resource hosted by a RS is | ||||
performed. This requires us to also consider how these requests and | ||||
responses between the clients and the resource servers are secured. | ||||
The security protocols between other pairs of nodes in the | /--------------------+----------+--------------\ | |||
architecture, namely client-to-AS and RS-to-AS, are not detailed in | | Profile identifier | CBOR Key | Major Type | | |||
these examples. Different security protocols may be used on | |--------------------+----------+--------------| | |||
transport or application layer. | | http_tls | 0 | 0 (uint) | | |||
| coap_dtls | 1 | 0 | | ||||
| coap_oscoap | 2 | 0 | | ||||
\--------------------+----------+--------------/ | ||||
Note: We use the CBOR diagnostic notation for examples of requests | Figure 7: Profile identifiers and their CBOR mappings | |||
and responses. | ||||
6.1. Client and Resource Server are Offline | Profiles MAY define additional parameters for both the token request | |||
and the client information in the access token response in order to | ||||
support negotioation or signalling of profile specific parameters. | ||||
In this scenario we consider the case where both the resource server | 6.4.4. Confirmation | |||
and the client are offline, i.e., they are not connected to the AS at | ||||
the time of the resource request. This access procedure involves | ||||
steps A, B, C, and F of Figure 1, but assumes that step A and B have | ||||
been carried out during a phase when the client had connectivity to | ||||
AS. | ||||
Since the resource server must be able to verify the access token | The "cnf" parameter identifies or provides the key used for proof-of- | |||
locally, self-contained access tokens must be used. | possession. This framework extends the definition of 'cnf' from | |||
[RFC7800] by defining CBOR/COSE encodings and the use of 'cnf' for | ||||
transporting keys in the client information. | ||||
This example shows the interactions between a client, the | A CBOR encoded payload MAY contain the 'cnf' parameter with the | |||
authorization server and a temperature sensor acting as a resource | following contents: | |||
server. Message exchanges A and B are shown in Figure 7. | ||||
A: The client first generates a public-private key pair used for | COSE_Key In this case the 'cnf' parameter contains the proof-of- | |||
communication security with the RS. | possession key to be used by the client. An example is shown in | |||
Figure 8. | ||||
The client sends the POST request to /token at AS. The request | "cnf" : { | |||
contains the public key of the client and the Audience parameter | "COSE_Key" : { | |||
set to "tempSensorInLivingRoom", a value that the temperature | "kty" : "EC", | |||
sensor identifies itself with. The AS evaluates the request and | "kid" : h'11', | |||
authorizes the client to access the resource. | "crv" : "P-256", | |||
"x" : b64'usWxHK2PmfnHKwXPS54m0kTcGJ90UiglWiGahtagnv8', | ||||
"y" : b64'IBOL+C3BttVivg+lSreASjpkttcsz+1rb7btKLv8EX4' | ||||
} | ||||
} | ||||
B: The AS responds with a PoP token and client information. The | Figure 8: Confirmation parameter containing a public key | |||
PoP token contains the public key of the client, while the client | ||||
information contains the public key of the RS. For communication | ||||
security this example uses DTLS with raw public keys between the | ||||
client and the RS. | ||||
Note: In this example we assume that the client knows what | COSE_Encrypted In this case the 'cnf' parameter contains an | |||
resource it wants to access, and is therefore able to request | encrypted symmetriic key destined for the client. The client is | |||
specific audience and scope claims for the access token. | assumed to be able to decrypt the cihpertext of this parameter. | |||
The parameter is encoded as COSE_Encrypted object wrapping a | ||||
COSE_Key object. Figure 9 shows an example of this type of | ||||
encoding. | ||||
Authorization | "cnf" : { | |||
Client Server | "COSE_Encrypted" : { | |||
| | | 993( | |||
| | | [ h'a1010a' # protected header : {"alg" : "AES-CCM-16-64-128"} | |||
A: +-------->| Header: POST (Code=0.02) | "iv" : b64'ifUvZaHFgJM7UmGnjA', # unprotected header | |||
| POST | Uri-Path:"token" | b64'WXThuZo6TMCaZZqi6ef/8WHTjOdGk8kNzaIhIQ' # ciphertext | |||
| | Payload: <Request-Payload> | ] | |||
| | | ) | |||
B: |<--------+ Header: 2.05 Content | } | |||
| | Content-Type: application/cbor | } | |||
| 2.05 | Payload: <Response-Payload> | ||||
| | | ||||
Figure 7: Token Request and Response Using Client Credentials. | Figure 9: Confirmation paramter containing an encrypted symmetric key | |||
The information contained in the Request-Payload and the Response- | The ciphertext here could e.g. contain a symmetric key as in | |||
Payload is shown in Figure 8. | Figure 10. | |||
Request-Payload : | ||||
{ | { | |||
"grant_type" : "client_credentials", | "kty" : "Symmetric", | |||
"aud" : "tempSensorInLivingRoom", | "kid" : b64'39Gqlw', | |||
"client_id" : "myclient", | "k" : b64'hJtXhkV8FJG+Onbc6mxCcQh' | |||
"client_secret" : "qwerty" | ||||
} | } | |||
Response-Payload : | Figure 10: Example plaintext of an encrypted cnf parameter | |||
{ | ||||
"access_token" : b64'SlAV32hkKG ...', | Key Identifier In this case the 'cnf' parameter references a key | |||
"token_type" : "pop", | that is assumed to be previously known by the recipient. This | |||
"csp" : "DTLS", | allows clients that perform repeated requests for an access token | |||
"key" : b64'eyJhbGciOiJSU0ExXzUi ...' | for the same audience but e.g. with different scopes to omit key | |||
transport in the access token, token request and token response. | ||||
Figure 11 shows such an example. | ||||
"cnf" : { | ||||
"kid" : b64'39Gqlw' | ||||
} | } | |||
Figure 8: Request and Response Payload Details. | Figure 11: A Confirmation parameter with just a key identifier | |||
The content of the "key" parameter and the access token are shown in | 6.5. Mapping parameters to CBOR | |||
Figure 9 and Figure 10. | ||||
All OAuth parameters in access token requests and responses are | ||||
mapped to CBOR types as follows and are given an integer key value to | ||||
save space. | ||||
/-------------------+----------+-----------------\ | ||||
| Parameter name | CBOR Key | Major Type | | ||||
|-------------------+----------+-----------------| | ||||
| client_id | 1 | 3 (text string) | | ||||
| client_secret | 2 | 2 (byte string) | | ||||
| response_type | 3 | 3 | | ||||
| redirect_uri | 4 | 3 | | ||||
| scope | 5 | 3 | | ||||
| state | 6 | 3 | | ||||
| code | 7 | 2 | | ||||
| error_description | 8 | 3 | | ||||
| error_uri | 9 | 3 | | ||||
| grant_type | 10 | 0 (unit) | | ||||
| access_token | 11 | 3 | | ||||
| token_type | 12 | 0 | | ||||
| expires_in | 13 | 0 | | ||||
| username | 14 | 3 | | ||||
| password | 15 | 3 | | ||||
| refresh_token | 16 | 3 | | ||||
| alg | 17 | 3 | | ||||
| cnf | 18 | 5 (map) | | ||||
| aud | 19 | 3 | | ||||
| profile | 20 | 0 | | ||||
\---------------+--------------+-----------------/ | ||||
Figure 12: CBOR mappings used in token requests | ||||
7. The 'Introspect' Resource | ||||
Token introspection [RFC7662] is used by the RS and potentially the | ||||
client to query the AS for metadata about a given token e.g. validity | ||||
or scope. Analogous to the protocol defined in RFC 7662 [RFC7662] | ||||
for HTTP and JSON, this section defines adaptations to more | ||||
constrained environments using CoAP and CBOR. | ||||
Communication between the RS and the introspection resource at the AS | ||||
MUST be integrity protected and encrypted. Furthermore AS and RS | ||||
MUST perform mutual authentication. Finally the AS SHOULD to verify | ||||
that the RS has the right to access introspection information about | ||||
the provided token. Profiles of this framework are expected to | ||||
specify how authentication and communication security is implemented. | ||||
The figures of this section uses CBOR diagnostic notation without the | ||||
integer abbreviations for the parameters or their values for better | ||||
readability. | ||||
7.1. RS-to-AS Request | ||||
The RS sends a CoAP POST request to the introspection resource at the | ||||
AS, with payload sent as "application/cbor" data. The payload is a | ||||
CBOR map with a 'token' parameter containing the access token along | ||||
with optional parameters representing additional context that is | ||||
known by the RS to aid the AS in its response. | ||||
The same parameters are required and optional as in section 2.1 of | ||||
RFC 7662 [RFC7662]. | ||||
For example, Figure 13 shows a RS calling the token introspection | ||||
resource at the AS to query about an OAuth 2.0 proof-of-possession | ||||
token. | ||||
Header: POST (Code=0.02) | ||||
Uri-Host: "server.example.com" | ||||
Uri-Path: "introspect" | ||||
Content-Type: "application/cbor" | ||||
Payload: | ||||
{ | { | |||
"kid" : b64'c29tZSBwdWJsaWMga2V5IGlk', | "token" : b64'7gj0dXJQ43U', | |||
"kty" : "EC", | "token_type_hint" : "pop" | |||
"crv" : "P-256", | ||||
"x" : b64'MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4', | ||||
"y" : b64'4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM' | ||||
} | } | |||
Figure 9: Public Key of the RS. | Figure 13: Example introspection request. | |||
7.2. AS-to-RS Response | ||||
The AS responds with a CBOR object in "application/cbor" format with | ||||
the same required and optional parameters as in section 2.2. of RFC | ||||
7662 [RFC7662] with the following additions: | ||||
alg | ||||
OPTIONAL. See Section 6.4 for more details. | ||||
cnf | ||||
OPTIONAL. This field contains information about the proof-of- | ||||
possession key that binds the client to the access token. See | ||||
Section 6.4 for more details on the formatting of the 'cnf' | ||||
parameter. | ||||
profile | ||||
OPTIONAL. This indicates the profile that the RS MUST use with | ||||
the client. See Section 6.4 for more details on the formatting of | ||||
this parameter. | ||||
client_token | ||||
OPTIONAL. This parameter contains information that the RS MUST | ||||
pass on to the client. See Section 7.4 for more details. | ||||
For example, Figure 14 shows an AS response to the introspection | ||||
request in Figure 13. | ||||
Header: Created Code=2.01) | ||||
Content-Type: "application/cbor" | ||||
Payload: | ||||
{ | { | |||
"aud" : "tempSensorInLivingRoom", | "active" : true, | |||
"iat" : "1360189224", | "scope" : "read", | |||
"token_type" : "pop", | ||||
"alg" : "HS256", | ||||
"profile" : "coap_dtls", | ||||
"client_token" : b64'2QPhg0OhAQo ... | ||||
(remainder of client token omitted for brevity)', | ||||
"cnf" : { | "cnf" : { | |||
"jwk" : { | "COSE_Key" : { | |||
"kid" : b64'1Bg8vub9tLe1gHMzV76e8', | "kty" : "Symmetric", | |||
"kty" : "EC", | "kid" : b64'39Gqlw', | |||
"crv" : "P-256", | "k" : b64'hJtXhkV8FJG+Onbc6mxCcQh' | |||
"x" : b64'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', | ||||
"y" : b64'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0' | ||||
} | } | |||
} | } | |||
} | } | |||
Figure 10: Access Token including Public Key of the Client. | Figure 14: Example introspection response. | |||
Messages C and F are shown in Figure 11 - Figure 12. | 7.3. Error Response | |||
C: The client then sends the PoP token to the /authz-info resource | The error responses for CoAP-based interactions with the AS are | |||
at the RS. This is a plain CoAP request, i.e. no DTLS/OSCOAP | equivalent to the ones for HTTP-based interactions as defined in | |||
between client and RS, since the token is integrity protected | section 2.3 of [RFC7662], with the following differences: | |||
between AS and RS. The RS verifies that the PoP token was created | ||||
by a known and trusted AS, is valid, and responds to the client. | ||||
The RS caches the security context together with authorization | ||||
information about this client contained in the PoP token. | ||||
The client and resource server run the DTLS handshake using the | o If content is sent, the Content-Type MUST be set to "application/ | |||
raw public keys established in step B and C. | cbor", and the payload MUST be encoded in a CBOR map. | |||
o If the credentials used by the RS are invalid the AS MUST respond | ||||
with the CoAP response code code 4.01 (Unauthorized) and use the | ||||
required and optional parameters from section 5.2 in RFC 6749 | ||||
[RFC6749]. | ||||
o If the RS does not have the right to perform this introspection | ||||
request, the AS MUST respond with the CoAP response code 4.03 | ||||
(Forbidden). In this case no payload is returned. | ||||
The client sends the CoAP request GET to /temperature on RS over | Note that a properly formed and authorized query for an inactive or | |||
DTLS. The RS verifies that the request is authorized. | otherwise invalid token does not warrant an error response by this | |||
specification. In these cases, the authorization server MUST instead | ||||
respond with an introspection response with the "active" field set to | ||||
"false". | ||||
F: The RS responds with a resource representation over DTLS. | 7.4. Client Token | |||
Resource | EDITORIAL NOTE: We have tentatively introduced this concept and would | |||
Client Server | specifically like feedback if this is viewed as a useful addition to | |||
| | | the framework. | |||
C: +-------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path:"authz-info" | ||||
| | Payload: SlAV32hkKG ... | ||||
| | (access token) | ||||
| | | ||||
|<--------+ Header: 2.04 Changed | ||||
| 2.04 | | ||||
| | | ||||
Figure 11: Access Token provisioning to RS | In cases where the client has limited connectivity and is requesting | |||
access to a previously unknown resource servers, using a long term | ||||
token, there are situations where it would be beneficial to relay the | ||||
proof-of-possession key and other relevant information from the AS to | ||||
the client through the RS. The client_token parameter is designed to | ||||
carry such information, and is intended to be used as described in | ||||
Figure 15. | ||||
Resource | Resource Authorization | |||
Client Server | Client Server Server | |||
| | | | | | | |||
|<=======>| DTLS Connection Establishment | | | | | |||
| | using Raw Public Keys | A: +--------------->| | | |||
| | | | POST | | | |||
| | | | Access Token | | | |||
+-------->| Header: GET (Code=0.01) | | B: +--------------->| | |||
| GET | Uri-Path: "temperature" | | | Introspection | | |||
| | | | | Request | | |||
| | | | | | | |||
| | | | C: +<---------------+ | |||
F: |<--------+ Header: 2.05 Content | | | Introspection | | |||
| 2.05 | Payload: {"t":"22.7"} | | | Response | | |||
| | | | | + Client Token | | |||
D: |<---------------+ | | ||||
| 2.01 Created | | | ||||
| + Client Token | | ||||
Figure 12: Resource Request and Response protected by DTLS. | Figure 15: Use of the client_token parameter. | |||
6.2. Resource Server Offline | The client token is a COSE_Encrytped object, containing as payload a | |||
CBOR map with the following claims: | ||||
In this deployment scenario we consider the case of an RS that may | cnf | |||
not be able to access the AS at the time it receives an access | REQUIRED. Contains information about the proof-of-possession key | |||
request from a client. We denote this case "RS offline", it involves | the client is to use with its access token. See Section 6.4.4. | |||
steps A, B, C and F of Figure 1. | ||||
If the RS is offline, then it must be possible for the RS to locally | token_type | |||
validate the access token. This requires self-contained tokens to be | OPTIONAL. See Section 6.4.2. | |||
used. | ||||
The validity time for the token should always be chosen as short as | alg | |||
possible to reduce the possibility that a token contains out-of-date | OPTIONAL. See Section 6.4.2. | |||
authorization information. Therefore the value for the Expiration | ||||
Time claim ("exp") should be set only slightly larger than the value | ||||
for the Issuing Time claim ("iss"). A constrained RS with means to | ||||
reliably measure time must validate the expiration time of the access | ||||
token. | ||||
The following example shows interactions between a client (air- | profile | |||
conditioning control unit), an offline resource server (temperature | REQUIRED. See Section 6.4.3. | |||
sensor)and an authorization server. The message exchanges A and B | ||||
are shown in Figure 13. | ||||
A: The client sends the request POST to /token at AS. The request | rs_cnf | |||
contains the Audience parameter set to "tempSensor109797", a value | OPTIONAL. Contains information about the key that the RS uses to | |||
that the temperature sensor identifies itself with. The scope the | authenticate towards the client. If the key is symmetric then | |||
client wants the AS to authorize the access token for is "owner", | this claim MUST NOT be part of the Client Token, since this is the | |||
which means that the token can be used to both read temperature | same key as the one specified through the 'cnf' claim. This claim | |||
data and upgrade the firmware on the RS. The AS evaluates the | uses the same encoding as the 'cnf' parameter. See Section 6.4.3. | |||
request and authorizes the client to access the resource. | ||||
B: The AS responds with a PoP token and client information. The | The AS encrypts this token using a key shared between the AS and the | |||
PoP token is wrapped in a COSE message, object secured content | client, so that only the client can decrypt it and access its | |||
from AS to RS. The client information contains a symmetric key. | payload. How this key is established is out of scope of this | |||
In this case communication security between C and RS is OSCOAP | framework. | |||
with an authenticated encryption algorithm. The client derives | ||||
two unidirectional security contexts to use with the resource | ||||
request and response messages. The access token includes the | ||||
claim "aif" with the authorized access that an owner of the | ||||
temperature device can enjoy. The "aif" claim, issued by the AS, | ||||
informs the RS that the owner of the access token, that can prove | ||||
the possession of a key is authorized to make a GET request | ||||
against the /tempC resource and a POST request on the /firmware | ||||
resource. | ||||
Authorization | 7.5. Mapping Introspection parameters to CBOR | |||
Client Server | ||||
| | | ||||
| | | ||||
A: +-------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "token" | ||||
| | Payload: <Request-Payload> | ||||
| | | ||||
B: |<--------+ Header: 2.05 Content | ||||
| | Content-Type: application/cbor | ||||
| 2.05 | Payload: <Response-Payload> | ||||
| | | ||||
| | | ||||
Figure 13: Token Request and Response | The introspection request and response parameters are mapped to CBOR | |||
types as follows and are given an integer key value to save space. | ||||
The information contained in the Request-Payload and the Response- | /----------------+----------+-----------------\ | |||
Payload is shown in Figure 14. | | Parameter name | CBOR Key | Major Type | | |||
|----------------+----------+-----------------| | ||||
| active | 1 | 0 (uint) | | ||||
| username | 2 | 3 (text string) | | ||||
| client_id | 3 | 3 | | ||||
| scope | 4 | 3 | | ||||
| token_type | 5 | 3 | | ||||
| exp | 6 | 6 tag value 1 | | ||||
| iat | 7 | 6 tag value 1 | | ||||
| nbf | 8 | 6 tag value 1 | | ||||
| sub | 9 | 3 | | ||||
| aud | 10 | 3 | | ||||
| iss | 11 | 3 | | ||||
| jti | 12 | 3 | | ||||
| alg | 13 | 3 | | ||||
| cnf | 14 | 5 (map) | | ||||
| aud | 15 | 3 | | ||||
| client_token | 16 | 3 | | ||||
| rs_cnf | 17 | 5 | | ||||
\----------------+----------+-----------------/ | ||||
Request-Payload: | Figure 16: CBOR Mappings to Token Introspection Parameters. | |||
{ | ||||
"grant_type" : "client_credentials", | ||||
"client_id" : "myclient", | ||||
"client_secret" : "qwerty", | ||||
"aud" : "tempSensor109797", | ||||
"scope" : "owner" | ||||
} | ||||
Response-Payload: | 8. The Access Token | |||
{ | ||||
"access_token": b64'SlAV32hkKG ...', | ||||
"token_type" : "pop", | ||||
"csp" : "OSCOAP", | ||||
"key" : b64'eyJhbGciOiJSU0ExXzUi ...' | ||||
} | ||||
Figure 14: Request and Response Payload for RS offline | This framework RECOMMENDS the use of CBOR web token (CWT) as | |||
specified in [I-D.ietf-ace-cbor-web-token]. | ||||
Figure 15 shows examples of the key and the access_token parameters | In order to facilitate offline processing of access tokens, this | |||
of the Response-Payload, decoded to CBOR. | draft specfifies the "scope" claim for access tokens that explicitly | |||
encodes the scope of a given access token. This claim follows the | ||||
same encoding rules as defined in section 3.3 of [RFC6749]. The | ||||
meaning of a specific scope value is application specific and | ||||
expected to be known to the RS running that application. | ||||
access_token: | 8.1. The 'Authorization Information' Resource | |||
{ | ||||
"aud" : "tempSensor109797", | ||||
"exp" : 1311281970, | ||||
"iat" : 1311280970, | ||||
"aif" : [["/tempC", 0], ["/firmware", 2]], | ||||
"cnf" : { | ||||
"ck":b64'JDLUhTMjU2IiwiY3R5Ijoi ...' | ||||
} | ||||
} | ||||
key: | The access token, containing authorization information and | |||
{ | information of the key used by the client, is transported to the RS | |||
"alg" : "AES_128_CCM_8", | so that the RS can authenticate and authorize the client request. | |||
"kid" : b64'U29tZSBLZXkgSWQ', | This section defines a method for transporting the access token to | |||
"k" : b64'ZoRSOrFzN_FzUA5XKMYoVHyzff5oRJxl-IXRtztJ6uE' | the RS using CoAP that MAY be used. An ACE profile MAY define other | |||
} | methods for token transport. | |||
Figure 15: Access Token and symmetric key from the Response-Payload | This method REQUIRES the RS to implement an /authz-info resource. A | |||
client using this method MUST make a POST request to /authz-info on | ||||
the RS with the access token in the payload. The RS receiving the | ||||
token MUST verify the validity of the token. If the token is valid, | ||||
the RS MUST respond to the POST request with 2.04 (Changed). | ||||
Message exchanges C and F are shown in Figure 16 and Figure 17. | If the token is not valid, the RS MUST respond with error code 4.01 | |||
(Unauthorized). If the token is valid but the audience of the token | ||||
does not match the RS, the RS MUST respond with error code 4.03 | ||||
(Forbidden). | ||||
C: The client then sends the PoP token to the /authz-info resource | The RS MAY make an introspection request to validate the token before | |||
in the RS. This is a plain CoAP request, i.e. no DTLS/OSCOAP | responding to the POST /authz-info request. If the introspection | |||
between client and RS, since the token is integrity protected | response contains a client token (Section 7.4) then this token SHALL | |||
between AS and RS. The RS verifies that the PoP token was created | be included in the payload of the 2.04 (Changed) response. | |||
by a known and trusted AS, is valid, and responds to the client. | ||||
The RS derives and caches the security contexts together with | ||||
authorization information about this client contained in the PoP | ||||
token. | ||||
The client sends the CoAP requests GET to /tempC on the RS using | 8.2. Token Expiration | |||
OSCOAP. The RS verifies the request and that it is authorized. | ||||
F: The RS responds with a protected status code using OSCOAP. The | Depending on the capabilities of the RS, there are various ways in | |||
client verifies the response. | which it can verify the validity of a received access token. We list | |||
the possibilities here including what functionality they require of | ||||
the RS. | ||||
Resource | o The token is a CWT/JWT and includes a 'exp' claim and possibly the | |||
Client Server | 'nbf' claim. The RS verifies these by comparing them to values | |||
| | | from its internal clock as defined in [RFC7519]. In this case the | |||
C: +-------->| Header: POST (Code=0.02) | RS must have a real time chip (RTC) or some other way of reliably | |||
| POST | Uri-Path:"authz-info" | measuring time. | |||
| | Payload: <Access Token> | o The RS verifies the validity of the token by performing an | |||
| | | introspection request as specified in Section 7. This requires | |||
| | | the RS to have a reliable network connection to the AS and to be | |||
|<--------+ Header: 2.04 Changed | able to handle two secure sessions in parallel (C to RS and AS to | |||
| 2.04 | | RS). | |||
| | | o The RS and the AS both store a sequence number linked to their | |||
| | | common security association. The AS increments this number for | |||
each access token it issues and includes it in the access token, | ||||
which is a CWT/JWT. The RS keeps track of the most recently | ||||
received sequence number, and only accepts tokens as valid, that | ||||
are in a certain range around this number. This method does only | ||||
require the RS to keep track of the sequence number. The method | ||||
does not provide timely expiration, but it makes sure that older | ||||
tokens cease to be valid after a certain number of newer ones got | ||||
issued. For a constrained RS with no network connectivity and no | ||||
means of reliably measuring time, this is the best that can be | ||||
achieved. | ||||
Figure 16: Access Token provisioning to RS | 9. Security Considerations | |||
Resource | The entire document is about security. Security considerations | |||
Client Server | applicable to authentication and authorization in RESTful | |||
| | | environments provided in OAuth 2.0 [RFC6749] apply to this work, as | |||
+-------->| Header: GET (Code=0.01) | well as the security considerations from [I-D.ietf-ace-actors]. | |||
| GET | Object-Security: | Furthermore [RFC6819] provides additional security considerations for | |||
| | (<seq>,<cid>,[Uri-Path:"tempC"],<tag>) | OAuth which apply to IoT deployments as well. Finally | |||
| | | [I-D.ietf-oauth-pop-architecture] discusses security and privacy | |||
F: |<--------+ Header: 2.05 Content | threats as well as mitigation measures for Proof-of-Possession | |||
| 2.05 | Object-Security: | tokens. | |||
| | (<seq>,<cid>,[22.7 C],<tag>) | ||||
| | | ||||
Figure 17: Resource request and response protected by OSCOAP | 10. IANA Considerations | |||
In Figure 17 the GET request contains an Object-Security option and | This specification registers new parameters for OAuth and establishes | |||
an indication of the content of the COSE object: a sequence number | registries for mappings to CBOR. | |||
("seq", starting from 0), a context identifier ("cid") indicating the | ||||
security context, the ciphertext containing the encrypted CoAP option | ||||
identifying the resource, and the Message Authentication Code ("tag") | ||||
which also covers the Code in the CoAP header. | ||||
The Object-Security ciphertext in the response [22.7 C] represents an | 10.1. OAuth Introspection Response Parameter Registration | |||
encrypted temperature reading. (The COSE object is actually carried | ||||
in the CoAP payload when possible but that is omitted to simplify | ||||
notation.) | ||||
6.3. Token Introspection with an Offline Client | This specification registers the following parameters in the OAuth | |||
introspection response parameters | ||||
In this deployment scenario we assume that a client is not be able to | o Name: "alg" | |||
access the AS at the time of the access request. Since the RS is, | o Description: Algorithm to use with PoP key, as defined in PoP | |||
however, connected to the back-end infrastructure it can make use of | token specification, | |||
token introspection. This access procedure involves steps A-F of | o Change Controller: IESG | |||
Figure 1, but assumes steps A and B have been carried out during a | o Specification Document(s): this document | |||
phase when the client had connectivity to AS. | ||||
Since the client is assumed to be offline, at least for a certain | o Name: "cnf" | |||
period of time, a pre-provisioned access token has to be long-lived. | o Description: Key to use to prove the right to use an access token, | |||
The resource server may use its online connectivity to validate the | as defined in [RFC7800]. | |||
access token with the authorization server, which is shown in the | o Change Controller: IESG | |||
example below. | o Specification Document(s): this document | |||
In the example we show the interactions between an offline client | o Name: "aud" | |||
(key fob), a resource server (online lock), and an authorization | o Description: reference to intended receiving RS, as defined in PoP | |||
server. We assume that there is a provisioning step where the client | token specification. | |||
has access to the AS. This corresponds to message exchanges A and B | o Change Controller: IESG | |||
which are shown in Figure 18. | o Specification Document(s): this document | |||
A: The client sends the request using POST to /token at AS. The | o Name: "profile" | |||
request contains the Audience parameter set to "lockOfDoor4711", a | o Description: The communication and communication security profile | |||
value the that the online door in question identifies itself with. | used between client and RS, as defined in ACE profiles. | |||
The AS generates an access token as on opaque string, which it can | o Change Controller: IESG | |||
match to the specific client, a targeted audience and a symmetric | o Specification Document(s): this document | |||
key security context. | ||||
B: The AS responds with the an access token and client | o Name: "client_token" | |||
information, the latter containing a symmetric key. Communication | o Description: Information that the RS MUST pass to the client e.g. | |||
security between C and RS will be OSCOAP with authenticated | about the proof-of-possession keys. | |||
encryption. | o Change Controller: IESG | |||
o Specification Document(s): this document | ||||
Authorization | 10.2. OAuth Parameter Registration | |||
Client Server | ||||
| | | ||||
| | | ||||
A: +-------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path:"token" | ||||
| | Payload: <Request-Payload> | ||||
| | | ||||
B: |<--------+ Header: 2.05 Content | ||||
| | Content-Type: application/cbor | ||||
| 2.05 | Payload: <Response-Payload> | ||||
| | | ||||
Figure 18: Token Request and Response using Client Credentials. | This specification registers the following parameters in the OAuth | |||
Parameters Registry | ||||
Authorization consent from the resource owner can be pre-configured, | o Name: "alg" | |||
but it can also be provided via an interactive flow with the resource | o Description: Algorithm to use with PoP key, as defined in PoP | |||
owner. An example of this for the key fob case could be that the | token specification, | |||
resource owner has a connected car, he buys a generic key that he | o Change Controller: IESG | |||
wants to use with the car. To authorize the key fob he connects it | o Specification Document(s): this document | |||
to his computer that then provides the UI for the device. After that | ||||
OAuth 2.0 implicit flow is used to authorize the key for his car at | ||||
the the car manufacturers AS. | ||||
The information contained in the Request-Payload and the Response- | o Parameter name: "profile" | |||
Payload is shown in Figure 19. | o Parameter usage location: token request, and token response | |||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
Request-Payload: | o Name: "cnf" | |||
{ | o Description: Key to use to prove the right to use an access token, | |||
"grant_type" : "token", | as defined in [RFC7800]. | |||
"aud" : "lockOfDoor4711", | o Change Controller: IESG | |||
"client_id" : "myclient", | o Specification Document(s): this document | |||
} | ||||
Response-Payload: | 10.3. OAuth Access Token Types | |||
{ | ||||
"access_token" : b64'SlAV32hkKG ...' | ||||
"token_type" : "pop", | ||||
"csp" : "OSCOAP", | ||||
"key" : b64'eyJhbGciOiJSU0ExXzUi ...' | ||||
} | ||||
Figure 19: Request and Response Payload for C offline | This specification registers the following new token type in the | |||
OAuth Access Token Types Registry | ||||
The access token in this case is just an opaque string referencing | o Name: "PoP" | |||
the authorization information at the AS. | o Description: A proof-of-possession token. | |||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
C: Next, the client POSTs the access token to the /authz-info | 10.4. Token Type Mappings | |||
resource in the RS. This is a plain CoAP request, i.e. no DTLS/ | ||||
OSCOAP between client and RS. Since the token is an opaque | ||||
string, the RS cannot verify it on its own, and thus defers to | ||||
respond the client with a status code until step E and only | ||||
acknowledges on the CoAP message layer (indicated with a dashed | ||||
line). | ||||
Resource | A new registry will be requested from IANA, entitled "Token Type | |||
Client Server | Mappings". The registry is to be created as Expert Review Required. | |||
| | | ||||
C: +-------->| Header: POST (T=CON, Code=0.02 | ||||
| POST | Token 0x2a12) | ||||
| | Uri-Path:"authz-info" | ||||
| | Payload: SlAV32hkKG ... | ||||
| | (access token) | ||||
| | | ||||
|<- - - - + Header: T=ACK | ||||
| | | ||||
Figure 20: Access Token provisioning to RS | 10.4.1. Registration Template | |||
D: The RS forwards the token to the /introspect resource on the | Token Type: | |||
AS. Introspection assumes a secure connection between the AS and | Name of token type as registered in the OAuth token type registry | |||
the RS, e.g. using DTLS or OSCOAP, which is not detailed in this | e.g. "Bearer". | |||
example. | Mapped value: | |||
Integer representation for the token type value. The key value | ||||
MUST be an integer in the range of 1 to 65536. | ||||
Change Controller: | ||||
E: The AS provides the introspection response containing claims | For Standards Track RFCs, list the "IESG". For others, give the | |||
about the token. This includes the confirmation key (cnf) claim | name of the responsible party. Other details (e.g., postal | |||
that allows the RS to verify the client's proof of possession in | address, email address, home page URI) may also be included. | |||
step F. | Specification Document(s): | |||
Reference to the document or documents that specify the | ||||
parameter,preferably including URIs that can be used to retrieve | ||||
copies of the documents. An indication of the relevant sections | ||||
may also be included but is not required. | ||||
After receiving message E, the RS responds to the client's POST in | 10.4.2. Initial Registry Contents | |||
step C with Code 2.04 (Changed), using CoAP Token 0x2a12. This | ||||
step is not shown in the figures. | ||||
Resource Authorization | o Parameter name: "Bearer" | |||
Server Server | o Mapped value: 1 | |||
| | | o Change Controller: IESG | |||
D: +--------->| Header: POST (Code=0.02) | o Specification Document(s): this document | |||
| POST | Uri-Path: "introspect" | ||||
| | Payload: <Request-Payload> | ||||
| | | ||||
E: |<---------+ Header: 2.05 Content | ||||
| 2.05 | Content-Type: application/cbor) | ||||
| | Payload: <Response-Payload> | ||||
| | | ||||
Figure 21: Token Introspection for C offline | o Parameter name: "pop" | |||
o Mapped value: 2 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
The information contained in the Request-Payload and the Response- | 10.5. JSON Web Token Claims | |||
Payload is shown in Figure 22. | ||||
Request-Payload: | This specification registers the following new claim in the JSON Web | |||
{ | Token (JWT) registry. | |||
"token" : b64'SlAV32hkKG...', | ||||
"client_id" : "myRS", | ||||
"client_secret" : "ytrewq" | ||||
} | ||||
Response-Payload: | o Claim Name: "scope" | |||
{ | o Claim Description: The scope of an access token as defined in | |||
"active" : true, | [RFC6749]. | |||
"aud" : "lockOfDoor4711", | o Change Controller: IESG | |||
"scope" : "open, close", | o Specification Document(s): this document | |||
"iat" : 1311280970, | ||||
"cnf" : { | ||||
"ck" : b64'JDLUhTMjU2IiwiY3R5Ijoi ...' | ||||
} | ||||
} | ||||
Figure 22: Request and Response Payload for Introspection | 10.6. ACE Profile Registry | |||
The client sends the CoAP requests PUT 1 (= "close the lock") to | A new registry will be requested from IANA, entitled "ACE Profile | |||
/lock on RS using OSCOAP with a security context derived from the | Registry". The registry is to be created as Expert Review Required. | |||
key supplied in step B. The RS verifies the request with the key | ||||
supplied in step E and that it is authorized by the token supplied | ||||
in step C. | ||||
F: The RS responds with a protected status code using OSCOAP. The | 10.6.1. Registration Template | |||
client verifies the response. | ||||
Resource | Profile name: | |||
Client Server | Name of the profile to be included in the profile attribute. | |||
| | | Profile description: | |||
+-------->| Header: PUT (Code=0.03) | Text giving an over view of the profile and the context it is | |||
| PUT | Object-Security: | developed for. | |||
| | (<seq>,<cid>,[Uri-Path:"lock", 1],<tag>) | Profile ID: | |||
| | | Integer value to identify the profile. The value MUST be an | |||
F: |<--------+ Header: 2.04 Changed | integer in the range of 1 to 65536. | |||
| 2.04 | Object-Security: | Change Controller: | |||
| | (<seq>,<cid>,,<tag>) | ||||
| | | ||||
Figure 23: Resource request and response protected by OSCOAP | For Standards Track RFCs, list the "IESG". For others, give the | |||
name of the responsible party. Other details (e.g., postal | ||||
address, email address, home page URI) may also be included. | ||||
Specification Document(s): | ||||
Reference to the document or documents that specify the | ||||
parameter,preferably including URIs that can be used to retrieve | ||||
copies of the documents. An indication of the relevant sections | ||||
may also be included but is not required. | ||||
The Object-Security ciphertext [...] of the PUT request contains CoAP | 10.7. OAuth Parameter Mappings Registry | |||
options that are encrypted, as well as the payload value '1' which is | ||||
the value of PUT to the door lock. | ||||
In this example there is no ciphertext of the PUT response, but "tag" | A new registry will be requested from IANA, entitled "Token Resource | |||
contains a MAC which covers the request sequence number and context | CBOR Mappings Registry". The registry is to be created as Expert | |||
identifier as well as the Code which allows the Client to verify that | Review Required. | |||
this actuator command was well received (door is locked). | ||||
6.4. Always-On Connectivity | 10.7.1. Registration Template | |||
A popular deployment scenario for IoT devices is to have them always | Parameter name: | |||
be connected to the Internet so that they can be reachable to receive | OAuth Parameter name, refers to the name in the OAuth parameter | |||
commands. As a continuation from the previous scenarios we assume | registry e.g. "client_id". | |||
that both the client and the RS are online at the time of the access | CBOR key value: | |||
request. | Key value for the claim. The key value MUST be an integer in the | |||
range of 1 to 65536. | ||||
Change Controller: | ||||
For Standards Track RFCs, list the "IESG". For others, give the | ||||
name of the responsible party. Other details (e.g., postal | ||||
address, email address, home page URI) may also be included. | ||||
Specification Document(s): | ||||
Reference to the document or documents that specify the | ||||
parameter,preferably including URIs that can be used to retrieve | ||||
copies of the documents. An indication of the relevant sections | ||||
may also be included but is not required. | ||||
If the client and the resource server are online then the AS should | 10.7.2. Initial Registry Contents | |||
be configured to issue short-lived access tokens for the resource to | ||||
the client. The resource server must then validate self-contained | ||||
access tokens or otherwise must use token introspection to obtain the | ||||
up-to-date claim information. If transmission costs are high or the | ||||
channel is lossy, the CWT token format | ||||
[I-D.wahlstroem-ace-cbor-web-token] may be used instead of a JWT to | ||||
reduce the volume of network traffic. In terms of messaging this | ||||
deployment scenario uses the patterns described in the previous sub- | ||||
sections. | ||||
Note that despite the lack of connectivity constraints there may | o Parameter name: "client_id" | |||
still be other restrictions a deployment may face. | o CBOR key value: 1 | |||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
6.5. Token-less Authorization | o Parameter name: "client_secret" | |||
o CBOR key value: 2 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
In this deployment scenario we consider the case of an RS which is | o Parameter name: "response_type" | |||
severely energy constrained, sleeps most of the time and need to have | o CBOR key value: 3 | |||
a tight messaging budget. It is not only infeasible to access the AS | o Change Controller: IESG | |||
at the time of the access request, as in the "RS offline" case | o Specification Document(s): this document | |||
Section 6.2, it must be offloaded as much message communication as | ||||
possible. | ||||
OAuth 2.0 is already an efficient protocol in terms of message | o Parameter name: "redirect_uri" | |||
exchanges and can be further optimized by compact encodings of | o CBOR key value: 4 | |||
tokens. The scenario illustrated in this section goes beyond that | o Change Controller: IESG | |||
and removes the access tokens from the protocol. This may be | o Specification Document(s): this document | |||
considered a degenerate case of OAuth 2.0 but it allows us to do two | ||||
things: | ||||
1. The common case where authorization is performed by means of | o Parameter name: "scope" | |||
authentication fits into the same protocol framework. | o CBOR key value: 5 | |||
Authentication protocol and key is specified by client | o Change Controller: IESG | |||
information, and access token is omitted. | o Specification Document(s): this document | |||
2. Authentication, and thereby authorization, may even be implicit, | o Parameter name: "state" | |||
i.e. anyone with access to the right key is authorized to access | o CBOR key value: 6 | |||
the protected resource. | o Change Controller: IESG | |||
o Specification Document(s): this document | ||||
In case 2., the RS does not need to receive any message from the | o Parameter name: "code" | |||
client, and therefore enables offloading recurring resource request | o CBOR key value: 7 | |||
and response processing to a third party, such as a Message Broker | o Change Controller: IESG | |||
(MB) in a publish-subscribe setting. | o Specification Document(s): this document | |||
This scenario involves steps A, B, C and F of Figure 1 and four | o Parameter name: "error_description" | |||
parties: a client (subscriber), an offline RS (publisher), a trusted | o CBOR key value: 8 | |||
AS, and a MB, not necessarily trusted with access to the plain text | o Change Controller: IESG | |||
publications. Message exchange A, B is shown in Figure 24. | o Specification Document(s): this document | |||
A: The client sends the request POST to /token at AS. The request | o Parameter name: "error_uri" | |||
contains the Audience parameter set to "birchPollenSensor301", a | o CBOR key value: 9 | |||
value that characterizes a certain pollen sensor resource. The AS | o Change Controller: IESG | |||
evaluates the request and authorizes the client to access the | o Specification Document(s): this document | |||
resource. | ||||
B: The AS responds with an empty token and client information with | o Parameter name: "grant_type" | |||
a security context to be used by the client. The empty token | o CBOR key value: 10 | |||
signifies that authorization is performed by means of | o Change Controller: IESG | |||
authentication using the communication security protocol indicated | o Specification Document(s): this document | |||
with "csp". In this case it is object security of content (OSCON) | ||||
i.e. protection of CoAP payload only. The security context | ||||
contains the symmetric decryption key and a public signature | ||||
verification key of the RS. | ||||
Authorization | o Parameter name: "access_token" | |||
Client Server | o CBOR key value: 11 | |||
| | | o Change Controller: IESG | |||
| | | o Specification Document(s): this document | |||
A: +-------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path:"token" | ||||
| | Payload: <Request-Payload> | ||||
| | | ||||
B: |<--------+ Header: 2.05 Content | ||||
| | Content-Type: application/cbor | ||||
| 2.05 | Payload: <Response-Payload> | ||||
| | | ||||
| | | ||||
Figure 24: Token Request and Response | o Parameter name: "token_type" | |||
o CBOR key value: 12 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
The information contained in the Request-Payload and the Response- | o Parameter name: "expires_in" | |||
Payload is shown in Figure 25. | o CBOR key value: 13 | |||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
Request-Payload : | o Parameter name: "username" | |||
{ | o CBOR key value: 14 | |||
"grant_type" : "client_credentials", | o Change Controller: IESG | |||
"aud" : "birchPollenSensor301", | o Specification Document(s): this document | |||
"client_id" : "myclient", | ||||
"client_secret" : "qwerty" | ||||
} | ||||
Response-Payload : | o Parameter name: "password" | |||
{ | o CBOR key value: 15 | |||
"access_token" : NULL, | o Change Controller: IESG | |||
"token_type" : "none", | o Specification Document(s): this document | |||
"csp" : "OSCON", | ||||
"key" : b64'eyJhbGciOiJSU0ExXzUi ...' | ||||
} | ||||
Figure 25: Request and Response Payload for RS severely constrained | o Parameter name: "refresh_token" | |||
o CBOR key value: 16 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
The content of the "key" parameter is shown in Figure 26. | o Parameter name: "alg" | |||
o CBOR key value: 17 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
key : | o Parameter name: "cnf" | |||
{ | o CBOR key value: 18 | |||
"alg" : "AES_128_CTR_ECDSA", | o Change Controller: IESG | |||
"kid" : b64'c29tZSBvdGhlciBrZXkgaWQ'; | o Specification Document(s): this document | |||
"k" : b64'ZoRSOrFzN_FzUA5XKMYoVHyzff5oRJxl-IXRtztJ6uE', | ||||
"crv" : "P-256", | ||||
"x" : b64'MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4', | ||||
"y" : b64'4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM' | ||||
} | ||||
Figure 26: The 'key' Parameter | o Parameter name: "aud" | |||
o CBOR key value: 19 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
The RS, which sleeps most of the time, occasionally wakes up, | o Parameter name: "profile" | |||
measures the number birch pollens per cubic meters, publishes the | o CBOR key value: 20 | |||
measurements to the MB, and then returns to sleep. See Figure 27. | o Change Controller: IESG | |||
o Specification Document(s): this document | ||||
In this case the birch pollen count stopped at 270, which is | 10.8. Introspection Resource CBOR Mappings Registry | |||
encrypted with the symmetric key and signed with the private key of | ||||
the RS. The MB verifies that the message originates from RS using | ||||
the public key of RS, that it is not a replay of an old measurement | ||||
using the sequence number of the OSCON COSE profile, and caches the | ||||
object secured content. The MB does not have the secret key so is | ||||
unable to read the plain text measurement. | ||||
Message exchanges C and F are shown in Figure 27. | A new registry will be requested from IANA, entitled "Introspection | |||
Resource CBOR Mappings Registry". The registry is to be created as | ||||
Expert Review Required. | ||||
C: Since there is no access token, the client does not address the | 10.8.1. Registration Template | |||
/authz-info resource in the RS. The client sends the CoAP request | ||||
GET to /birchPollen on MB which is a plain CoAP request. | ||||
F: The MB responds with the cached object secured content. | Response parameter name: | |||
Name of the response parameter as defined in the "OAuth Token | ||||
Introspection Response" registry e.g. "active". | ||||
CBOR key value: | ||||
Key value for the claim. The key value MUST be an integer in the | ||||
range of 1 to 65536. | ||||
Change Controller: | ||||
For Standards Track RFCs, list the "IESG". For others, give the | ||||
name of the responsible party. Other details (e.g., postal | ||||
address, email address, home page URI) may also be included. | ||||
Specification Document(s): | ||||
Reference to the document or documents that specify the | ||||
parameter,preferably including URIs that can be used to retrieve | ||||
copies of the documents. An indication of the relevant sections | ||||
may also be included but is not required. | ||||
Message Resource | 10.8.2. Initial Registry Contents | |||
Client Broker Server | ||||
| | | | ||||
| |<--------| Header: PUT (Code=0.02) | ||||
| | PUT | Uri-Path: "birchPollen" | ||||
| | | Payload: (<seq>,<cid>,["270"],<tag>) | ||||
| | | | ||||
| |-------->| Header: 2.04 Changed | ||||
| | 2.04 | | ||||
| | | ||||
| | | ||||
C: +-------->| Header: GET (Code=0.01) | ||||
| GET | Uri-Path: "birchPollen" | ||||
| | | ||||
| | | ||||
F: |<--------+ Header: 2.05 Content | ||||
| 2.05 | Payload: (<seq>,<cid>,["270"],<tag>) | ||||
| | | ||||
Figure 27: Sensor measurement protected by COSE | o Response parameter name: "active" | |||
o CBOR key value: 1 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
The payload is a COSE message consisting of sequence number 'seq' | o Response parameter name: "username" | |||
stepped by the RS for each publication, the context identifier 'cid' | o CBOR key value: 2 | |||
in this case coinciding with the key identifier 'kid' of Figure 26, | o Change Controller: IESG | |||
the encrypted measurement and the signature by the RS. | o Specification Document(s): this document | |||
Note that the same COSE message format may be used as in OSCOAP but | o Response parameter name: "client_id" | |||
that only CoAP payload is protected in this case. | o CBOR key value: 3 | |||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
The authorization step is implicit, so while any client could request | o Response parameter name: "scope" | |||
access the COSE object, only authorized clients have access to the | o CBOR key value: 4 | |||
symmetric key needed to decrypt the content. | o Change Controller: IESG | |||
o Specification Document(s): this document | ||||
Note that in this case the order of the message exchanges A,B and C,F | o Response parameter name: "token_type" | |||
could in principle be interchanged, i.e. the client could first | o CBOR key value: 5 | |||
request and obtain the protected resource in steps C,F; and after | o Change Controller: IESG | |||
that request client information containing the keys decrypt and | o Specification Document(s): this document | |||
verify the message. | ||||
6.6. Securing Group Communication | o Response parameter name: "exp" | |||
o CBOR key value: 6 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
There are use cases that require securing communication between a | o Response parameter name: "iat" | |||
(group of) senders and a group of receivers. One prominent example | o CBOR key value: 7 | |||
is lighting. Often, a set of lighting nodes (e.g., luminaires, wall- | o Change Controller: IESG | |||
switches, sensors) are grouped together and only authorized members | o Specification Document(s): this document | |||
of the group must be able read and process messages. Additionally, | ||||
receivers of group messages must be able to verify the integrity of | ||||
received messages as being generated within the group. | ||||
The requirements for securely communicating in such group use cases | o Response parameter name: "nbf" | |||
efficiently is outlined in [I-D.somaraju-ace-multicast] along with an | o CBOR key value: 8 | |||
architectural description that aligns with the content of this | o Change Controller: IESG | |||
document. The requirements for conveying the necessary identifiers | o Specification Document(s): this document | |||
to reference groups and also the process of commissioning devices can | ||||
be accomplished using the protocol described in this document. For | ||||
details about the lighting-unique use case aspects, the architecture, | ||||
as well as other multicast-specific considerations we refer the | ||||
reader to [I-D.somaraju-ace-multicast]. | ||||
7. Security Considerations | o Response parameter name: "sub" | |||
o CBOR key value: 9 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
The entire document is about security. Security considerations | o Response parameter name: "aud" | |||
applicable to authentication and authorization in RESTful | o CBOR key value: 10 | |||
environments provided in OAuth 2.0 [RFC6749] apply to this work, as | o Change Controller: IESG | |||
well as the security considerations from [I-D.ietf-ace-actors]. | o Specification Document(s): this document | |||
Furthermore [RFC6819] provides additional security considerations for | ||||
OAuth which apply to IoT deployments as well. Finally | ||||
[I-D.ietf-oauth-pop-architecture] discusses security and privacy | ||||
threats as well as mitigation measures for Proof-of-Possession | ||||
tokens. | ||||
8. IANA Considerations | o Response parameter name: "iss" | |||
o CBOR key value: 11 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
TBD | o Response parameter name: "jti" | |||
o CBOR key value: 12 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
FIXME: Add registry over 'csp' values from Figure 2 | o Parameter name: "alg" | |||
o CBOR key value: 13 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
FIXME: Add registry of 'rpk' parameter from section 5.1 | o Parameter name: "cnf" | |||
o CBOR key value: 14 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
FIXME: Add registry of 'tktn' values from Figure 3 | o Parameter name: "aud" | |||
o CBOR key value: 15 | ||||
o Change Controller: IESG | ||||
o Specification Document(s): this document | ||||
8.1. CoAP Option Number Registration | 10.9. CoAP Option Number Registration | |||
This section registers the "Access-Token" CoAP Option Number | This section registers the "Access-Token" CoAP Option Number in the | |||
[RFC2046] in "CoRE Parameters" sub-registry "CoAP Option Numbers" in | "CoRE Parameters" sub-registry "CoAP Option Numbers" in the manner | |||
the manner described in [RFC7252]. | described in [RFC7252]. | |||
Name | Name | |||
Access-Token | Access-Token | |||
Number | Number | |||
TBD | TBD | |||
Reference | Reference | |||
[draft-ietf-ace-oauth-authz] | [This document]. | |||
Meaning in Request | Meaning in Request | |||
Contains an Access Token according to [draft-ietf-ace-oauth-authz] | Contains an Access Token according to [This document] containing | |||
containing access permissions of the client. | access permissions of the client. | |||
Meaning in Response | Meaning in Response | |||
Not used in response | Not used in response | |||
Safe-to-Forward | Safe-to-Forward | |||
TBD | TBD | |||
Format | Format | |||
Based on the observer the format is perseved differently. Opaque | Based on the observer the format is perceived differently. Opaque | |||
data to the client and CWT or reference token to the RS. | data to the client and CWT or reference token to the RS. | |||
Length | Length | |||
Less then 255 bytes | Less then 255 bytes | |||
9. Acknowledgments | 11. Acknowledgments | |||
We would like to thank Eve Maler for her contributions to the use of | We would like to thank Eve Maler for her contributions to the use of | |||
OAuth 2.0 and UMA in IoT scenarios, Robert Taylor for his discussion | OAuth 2.0 and UMA in IoT scenarios, Robert Taylor for his discussion | |||
input, and Malisa Vucinic for his input on the ACRE proposal | input, and Malisa Vucinic for his input on the ACRE proposal | |||
[I-D.seitz-ace-core-authz] which was one source of inspiration for | [I-D.seitz-ace-core-authz] which was one source of inspiration for | |||
this work. Finally, we would like to thank the ACE working group in | this work. Finally, we would like to thank the ACE working group in | |||
general for their feedback. | general for their feedback. | |||
10. References | Ludwig Seitz and Goeran Selander worked on this document as part of | |||
the CelticPlus project CyberWI, with funding from Vinnova. | ||||
10.1. Normative References | 12. References | |||
[I-D.bormann-core-ace-aif] | 12.1. Normative References | |||
Bormann, C., "An Authorization Information Format (AIF) | ||||
for ACE", draft-bormann-core-ace-aif-03 (work in | [I-D.ietf-ace-cbor-web-token] | |||
progress), July 2015. | Wahlstroem, E., Jones, M., and H. Tschofenig, "CBOR Web | |||
Token (CWT)", draft-ietf-ace-cbor-web-token-00 (work in | ||||
progress), May 2016. | ||||
[I-D.ietf-cose-msg] | [I-D.ietf-cose-msg] | |||
Schaad, J., "CBOR Encoded Message Syntax", draft-ietf- | Schaad, J., "CBOR Encoded Message Syntax", draft-ietf- | |||
cose-msg-10 (work in progress), February 2016. | cose-msg-12 (work in progress), May 2016. | |||
[I-D.ietf-oauth-introspection] | ||||
Richer, J., "OAuth 2.0 Token Introspection", draft-ietf- | ||||
oauth-introspection-11 (work in progress), July 2015. | ||||
[I-D.ietf-oauth-pop-architecture] | ||||
Hunt, P., Richer, J., Mills, W., Mishra, P., and H. | ||||
Tschofenig, "OAuth 2.0 Proof-of-Possession (PoP) Security | ||||
Architecture", draft-ietf-oauth-pop-architecture-07 (work | ||||
in progress), December 2015. | ||||
[I-D.ietf-oauth-pop-key-distribution] | ||||
Bradley, J., Hunt, P., Jones, M., and H. Tschofenig, | ||||
"OAuth 2.0 Proof-of-Possession: Authorization Server to | ||||
Client Key Distribution", draft-ietf-oauth-pop-key- | ||||
distribution-02 (work in progress), October 2015. | ||||
[I-D.selander-ace-object-security] | [I-D.selander-ace-object-security] | |||
Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | |||
"Object Security of CoAP (OSCOAP)", draft-selander-ace- | "Object Security of CoAP (OSCOAP)", draft-selander-ace- | |||
object-security-03 (work in progress), October 2015. | object-security-04 (work in progress), March 2016. | |||
[I-D.wahlstroem-ace-cbor-web-token] | ||||
Wahlstroem, E., Jones, M., and H. Tschofenig, "CBOR Web | ||||
Token (CWT)", draft-wahlstroem-ace-cbor-web-token-00 (work | ||||
in progress), December 2015. | ||||
[I-D.wahlstroem-ace-oauth-introspection] | ||||
Wahlstroem, E., "OAuth 2.0 Introspection over the | ||||
Constrained Application Protocol (CoAP)", draft- | ||||
wahlstroem-ace-oauth-introspection-01 (work in progress), | ||||
March 2015. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<http://www.rfc-editor.org/info/rfc2119>. | <http://www.rfc-editor.org/info/rfc2119>. | |||
[RFC4279] Eronen, P., Ed. and H. Tschofenig, Ed., "Pre-Shared Key | ||||
Ciphersuites for Transport Layer Security (TLS)", | ||||
RFC 4279, DOI 10.17487/RFC4279, December 2005, | ||||
<http://www.rfc-editor.org/info/rfc4279>. | ||||
[RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer | [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer | |||
Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, | Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, | |||
January 2012, <http://www.rfc-editor.org/info/rfc6347>. | January 2012, <http://www.rfc-editor.org/info/rfc6347>. | |||
[RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | |||
Application Protocol (CoAP)", RFC 7252, | Application Protocol (CoAP)", RFC 7252, | |||
DOI 10.17487/RFC7252, June 2014, | DOI 10.17487/RFC7252, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7252>. | <http://www.rfc-editor.org/info/rfc7252>. | |||
[RFC7516] Jones, M. and J. Hildebrand, "JSON Web Encryption (JWE)", | [RFC7662] Richer, J., Ed., "OAuth 2.0 Token Introspection", | |||
RFC 7516, DOI 10.17487/RFC7516, May 2015, | RFC 7662, DOI 10.17487/RFC7662, October 2015, | |||
<http://www.rfc-editor.org/info/rfc7516>. | <http://www.rfc-editor.org/info/rfc7662>. | |||
[RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517, | [RFC7800] Jones, M., Bradley, J., and H. Tschofenig, "Proof-of- | |||
DOI 10.17487/RFC7517, May 2015, | Possession Key Semantics for JSON Web Tokens (JWTs)", | |||
<http://www.rfc-editor.org/info/rfc7517>. | RFC 7800, DOI 10.17487/RFC7800, April 2016, | |||
<http://www.rfc-editor.org/info/rfc7800>. | ||||
10.2. Informative References | 12.2. Informative References | |||
[I-D.ietf-ace-actors] | [I-D.ietf-ace-actors] | |||
Gerdes, S., Seitz, L., Selander, G., and C. Bormann, "An | Gerdes, S., Seitz, L., Selander, G., and C. Bormann, "An | |||
architecture for authorization in constrained | architecture for authorization in constrained | |||
environments", draft-ietf-ace-actors-02 (work in | environments", draft-ietf-ace-actors-03 (work in | |||
progress), October 2015. | progress), March 2016. | |||
[I-D.ietf-core-block] | [I-D.ietf-core-block] | |||
Bormann, C. and Z. Shelby, "Block-wise transfers in CoAP", | Bormann, C. and Z. Shelby, "Block-wise transfers in CoAP", | |||
draft-ietf-core-block-18 (work in progress), September | draft-ietf-core-block-20 (work in progress), April 2016. | |||
2015. | ||||
[I-D.ietf-oauth-pop-architecture] | ||||
Hunt, P., Richer, J., Mills, W., Mishra, P., and H. | ||||
Tschofenig, "OAuth 2.0 Proof-of-Possession (PoP) Security | ||||
Architecture", draft-ietf-oauth-pop-architecture-07 (work | ||||
in progress), December 2015. | ||||
[I-D.seitz-ace-core-authz] | [I-D.seitz-ace-core-authz] | |||
Seitz, L., Selander, G., and M. Vucinic, "Authorization | Seitz, L., Selander, G., and M. Vucinic, "Authorization | |||
for Constrained RESTful Environments", draft-seitz-ace- | for Constrained RESTful Environments", draft-seitz-ace- | |||
core-authz-00 (work in progress), June 2015. | core-authz-00 (work in progress), June 2015. | |||
[I-D.somaraju-ace-multicast] | ||||
Somaraju, A., Kumar, S., Tschofenig, H., and W. Werner, | ||||
"Security for Low-Latency Group Communication", draft- | ||||
somaraju-ace-multicast-01 (work in progress), January | ||||
2016. | ||||
[RFC4680] Santesson, S., "TLS Handshake Message for Supplemental | ||||
Data", RFC 4680, DOI 10.17487/RFC4680, October 2006, | ||||
<http://www.rfc-editor.org/info/rfc4680>. | ||||
[RFC4949] Shirey, R., "Internet Security Glossary, Version 2", | [RFC4949] Shirey, R., "Internet Security Glossary, Version 2", | |||
FYI 36, RFC 4949, DOI 10.17487/RFC4949, August 2007, | FYI 36, RFC 4949, DOI 10.17487/RFC4949, August 2007, | |||
<http://www.rfc-editor.org/info/rfc4949>. | <http://www.rfc-editor.org/info/rfc4949>. | |||
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
(TLS) Protocol Version 1.2", RFC 5246, | (TLS) Protocol Version 1.2", RFC 5246, | |||
DOI 10.17487/RFC5246, August 2008, | DOI 10.17487/RFC5246, August 2008, | |||
<http://www.rfc-editor.org/info/rfc5246>. | <http://www.rfc-editor.org/info/rfc5246>. | |||
[RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link | [RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link | |||
Format", RFC 6690, DOI 10.17487/RFC6690, August 2012, | Format", RFC 6690, DOI 10.17487/RFC6690, August 2012, | |||
<http://www.rfc-editor.org/info/rfc6690>. | <http://www.rfc-editor.org/info/rfc6690>. | |||
[RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", | [RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", | |||
RFC 6749, DOI 10.17487/RFC6749, October 2012, | RFC 6749, DOI 10.17487/RFC6749, October 2012, | |||
<http://www.rfc-editor.org/info/rfc6749>. | <http://www.rfc-editor.org/info/rfc6749>. | |||
[RFC6750] Jones, M. and D. Hardt, "The OAuth 2.0 Authorization | ||||
Framework: Bearer Token Usage", RFC 6750, | ||||
DOI 10.17487/RFC6750, October 2012, | ||||
<http://www.rfc-editor.org/info/rfc6750>. | ||||
[RFC6819] Lodderstedt, T., Ed., McGloin, M., and P. Hunt, "OAuth 2.0 | [RFC6819] Lodderstedt, T., Ed., McGloin, M., and P. Hunt, "OAuth 2.0 | |||
Threat Model and Security Considerations", RFC 6819, | Threat Model and Security Considerations", RFC 6819, | |||
DOI 10.17487/RFC6819, January 2013, | DOI 10.17487/RFC6819, January 2013, | |||
<http://www.rfc-editor.org/info/rfc6819>. | <http://www.rfc-editor.org/info/rfc6819>. | |||
[RFC7049] Bormann, C. and P. Hoffman, "Concise Binary Object | [RFC7049] Bormann, C. and P. Hoffman, "Concise Binary Object | |||
Representation (CBOR)", RFC 7049, DOI 10.17487/RFC7049, | Representation (CBOR)", RFC 7049, DOI 10.17487/RFC7049, | |||
October 2013, <http://www.rfc-editor.org/info/rfc7049>. | October 2013, <http://www.rfc-editor.org/info/rfc7049>. | |||
[RFC7159] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | [RFC7159] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | |||
skipping to change at page 40, line 5 ¶ | skipping to change at page 40, line 19 ¶ | |||
[RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7231>. | <http://www.rfc-editor.org/info/rfc7231>. | |||
[RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | |||
(JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, | (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, | |||
<http://www.rfc-editor.org/info/rfc7519>. | <http://www.rfc-editor.org/info/rfc7519>. | |||
[RFC7591] Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and | ||||
P. Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", | ||||
RFC 7591, DOI 10.17487/RFC7591, July 2015, | ||||
<http://www.rfc-editor.org/info/rfc7591>. | ||||
[RFC7744] Seitz, L., Ed., Gerdes, S., Ed., Selander, G., Mani, M., | ||||
and S. Kumar, "Use Cases for Authentication and | ||||
Authorization in Constrained Environments", RFC 7744, | ||||
DOI 10.17487/RFC7744, January 2016, | ||||
<http://www.rfc-editor.org/info/rfc7744>. | ||||
Appendix A. Design Justification | Appendix A. Design Justification | |||
This section provides further insight into the design decisions of | This section provides further insight into the design decisions of | |||
the solution documented in this document. Section 3 lists several | the solution documented in this document. Section 3 lists several | |||
building blocks and briefly summarizes their importance. The | building blocks and briefly summarizes their importance. The | |||
justification for offering some of those building blocks, as opposed | justification for offering some of those building blocks, as opposed | |||
to using OAuth 2.0 as is, is given below. | to using OAuth 2.0 as is, is given below. | |||
Common IoT constraints are: | Common IoT constraints are: | |||
skipping to change at page 41, line 40 ¶ | skipping to change at page 42, line 17 ¶ | |||
The communication interactions this framework builds upon (as | The communication interactions this framework builds upon (as | |||
shown graphically in Figure 1) may be accomplished using a variety | shown graphically in Figure 1) may be accomplished using a variety | |||
of different protocols, and not all parts of the message flow are | of different protocols, and not all parts of the message flow are | |||
used in all applications due to the communication constraints. | used in all applications due to the communication constraints. | |||
While we envision deployments to make use of CoAP we explicitly | While we envision deployments to make use of CoAP we explicitly | |||
want to support HTTP, HTTP/2 or specific protocols, such as | want to support HTTP, HTTP/2 or specific protocols, such as | |||
Bluetooth Smart communication, which does not necessarily use IP. | Bluetooth Smart communication, which does not necessarily use IP. | |||
The latter raises the need for application layer security over the | The latter raises the need for application layer security over the | |||
various interfaces. | various interfaces. | |||
Appendix B. Roles and Responsibilites -- a Checklist | Appendix B. Roles and Responsibilites | |||
Resource Owner | Resource Owner | |||
* Make sure that the RS is registered at the AS. | * Make sure that the RS is registered at the AS. | |||
* Make sure that clients can discover the AS which is in charge | * Make sure that clients can discover the AS which is in charge | |||
of the RS. | of the RS. | |||
* Make sure that the AS has the necessary, up-to-date, access | * Make sure that the AS has the necessary, up-to-date, access | |||
control policies for the RS. | control policies for the RS. | |||
Requesting Party | Requesting Party | |||
* Make sure that the client is provisioned the necessary | * Make sure that the client is provisioned the necessary | |||
credentials to authenticate to the AS. | credentials to authenticate to the AS. | |||
* Make sure that the client is configured to follow the security | * Make sure that the client is configured to follow the security | |||
requirements of the Requesting Party, when issuing requests | requirements of the Requesting Party, when issuing requests | |||
(e.g. minimum communication security requirements, trust | (e.g. minimum communication security requirements, trust | |||
anchors). | anchors). | |||
* Register the client at the AS. | * Register the client at the AS. | |||
Authorization Server | Authorization Server | |||
* Register RS and manage corresponding security contexts. | * Register RS and manage corresponding security contexts. | |||
* Register clients and including authentication credentials. | * Register clients and including authentication credentials. | |||
* Allow Resource Owners to configure and update access control | ||||
* Allow Resource Onwers to configure and update access control | ||||
policies related to their registered RS' | policies related to their registered RS' | |||
* Expose a service that allows clients to request tokens. | * Expose a service that allows clients to request tokens. | |||
* Authenticate clients that wishes to request a token. | * Authenticate clients that wishes to request a token. | |||
* Process a token requests against the authorization policies | * Process a token requests against the authorization policies | |||
configured for the RS. | configured for the RS. | |||
* Expose a service that allows RS's to submit token introspection | * Expose a service that allows RS's to submit token introspection | |||
requests. | requests. | |||
* Authenticate RS's that wishes to get an introspection response. | * Authenticate RS's that wishes to get an introspection response. | |||
* Process token introspection requests. | * Process token introspection requests. | |||
* Optionally: Handle token revocation. | * Optionally: Handle token revocation. | |||
Client | Client | |||
* Discover the AS in charge of the RS that is to be targeted with | * Discover the AS in charge of the RS that is to be targeted with | |||
a request. | a request. | |||
* Submit the token request (A). | * Submit the token request (A). | |||
+ Authenticate towards the AS. | + Authenticate towards the AS. | |||
+ Specify which RS, which resource(s), and which action(s) the | + Specify which RS, which resource(s), and which action(s) the | |||
request(s) will target. | request(s) will target. | |||
+ Specify preferences for communication security | + Specify preferences for communication security | |||
+ If raw public key (rpk) or certificate is used, make sure | + If raw public key (rpk) or certificate is used, make sure | |||
the AS has the right rpk or certificate for this client. | the AS has the right rpk or certificate for this client. | |||
* Process the access token and client information (B) | * Process the access token and client information (B) | |||
+ Check that the token has the right format (e.g. CWT). | + Check that the token has the right format (e.g. CWT). | |||
+ Check that the client information provides the necessary | + Check that the client information provides the necessary | |||
security parameters (e.g. PoP key, information on | security parameters (e.g. PoP key, information on | |||
communication security protocols supported by the RS). | communication security protocols supported by the RS). | |||
* Send the token and request to the RS (C) | * Send the token and request to the RS (C) | |||
+ Authenticate towards the RS (this could coincide with the | + Authenticate towards the RS (this could coincide with the | |||
proof of possession process). | proof of possession process). | |||
+ Transmit the token as specified by the AS (default is to an | + Transmit the token as specified by the AS (default is to an | |||
authorization information resource, alternative options are | authorization information resource, alternative options are | |||
as a CoAP option or in the DTLS handshake). | as a CoAP option or in the DTLS handshake). | |||
+ Perform the proof-of-possession procedure as specified for | + Perform the proof-of-possession procedure as specified for | |||
the type of used token (this may already have been taken | the type of used token (this may already have been taken | |||
care of through the authentication procedure). | care of through the authentication procedure). | |||
* Process the RS response (F) requirements of the Requesting | * Process the RS response (F) requirements of the Requesting | |||
Party, when issuing requests (e.g. minimum communication | Party, when issuing requests (e.g. minimum communication | |||
security requirements, trust anchors). | security requirements, trust anchors). | |||
* Register the client at the AS. | * Register the client at the AS. | |||
Resource Server | Resource Server | |||
* Expose a way to submit access tokens. | * Expose a way to submit access tokens. | |||
* Process an access token. | * Process an access token. | |||
+ Verify the token is from the right AS. | + Verify the token is from the right AS. | |||
+ Verify that the token applies to this RS. | + Verify that the token applies to this RS. | |||
+ Check that the token has not expired (if the token provides | + Check that the token has not expired (if the token provides | |||
expiration information). | expiration information). | |||
+ Check the token's integrity. | + Check the token's integrity. | |||
+ Store the token so that it can be retrieved in the context | + Store the token so that it can be retrieved in the context | |||
of a matching request. | of a matching request. | |||
* Process a request. | * Process a request. | |||
+ Set up communication security with the client. | + Set up communication security with the client. | |||
+ Authenticate the client. | + Authenticate the client. | |||
+ Match the client against existing tokens. | + Match the client against existing tokens. | |||
+ Check that tokens belonging to the client actually authorize | + Check that tokens belonging to the client actually authorize | |||
the requested action. | the requested action. | |||
+ Optionally: Check that the matching tokens are still valid | + Optionally: Check that the matching tokens are still valid | |||
(if this is possible. | (if this is possible. | |||
* Send a response following the agreed upon communication | * Send a response following the agreed upon communication | |||
security. | security. | |||
Appendix C. Optimizations | Appendix C. Deployment Examples | |||
This section sketches some potential optimizations to the presented | There is a large variety of IoT deployments, as is indicated in | |||
solution. | Appendix A, and this section highlights a few common variants. This | |||
section is not normative but illustrates how the framework can be | ||||
applied. | ||||
Access token in DTLS handshake | For each of the deployment variants there are a number of possible | |||
security setups between clients, resource servers and authorization | ||||
servers. The main focus in the following subsections is on how | ||||
authorization of a client request for a resource hosted by a RS is | ||||
performed. This requires the the security of the requests and | ||||
responses between the clients and the RS to consider. | ||||
In the case of CSP=DTLS/TLS, the access token provisioning | Note: CBOR diagnostic notation is used for examples of requests and | |||
exchange in step C of the protocol may be embedded in the security | responses. | |||
handshake. Different solutions are possible, where one | ||||
standardized method would be the use of the TLS supplemental data | ||||
extension [RFC4680] for transferring the access token. | ||||
Reference token and introspection | C.1. Local Token Validation | |||
In case of introspection it may be beneficial to utilize access | In this scenario we consider the case where the resource server is | |||
tokens which are not self-contained (also known as "reference | offline, i.e. it is not connected to the AS at the time of the access | |||
tokens") that are used to lookup detailed information about the | request. This access procedure involves steps A, B, C, and F of | |||
authorization. The RS uses the introspection message exchange not | Figure 1. | |||
only for validating token claims, but also for obtaining claims | ||||
that potentially were not known at the time when the access token | ||||
was issued. | ||||
A reference token can be made much more compact than a self- | Since the resource server must be able to verify the access token | |||
contained token, since it does not need to contain any of claims | locally, self-contained access tokens must be used. | |||
that it represents. This could be very useful in particular if | ||||
the client is constrained and offline most of the time. | ||||
Reference token in CoAP option | This example shows the interactions between a client, the | |||
authorization server and a temperature sensor acting as a resource | ||||
server. Message exchanges A and B are shown in Figure 17. | ||||
While large access tokens must be sent in CoAP payload, if the | A: The client first generates a public-private key pair used for | |||
access token is known to be of a certain limited size, for example | communication security with the RS. | |||
in the case of a reference token, then it would be favorable to | The client sends the POST request to /token at the AS. The | |||
combine the access token provisioning request with the resource | request contains the public key of the client and the Audience | |||
request to the RS. | parameter set to "tempSensorInLivingRoom", a value that the | |||
temperature sensor identifies itself with. The AS evaluates the | ||||
request and authorizes the client to access the resource. | ||||
One way to achieve this is to define a new CoAP option for | B: The AS responds with a PoP token and client information. The | |||
carrying reference tokens, called "Ref-Token" as shown in the | PoP token contains the public key of the client, and the client | |||
example in Figure 28. | information contains the public key of the RS. For communication | |||
security this example uses DTLS RawPublicKey between the client | ||||
and the RS. The issued token will have a short validity time, | ||||
i.e. 'exp' close to 'iat', to protect the RS from replay attacks | ||||
since it, that cannot do introspection to check the tokens current | ||||
validity. The token includes the claim "aif" with the authorized | ||||
access that an owner of the temperature device can enjoy. The | ||||
'aif' claim, issued by the AS, informs the RS that the owner of | ||||
the token, that can prove the possession of a key is authorized to | ||||
make a GET request against the /temperature resource and a POST | ||||
request on the /firmware resource. | ||||
Note: In this example we assume that the client knows what | ||||
resource it wants to access, and is therefore able to request | ||||
specific audience and scope claims for the access token. | ||||
Resource | Authorization | |||
Client Server | Client Server | |||
| | | | | | |||
C: +-------->| Header: PUT (Code=0.02) | ||||
| PUT | Ref-Token:SlAV32hkKG | ||||
| | Object-Security: | ||||
| | <seq>,<cid>,[Uri-Path:"lock", 1],<tag>) | ||||
| | | | | | |||
. . | A: +-------->| Header: POST (Code=0.02) | |||
. . | | POST | Uri-Path:"token" | |||
. . | | | Content-Type: application/cbor | |||
| | Payload: <Request-Payload> | ||||
| | | | | | |||
F: |<--------+ Header: 2.04 Changed | B: |<--------+ Header: 2.05 Content | |||
| 2.04 | Object-Security: | | 2.05 | Content-Type: application/cbor | |||
| | (<seq>,<cid>,,<tag>) | | | Payload: <Response-Payload> | |||
| | | | | | |||
Figure 28: Reference Token in CoAP Option | Figure 17: Token Request and Response Using Client Credentials. | |||
Appendix D. CoAP and CBOR profiles for OAuth 2.0 | ||||
Many IoT devices can support OAuth 2.0 without any additional | ||||
extensions, but for certain constrained settings additional profiling | ||||
is needed. In this appendix we define CoAP resources for the HTTP | ||||
based token and introspection endpoints used in vanilla OAuth 2.0. | ||||
We also define a CBOR alternative to the JSON and form based POST | ||||
structures used in HTTP. | ||||
D.1. Profile for Token resource | ||||
The token resource is used by the client to obtain an access token by | ||||
presenting its authorization grant or client credentials to the | ||||
/token resource the AS. | ||||
D.1.1. Token Request | ||||
The client makes a request to the token resource by sending a CBOR | ||||
structure with the following attributes. | ||||
grant_type: | ||||
REQUIRED. The grant type, "code", "client_credentials", | ||||
"password" or others. | ||||
client_id: | ||||
OPTIONAL. The client identifier issued to the holder of the token | ||||
(client or RS) during the registration process. | ||||
client_secret: | ||||
OPTIONAL. The client secret. | ||||
scope: | ||||
OPTIONAL. The scope of the access request as described by | ||||
Section 3.1. | ||||
aud: | ||||
OPTIONAL. Service-specific string identifier or list of string | ||||
identifiers representing the intended audience for this token, as | ||||
defined in [I-D.wahlstroem-ace-cbor-web-token]. | ||||
alg: | ||||
OPTIONAL. The value in the 'alg' parameter together with value | ||||
from the 'token_type' parameter allow the client to indicate the | ||||
supported algorithms for a given token type. | ||||
key: | ||||
OPTIONAL. This field contains information about the public key | ||||
the client would like to bind to the access token in the COSE Key | ||||
Structure format. | ||||
The parameters defined above use the following CBOR major types. | ||||
/-----------+--------------+-----------------------\ | ||||
| Value | Major Type | Key | | ||||
|-----------+--------------+-----------------------| | ||||
| 0 | 0 | grant_type | | ||||
| 1 | 0 | client_id | | ||||
| 2 | 0 | client_secret | | ||||
| 3 | 0 | scope | | ||||
| 4 | 0 | aud | | ||||
| 5 | 0 | alg | | ||||
| 6 | 0 | key | | ||||
\-----------+--------------+-----------------------/ | ||||
Figure 29: CBOR mappings used in token requests | ||||
D.1.2. Token Response | ||||
The AS responds by sending a CBOR structure with the following | ||||
attributes. | ||||
access_token: | ||||
REQUIRED. The access token issued by the authorization server. | ||||
token_type: | ||||
REQUIRED. The type of the token issued. "pop" is recommended. | ||||
key: | ||||
REQUIRED, if symmetric key cryptography is used. A COSE Key | ||||
Structure containing the symmetric proof of possession key. The | ||||
members of the structure can be found in section 7.1 of | ||||
[I-D.ietf-cose-msg]. | ||||
csp: | ||||
REQUIRED. Information on what communication protocol to use in | ||||
the communication between the client and the RS. Details on | ||||
possible values can be found in Section 5.1. | ||||
scope: | ||||
OPTIONAL, if identical to the scope requested by the client; | ||||
otherwise, REQUIRED. | ||||
alg: | ||||
OPTIONAL. The 'alg' parameter provides further information about | ||||
the algorithm, such as whether a symmetric or an asymmetric | ||||
crypto-system is used. | ||||
The parameters defined above use the following CBOR major types. | ||||
/-----------+--------------+-----------------------\ | ||||
| Value | Major Type | Key | | ||||
|-----------+--------------+-----------------------| | ||||
| 0 | 0 | access_token | | ||||
| 1 | 0 | token_type | | ||||
| 2 | 0 | key | | ||||
| 3 | 0 | csp | | ||||
| 4 | 0 | scope | | ||||
| 5 | 0 | alg | | ||||
\-----------+--------------+-----------------------/ | ||||
Figure 30: CBOR mappings used in token responses | ||||
D.2. CoAP Profile for OAuth Introspection | ||||
This section defines a way for a holder of access tokens, mainly | ||||
clients and RS's, to get metadata like validity status, claims and | ||||
scopes found in access token. The OAuth Token Introspection | ||||
specification [I-D.ietf-oauth-introspection] defines a way to | ||||
validate the token using HTTP POST or HTTP GET. This document reuses | ||||
the work done in the OAuth Token Introspection and defines a mapping | ||||
of the request and response to CoAP [RFC7252] to be used by | ||||
constrained devices. | ||||
D.2.1. Introspection Request | ||||
The token holder makes a request to the Introspection CoAP resource | ||||
by sending a CBOR structure with the following attributes. | ||||
token: | ||||
REQUIRED. The string value of the token. | ||||
resource_id: | ||||
OPTIONAL. A service-specific string identifying the resource that | ||||
the client doing the introspection is asking about. | ||||
client_id: | ||||
OPTIONAL. The client identifier issued to the holder of the token | The information contained in the Request-Payload and the Response- | |||
(client or RS) during the registration process. | Payload is shown in Figure 18. | |||
client_secret: | Request-Payload : | |||
{ | ||||
"grant_type" : "client_credentials", | ||||
"aud" : "tempSensorInLivingRoom", | ||||
"client_id" : "myclient", | ||||
"client_secret" : "qwerty" | ||||
} | ||||
OPTIONAL. The client secret. | Response-Payload : | |||
{ | ||||
"access_token" : b64'SlAV32hkKG ...', | ||||
"token_type" : "pop", | ||||
"csp" : "DTLS", | ||||
"cnf" : { | ||||
"COSE_Key" : { | ||||
"kid" : b64'c29tZSBwdWJsaWMga2V5IGlk', | ||||
"kty" : "EC", | ||||
"crv" : "P-256", | ||||
"x" : b64'MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4', | ||||
"y" : b64'4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM' | ||||
} | ||||
} | ||||
} | ||||
The parameters defined above use the following CBOR major types: | Figure 18: Request and Response Payload Details. | |||
/-----------+--------------+-----------------------\ | The content of the access token is shown in Figure 19. | |||
| Value | Major Type | Key | | ||||
|-----------+--------------+-----------------------| | ||||
| 0 | 0 | token | | ||||
| 1 | 0 | resource_id | | ||||
| 2 | 0 | client_id | | ||||
| 3 | 0 | client_secret | | ||||
\-----------+--------------+-----------------------/ | ||||
Figure 31: CBOR Mappings to Token Introspection Request Parameters. | { | |||
"aud" : "tempSensorInLivingRoom", | ||||
"iat" : "1360189224", | ||||
"exp" : "1360289224", | ||||
"aif" : [["/temperature", 0], ["/firmware", 2]], | ||||
"cnf" : { | ||||
"jwk" : { | ||||
"kid" : b64'1Bg8vub9tLe1gHMzV76e8', | ||||
"kty" : "EC", | ||||
"crv" : "P-256", | ||||
"x" : b64'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', | ||||
"y" : b64'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0' | ||||
} | ||||
} | ||||
} | ||||
D.2.2. Introspection Response | Figure 19: Access Token including Public Key of the Client. | |||
If the introspection request is valid and authorized, the | Messages C and F are shown in Figure 20 - Figure 21. | |||
authorization server returns a CoAP message with the response encoded | ||||
as a CBOR structure in the payload of the message. If the request | ||||
failed client authentication or is invalid, the authorization server | ||||
returns an error response using the CoAP 4.00 'Bad Request' response | ||||
code. | ||||
The JSON structure in the payload response includes the top-level | C: The client then sends the PoP token to the /authz-info resource | |||
members defined in Section 2.2 in the OAuth Token Introspection | at the RS. This is a plain CoAP request, i.e. no transport or | |||
specification [I-D.ietf-oauth-introspection]. It is RECOMMENDED to | application layer security between client and RS, since the token | |||
only return the 'active' attribute considering constrained nature of | is integrity protected between AS and RS. The RS verifies that | |||
CoAP client and server networks. | the PoP token was created by a known and trusted AS, is valid, and | |||
responds to the client. The RS caches the security context | ||||
together with authorization information about this client | ||||
contained in the PoP token. | ||||
Introspection responses in CBOR use the following mappings: | Resource | |||
Client Server | ||||
| | | ||||
C: +-------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path:"authz-info" | ||||
| | Payload: SlAV32hkKG ... | ||||
| | | ||||
|<--------+ Header: 2.01 Created | ||||
| 2.01 | | ||||
| | | ||||
active: | Figure 20: Access Token provisioning to RS | |||
The client and the RS runs the DTLS handshake using the raw public | ||||
keys established in step B and C. | ||||
The client sends the CoAP request GET to /temperature on RS over | ||||
DTLS. The RS verifies that the request is authorized, based on | ||||
previously established security context. | ||||
F: The RS responds with a resource representation over DTLS. | ||||
REQUIRED. The active key is an indicator of whether or not the | Resource | |||
presented token is currently active. The specifics of a token's | Client Server | |||
"active" state will vary depending on the implementation of the | | | | |||
authorization server, and the information it keeps about its | |<=======>| DTLS Connection Establishment | |||
tokens, but a "true" value return for the "active" property will | | | using Raw Public Keys | |||
generally indicate that a given token has been issued by this | | | | |||
authorization server, has not been revoked by the resource owner, | +-------->| Header: GET (Code=0.01) | |||
and is within its given time window of validity (e.g., after its | | GET | Uri-Path: "temperature" | |||
issuance time and before its expiration time). | | | | |||
| | | ||||
| | | ||||
F: |<--------+ Header: 2.05 Content | ||||
| 2.05 | Payload: <sensor value> | ||||
| | | ||||
scope: | Figure 21: Resource Request and Response protected by DTLS. | |||
OPTIONAL. A string containing a space-separated list of scopes | C.2. Introspection Aided Token Validation | |||
associated with this token, in the format described in Section 3.3 | ||||
of OAuth 2.0 [RFC6749]. | ||||
client_id: | In this deployment scenario we assume that a client is not be able to | |||
access the AS at the time of the access request. Since the RS is, | ||||
however, connected to the back-end infrastructure it can make use of | ||||
token introspection. This access procedure involves steps A-F of | ||||
Figure 1, but assumes steps A and B have been carried out during a | ||||
phase when the client had connectivity to AS. | ||||
OPTIONAL. Client identifier for the client that requested this | Since the client is assumed to be offline, at least for a certain | |||
token. | period of time, a pre-provisioned access token has to be long-lived. | |||
The resource server may use its online connectivity to validate the | ||||
access token with the authorization server, which is shown in the | ||||
example below. | ||||
username: | In the example we show the interactions between an offline client | |||
(key fob), a resource server (online lock), and an authorization | ||||
server. We assume that there is a provisioning step where the client | ||||
has access to the AS. This corresponds to message exchanges A and B | ||||
which are shown in Figure 22. | ||||
OPTIONAL. Human-readable identifier for the resource owner who | Authorization consent from the resource owner can be pre-configured, | |||
authorized this token. | but it can also be provided via an interactive flow with the resource | |||
owner. An example of this for the key fob case could be that the | ||||
resource owner has a connected car, he buys a generic key that he | ||||
wants to use with the car. To authorize the key fob he connects it | ||||
to his computer that then provides the UI for the device. After that | ||||
OAuth 2.0 implicit flow can used to authorize the key for his car at | ||||
the the car manufacturers AS. | ||||
token_type: | Note: In this example the client does not know the exact door it will | |||
be used to access since the token request is not send at the time of | ||||
access. So the scope and audience parameters is set quite wide to | ||||
start with and new values different form the original once can be | ||||
returned from introspection later on. | ||||
OPTIONAL. Type of the token as defined in Section 5.1 of OAuth | A: The client sends the request using POST to /token at AS. The | |||
2.0 [RFC6749] or PoP token. | request contains the Audience parameter set to "PACS1337" (PACS, | |||
Physical Access System), a value the that the online door in | ||||
question identifies itself with. The AS generates an access token | ||||
as on opaque string, which it can match to the specific client, a | ||||
targeted audience and a symmetric key. | ||||
B: The AS responds with the an access token and client | ||||
information, the latter containing a symmetric key. Communication | ||||
security between C and RS will be DTLS and PreSharedKey. The PoP | ||||
key being used as the PreSharedKey. | ||||
exp: | Authorization | |||
Client Server | ||||
| | | ||||
| | | ||||
A: +-------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path:"token" | ||||
| | Content-Type: application/cbor | ||||
| | Payload: <Request-Payload> | ||||
| | | ||||
B: |<--------+ Header: 2.05 Content | ||||
| | Content-Type: application/cbor | ||||
| 2.05 | Payload: <Response-Payload> | ||||
| | | ||||
OPTIONAL. Integer timestamp, measured in the number of seconds | Figure 22: Token Request and Response using Client Credentials. | |||
since January 1 1970 UTC, indicating when this token will expire, | ||||
as defined in CWT [I-D.wahlstroem-ace-cbor-web-token]. | ||||
iat: | The information contained in the Request-Payload and the Response- | |||
Payload is shown in Figure 23. | ||||
OPTIONAL. Integer timestamp, measured in the number of seconds | Request-Payload: | |||
since January 1 1970 UTC, indicating when this token will expire, | { | |||
as defined in CWT [I-D.wahlstroem-ace-cbor-web-token]. | "grant_type" : "client_credentials", | |||
"aud" : "lockOfDoor4711", | ||||
"client_id" : "keyfob", | ||||
"client_secret" : "qwerty" | ||||
} | ||||
nbf: | Response-Payload: | |||
{ | ||||
"access_token" : b64'SlAV32hkKG ...' | ||||
"token_type" : "pop", | ||||
"csp" : "DTLS", | ||||
"cnf" : { | ||||
"COSE_Key" : { | ||||
"kid" : b64'c29tZSBwdWJsaWMga2V5IGlk', | ||||
"kty" : "oct", | ||||
"alg" : "HS256", | ||||
"k": b64'ZoRSOrFzN_FzUA5XKMYoVHyzff5oRJxl-IXRtztJ6uE' | ||||
} | ||||
} | ||||
} | ||||
OPTIONAL. Integer timestamp, measured in the number of seconds | Figure 23: Request and Response Payload for C offline | |||
since January 1 1970 UTC, indicating when this token will expire, | ||||
as defined in CWT [I-D.wahlstroem-ace-cbor-web-token]. | ||||
sub: | The access token in this case is just an opaque string referencing | |||
the authorization information at the AS. | ||||
OPTIONAL. Subject of the token, as defined in CWT | C: Next, the client POSTs the access token to the /authz-info | |||
[I-D.wahlstroem-ace-cbor-web-token]. Usually a machine-readable | resource in the RS. This is a plain CoAP request, i.e. no DTLS | |||
identifier of the resource owner who authorized this token. | between client and RS. Since the token is an opaque string, the | |||
RS cannot verify it on its own, and thus defers to respond the | ||||
client with a status code until after step E. | ||||
D: The RS forwards the token to the /introspect resource on the | ||||
AS. Introspection assumes a secure connection between the AS and | ||||
the RS, e.g. using transport of application layer security, which | ||||
is not detailed in this example. | ||||
E: The AS provides the introspection response containing | ||||
parameters about the token. This includes the confirmation key | ||||
(cnf) parameter that allows the RS to verify the client's proof of | ||||
possession in step F. | ||||
After receiving message E, the RS responds to the client's POST in | ||||
step C with Code 2.01 Created. | ||||
aud: | Resource | |||
Client Server | ||||
| | | ||||
C: +-------->| Header: POST (T=CON, Code=0.02) | ||||
| POST | Uri-Path:"authz-info" | ||||
| | Content-Type: "application/cbor" | ||||
| | Payload: b64'SlAV32hkKG ...'' | ||||
| | | ||||
| | Authorization | ||||
| | Server | ||||
| | | | ||||
D: | +--------->| Header: POST (Code=0.02) | ||||
| | POST | Uri-Path: "introspect" | ||||
| | | Content-Type: "application/cbor" | ||||
| | | Payload: <Request-Payload> | ||||
| | | | ||||
E: | |<---------+ Header: 2.05 Content | ||||
| | 2.05 | Content-Type: "application/cbor" | ||||
| | | Payload: <Response-Payload> | ||||
| | | | ||||
| | | ||||
C: |<--------+ Header: 2.01 Created | ||||
| 2.01 | | ||||
| | | ||||
OPTIONAL. Service-specific string identifier or list of string | Figure 24: Token Introspection for C offline | |||
identifiers representing the intended audience for this token, as | The information contained in the Request-Payload and the Response- | |||
defined in CWT [I-D.wahlstroem-ace-cbor-web-token]. | Payload is shown in Figure 25. | |||
iss: | Request-Payload: | |||
{ | ||||
"token" : b64'SlAV32hkKG...', | ||||
"client_id" : "FrontDoor", | ||||
"client_secret" : "ytrewq" | ||||
} | ||||
OPTIONAL. String representing the issuer of this token, as | Response-Payload: | |||
defined in CWT [I-D.wahlstroem-ace-cbor-web-token]. | { | |||
"active" : true, | ||||
"aud" : "lockOfDoor4711", | ||||
"scope" : "open, close", | ||||
"iat" : 1311280970, | ||||
"cnf" : { | ||||
"kid" : b64'JDLUhTMjU2IiwiY3R5Ijoi ...' | ||||
} | ||||
} | ||||
cti: | Figure 25: Request and Response Payload for Introspection | |||
OPTIONAL. String identifier for the token, as defined in CWT | The client uses the symmetric PoP key to establish a DTLS | |||
[I-D.wahlstroem-ace-cbor-web-token] | PreSharedKey secure connection to the RS. The CoAP request PUT is | |||
sent to the uri-path /state on RS changing state of the door to | ||||
locked. | ||||
F: The RS responds with a appropriate over the secure DTLS | ||||
channel. | ||||
The parameters defined above use the following CBOR major types: | Resource | |||
Client Server | ||||
| | | ||||
|<=======>| DTLS Connection Establishment | ||||
| | using Pre Shared Key | ||||
| | | ||||
+-------->| Header: PUT (Code=0.03) | ||||
| PUT | Uri-Path: "state" | ||||
| | Payload: <new state for the lock> | ||||
| | | ||||
F: |<--------+ Header: 2.04 Changed | ||||
| 2.04 | Payload: <new state for the lock> | ||||
| | | ||||
/-----------+--------------+-----------------------\ | Figure 26: Resource request and response protected by OSCOAP | |||
| Value | Major Type | Key | | ||||
|-----------+--------------+-----------------------| | ||||
| 0 | 0 | active | | ||||
| 1 | 0 | scopes | | ||||
| 2 | 0 | client_id | | ||||
| 3 | 0 | username | | ||||
| 4 | 0 | token_type | | ||||
| 5 | 0 | exp | | ||||
| 6 | 0 | iat | | ||||
| 7 | 0 | nbf | | ||||
| 8 | 0 | sub | | ||||
| 9 | 0 | aud | | ||||
| 10 | 0 | iss | | ||||
| 11 | 0 | cti | | ||||
\-----------+--------------+-----------------------/ | ||||
Figure 32: CBOR Mappings to Token Introspection Response Parameters. | Appendix D. Document Updates | |||
D.1. Version -01 to -02 | ||||
Appendix E. Document Updates | o Restructured to remove communication security parts. These shall | |||
now be defined in profiles. | ||||
o Restructured section 5 to create new sections on the OAuth | ||||
endpoints /token, /introspect and /authz-info. | ||||
o Pulled in material from draft-ietf-oauth-pop-key-distribution in | ||||
order to define proof-of-possession key distribution. | ||||
o Introduced the 'cnf' parameter as defined in RFC7800 to reference | ||||
or transport keys used for proof of posession. | ||||
o Introduced the 'client-token' to transport client information from | ||||
the AS to the client via the RS in conjunction with introspection. | ||||
o Expanded the IANA section to define parameters for token request, | ||||
introspection and CWT claims. | ||||
o Moved deployment scenarios to the appendix as examples. | ||||
E.1. Version -00 to -01 | D.2. Version -00 to -01 | |||
o Changed 5.1. from "Communication Security Protocol" to "Client | o Changed 5.1. from "Communication Security Protocol" to "Client | |||
Information". | Information". | |||
o Major rewrite of 5.1 to clarify the information exchanged between | o Major rewrite of 5.1 to clarify the information exchanged between | |||
C and AS in the PoP token request profile for IoT. | C and AS in the PoP token request profile for IoT. | |||
* Allow the client to indicate preferences for the communication | * Allow the client to indicate preferences for the communication | |||
security protocol. | security protocol. | |||
* Defined the term "Client Information" for the additional | * Defined the term "Client Information" for the additional | |||
information returned to the client in addition to the access | information returned to the client in addition to the access | |||
token. | token. | |||
* Require that the messages between AS and client are secured, | * Require that the messages between AS and client are secured, | |||
either with (D)TLS or with COSE_Encrypted wrappers. | either with (D)TLS or with COSE_Encrypted wrappers. | |||
* Removed dependency on OSCoAP and added generic text about | * Removed dependency on OSCoAP and added generic text about | |||
object security instead. | object security instead. | |||
* Defined the "rpk" parameter in the client information to | * Defined the "rpk" parameter in the client information to | |||
transmit the raw public key of the RS from AS to client. | transmit the raw public key of the RS from AS to client. | |||
* (D)TLS MUST use the PoP key in the handshake (either as PSK or | * (D)TLS MUST use the PoP key in the handshake (either as PSK or | |||
as client RPK with client authentication). | as client RPK with client authentication). | |||
* Defined the use of x5c, x5t and x5tS256 parameters when a | * Defined the use of x5c, x5t and x5tS256 parameters when a | |||
client certificate is used for proof of possession. | client certificate is used for proof of possession. | |||
* Defined "tktn" parameter for signaling for how to transfer the | ||||
* Defined "tktn" parameter for signaling for how to tranfer the | ||||
access token. | access token. | |||
o Added 5.2. the CoAP Access-Token option for transferring access | ||||
o Added 5.2. the CoAP Access-Token option for transfering access | ||||
tokens in messages that do not have payload. | tokens in messages that do not have payload. | |||
o 5.3.2. Defined success and error responses from the RS when | o 5.3.2. Defined success and error responses from the RS when | |||
receiving an access token. | receiving an access token. | |||
o 5.6.:Added section giving guidance on how to handle token | o 5.6.:Added section giving guidance on how to handle token | |||
expiration in the absence of reliable time. | expiration in the absence of reliable time. | |||
o Appendix B Added list of roles and responsibilities for C, AS and | o Appendix B Added list of roles and responsibilities for C, AS and | |||
RS. | RS. | |||
Authors' Addresses | Authors' Addresses | |||
Ludwig Seitz | Ludwig Seitz | |||
SICS | SICS | |||
Scheelevaegen 17 | Scheelevaegen 17 | |||
Lund 223 70 | Lund 223 70 | |||
SWEDEN | SWEDEN | |||
skipping to change at page 53, line 4 ¶ | skipping to change at page 53, line 22 ¶ | |||
Email: ludwig@sics.se | Email: ludwig@sics.se | |||
Goeran Selander | Goeran Selander | |||
Ericsson | Ericsson | |||
Faroegatan 6 | Faroegatan 6 | |||
Kista 164 80 | Kista 164 80 | |||
SWEDEN | SWEDEN | |||
Email: goran.selander@ericsson.com | Email: goran.selander@ericsson.com | |||
Erik Wahlstroem | Erik Wahlstroem | |||
Nexus Technology | Nexus Technology | |||
Telefonvagen 26 | Telefonvagen 26 | |||
Hagersten 126 26 | Hagersten 126 26 | |||
Sweden | Sweden | |||
Email: erik.wahlstrom@nexusgroup.com | Email: erik.wahlstrom@nexusgroup.com | |||
Samuel Erdtman | Samuel Erdtman | |||
Nexus Technology | Spotify AB | |||
Telefonvagen 26 | Birger Jarlsgatan 61, 4tr | |||
Hagersten 126 26 | Stockholm 113 56 | |||
Sweden | Sweden | |||
Email: samuel.erdtman@nexusgroup.com | Email: erdtman@spotify.com | |||
Hannes Tschofenig | Hannes Tschofenig | |||
ARM Ltd. | ARM Ltd. | |||
Hall in Tirol 6060 | Hall in Tirol 6060 | |||
Austria | Austria | |||
Email: Hannes.Tschofenig@arm.com | Email: Hannes.Tschofenig@arm.com | |||
End of changes. 374 change blocks. | ||||
1556 lines changed or deleted | 1577 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/ |