Health Relationship Trust Profile for
OAuth 2.0openid@justin.richer.orghttp://justin.richer.org/OpenID Heart Working GroupThe OAuth 2.0 protocol framework defines a mechanism to allow a
resource owner to delegate access to a protected resource for a client
application.This specification profiles the OAuth 2.0 protocol framework to
increase baseline security, provide greater interoperability, and
structure deployments in a manner specifically applicable to (but not
limited to) the healthcare domain.This document profiles the OAuth 2.0 web authorization framework for
use in the context of securing web-facing application programming
interfaces (APIs), particularly Representational State Transfer
(RESTful) APIs. The OAuth 2.0 specifications accommodate a wide range of
implementations with varying security and usability considerations,
across different types of software clients. To achieve this flexibility,
the standard makes many security controls optional. OAuth
implementations using only the minimum mandatory security measures
require minimal effort on the part of developers and users, but they
also fail to prevent known attacks and are unsuitable for protecting
sensitive data. The OAuth 2.0 client, protected resource, and
authorization server profiles defined in this document serve two
purposes:Define a mandatory baseline set of security controls suitable for
a wide range of use cases, while maintaining reasonable ease of
implementation and functionalityIdentify optional advanced security controls for sensitive use
cases where heightened risks justify more stringent controls that
increase the required implementation effort and may reduce or
restrict functionalityThis OAuth profile is intended to be shared broadly, and ideally to
influence OAuth implementations in other domains besides health
care.The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
RFC 2119.All uses of JSON Web Signature (JWS)
and JSON Web Encryption (JWE) data
structures in this specification utilize the JWS Compact Serialization
or the JWE Compact Serialization; the JWS JSON Serialization and the
JWE JSON Serialization are not used.This specification uses the terms "Access Token", "Authorization
Code", "Authorization Endpoint", "Authorization Grant", "Authorization
Server", "Client", "Client Authentication", "Client Identifier",
"Client Secret", "Grant Type", "Protected Resource", "Redirection
URI", "Refresh Token", "Resource Owner", "Resource Server", "Response
Type", and "Token Endpoint" defined by OAuth
2.0, the terms "Claim Name", "Claim Value", and "JSON Web Token
(JWT)" defined by JSON Web Token (JWT),
and the terms defined by OpenID Connect
Core 1.0.This specification defines requirements for the following
components:OAuth 2.0 clientsOAuth 2.0 authorization serversOAuth 2.0 protected resourcesThe specification also defines features for interaction between
these components:Client to authorization serverProtected resource to authorization serverWhen a HEART-compliant component is interacting with other
HEART-compliant components, in any valid combination, all components
MUST fully conform to the features and requirements of this
specification. All interaction with non-HEART components is outside
the scope of this specification.A HEART-compliant OAuth 2.0 authorization server MUST support all
features as described in this specification. A general-purpose
authorization server MAY support additional features for use with
non-HEART clients and protected resources.A HEART-compliant OAuth 2.0 client MUST use all functions as
described in this specification. A general-purpose client library MAY
support additional features for use with non-HEART authorization
servers and protected resources.A HEART-compliant OAuth 2.0 protected resource MUST use all
functions as described in this specification. A general-purpose
protected resource library MAY support additional features for use
with non-HEART authorization servers and clients.The following profile descriptions give patterns of deployment for
use in different types of client applications based on the OAuth grant
type. The resource owner password credentials grant type defined in
is intentionally omitted from this
discussion, and MUST NOT be used under these profiles. Additional
grant types, such as assertions, chained tokens, or other mechanisms,
are out of scope of this profile and must be covered separately by
appropriate profile documents.This client type applies to clients that act on behalf of a
particular resource owner and require delegation of that
user’s authority to access the protected resource.
Furthermore, these clients are capable of interacting with a
separate web browser application to facilitate the resource owner's
interaction with the authentication endpoint of the authorization
server.These clients MUST use the authorization code flow of OAuth 2 by
sending the resource owner to the authorization endpoint to obtain
authorization. The user MUST authenticate to the authorization
endpoint. The user’s web browser is then redirected back to a
URI hosted by the client, from which the client can obtain an
authorization code passed as a query parameter. The client then
presents that authorization code along with its own credentials to
the authorization server's token endpoint to obtain an access
token.These clients MUST be associated with a unique public key, as
described in .This client type MAY request and be issued a refresh token if the
security parameters of the access request allow for it.This client type applies to clients that act on behalf of a
particular resource owner and require delegation of that user's
authority to access the protected resource. Furthermore, these
clients are capable of interacting with a separate web browser
application to facilitate the resource owner's interaction with the
authentication endpoint of the authorization server. In particular,
this client type runs natively on the resource owner's device, often
leading to many identical instances of a piece of software operating
in different environments and running simultaneously for different
end users.Native clients MUST use the authorization code flow of OAuth 2 by
sending the resource owner to the authorization endpoint to obtain
authorization. The user MUST authenticate to the authorization
endpoint. The user’s web browser is then redirected back to a
URI hosted by the client, from which the client can obtain an
authorization code passed as a query parameter. The client then
presents that authorization code along to the authorization server's
token endpoint to obtain an access token.Confidential native clients MUST be associated with a unique
public key, as described in . Native
clients MUST use dynamic client registration to obtain a separate
client id for each instance, and MUST use their client key to
protect calls to the token endpoint. Native applications using
dynamic registration SHOULD generate a unique public and private key
pair on the device and register that public key value with the
authorization server. Alternatively, an authorization server MAY
issue a public and private key pair to the client as part of the
registration process. In such cases, the authorization server MUST
discard its copy of the private key. Client credentials MUST NOT be
shared among instances of client software.Public native clients MUST use PKCE, using the S256
code challenge mechanism. Confidential native clients MAY use PKCE
as well.This client type MAY request and be issued a refresh token if the
security parameters of the access request allow for it.This client type applies to clients that act on behalf of a
particular resource owner and require delegation of that
user’s authority to access the protected resource.
Furthermore, these clients are embedded within a web browser and
effectively share an active session between systems.These clients use the implicit flow of OAuth 2 by sending a
resource owner to the authorization endpoint to obtain
authorization. The user MUST authenticate to the authorization
endpoint. The user’s web browser is then redirected back to a
URI hosted by the client, from which the client can directly obtain
an access token. Since the client itself never authenticates to the
server and the token is made available directly to the browser, this
flow is appropriate only for clients embedded within a web browser,
such as a JavaScript client with no back-end server component.
Wherever possible, it is preferable to use the authorization code
flow due to its superior security properties.This client type MUST NOT request or be issued a refresh token.
Access tokens issued to this type of client MUST be short lived and
SHOULD be discarded when the user's authenticated session with the
client expires.This profile applies to clients that connect directly to
protected resources and do not act on behalf of a particular
resource owner, such as those clients that facilitate bulk
transfers.These clients use the client credentials flow of OAuth 2 by
sending a request to the token endpoint with the client's
credentials and obtaining an access token in the response. Since
this profile does not involve an authenticated user, this flow is
appropriate only for trusted applications, such as those that would
traditionally use a developer key. For example, a partner system
that performs bulk data transfers between two systems would be
considered a direct access client.This client type MUST NOT request or be issued a refresh
token.Full clients and browser-embedded clients making a request to the
authorization endpoint MUST use an unpredictable value for the state
parameter with at least 128 bits of entropy. Clients MUST validate
the value of the state parameter upon
return to the redirect URI and MUST ensure that the state value is
securely tied to the user’s current session (e.g., by relating
the state value to a session identifier issued by the client
software to the browser).Clients MUST include their full redirect URIs in the
authorization request. To prevent open redirection and other
injection attacks, the authorization server MUST match the entire
redirect URI using a direct string comparison against registered
values and MUST reject requests with invalid or missing redirect
URIs.The following is a sample response from a web-based client to the
end user’s browser for the purpose of redirecting the end user
to the authorization server's authorization endpoint:This causes the browser to send the following request to the
authorization endpoint:Native clients (using PKCE) MUST send the code_challenge
parameter.Full clients and direct access clients as defined above MUST
authenticate to the authorization server's token endpoint using a
JWT assertion as defined by the JWT Profile
for OAuth 2.0 Client Authentication and Authorization Grants
and the private_key_jwt method defined
in OpenID Connect Core. The
assertion MUST use the claims as follows:the client ID of the client creating the
tokenthe client ID of the client creating the
tokenthe URL of the authorization server's token
endpointthe time that the token was created by the
clientthe expiration time, after which the token
MUST be considered invalida unique identifier generated by the client
for this authentication. This identifier MUST contain at least
128 bits of entropy and MUST NOT be re-used by any subsequent
authentication token.The following sample claim set illustrates the use of the
required claims for a client authentication JWT as defined in this
profile; additional claims MAY be included in the claim set.The JWT assertion MUST be signed by the client using the client's
private key. See for mechanisms
by which the client can make its public key known to the server. The
authorization server MUST support the RS256 signature method (the
Rivest, Shamir, and Adleman (RSA) signature algorithm with a 256-bit
hash) and MAY use other asymmetric signature methods listed in the
JSON Web Algorithms (JWA)
specification.The following sample JWT contains the above claims and has been
signed using the RS256 JWS algorithm and the client's own private
key (with line breaks for display purposes only):This is sent in the request to the token endpoint as in the
following example:Native clients (using PKCE) MUST send the code_verifier to the
token endpoint. Native clients MAY authenticate using a public key
as described in this section and MUST NOT use another authentication
mechanism.All clients MUST register with the authorization server. Clients
registering multiple instances with the authorization server MUST
each receive a unique client identifier.Clients using the authorization code or implicit grant types
MUST register their full redirect URIs. The Authorization Server
MUST validate the redirect URI given by the client at the
authorization endpoint using strict string comparison.A client MUST protect the values passed back to its redirect
URI by ensuring that the redirect URI is one of the following:Hosted on a website with Transport Layer Security (TLS)
protection (a Hypertext Transfer Protocol – Secure
(HTTPS) URI)Hosted on the local domain of the client (e.g.,
http://localhost/)Hosted on a client-specific non-remote-protocol URI scheme
(e.g., myapp:/)Clients MUST NOT have URIs in more than one category and SHOULD
NOT have multiple redirect URIs on different domains.Clients MUST NOT forward values passed back to their redirect
URIs to other arbitrary or user-provided URIs (a practice known as
an "open redirector”).Full clients using the authorization code grant type or direct
access clients using the client credentials grant type MUST have a
public and private key pair for use in authentication to the token
endpoint. These clients MUST register their public keys in their
client registration metadata by either sending the public key
directly in the jwks field or by
registering a jwks_uri that MUST be
reachable by the authorization server. It is RECOMMENDED that
clients use a jwks_uri if possible as
this allows for key rotation more easily.The jwks field or the content
available from the jwks_uri of a client
MUST contain a public key in JSON Web Key Set
(JWK Set) format. The authorization server MUST validate the
content of the client's registered jwks_uri document and verify that
it contains a JWK Set. The following example is of a 2048-bit RSA
key:For reference, the corresponding public/private key pair for this
public key is the following (in JWK format):Note that the second example contains both the public and private
keys, while the first example contains the public key only.Clients SHOULD send bearer tokens passed in the Authentication
header as defined by . Clients MAY use the
form-parameter or query-parameter methods in . Authorized requests MUST be made over TLS, and
clients MUST validate the protected resource server's
certificate.An example of an OAuth-protected call to the OpenID Connect
UserInfo endpoint, sending the token in the Authorization header,
follows:All servers MUST conform to applicable recommendations found in the
Security Considerations sections of and those
found in the OAuth Threat Model
Document.The authorization server MUST protect all communications to and from
its OAuth endpoints using TLS.The authorization server MUST support the authorization_code,
implicit, and client_credentials
grant types as described in . The
authorization server MUST limit each registered client (identified
by a client ID) to a single grant type only, since a single piece of
software will be functioning at runtime in only one of the modes
described in . Clients that have
multiple modes of operation MUST have a separate client ID for each
mode.The authorization server MUST enforce client authentication as
described above for the authorization code and client credentials
grant types. The authorization server MUST validate all redirect
URIs for authorization code and implicit grant types.Authorization servers MUST support dynamic client registration,
and clients MAY register using the Dynamic
Client Registration Protocol for authorization code or
implicit grant types. Clients MUST NOT dynamically register for the
client credentials grant type. Authorization servers MAY limit the
scopes available to dynamically registered clients.Authorization servers MUST signal to end users that a client was
dynamically registered on the authorization screen. Authorization
servers MAY accept signed software statements as described in issued to client software developers from a
trusted registration entity. The software statement can be used to
tie together many instances of the same client software that will be
run, dynamically registered, and authorized separately at runtime.
The software statement MUST include the following client metadata
parameters:array of redirect URIs used by the
client; subject to the requirements listed in grant type used by the client; must be
"authorization_code” or "implicit”client's public key in JWK Set
format; if jwks_uri is used it MUST be reachable by the
Authorization Server and point to the client's public key
sethuman-readable name of the clientURL of a web page containing further
information about the clientWhen prompting the end user with an interactive approval page,
the authorization server MUST indicate to the user:Whether the client was dynamically registered, or else
statically registered by a trusted administratorWhether the client is associated with a software statement,
and in which case provide information about the trusted issuer
of the software statementWhat kind of access the client is requesting (including
scope, target resource, etc.)The authorization server MUST provide an OpenID Connect service discovery
endpoint listing the components relevant to the OAuth protocol:
The fully qualified issuer URL of the
serverThe fully qualified URL of
the server's authorization endpoint defined by OAuth 2.0The fully qualified URL of the
server's token endpoint defined by OAuth
2.0The fully qualified URL of
the server's introspection endpoint defined by OAuth Token IntrospectionThe fully qualified URL of the
server's revocation endpoint defined by OAuth 2.0 Token RevocationThe fully qualified URI of the server's
public key in JWK Set formatIf the authorization server is also an OpenID Connect Provider,
it MUST provide a discovery endpoint meeting the requirements listed
in Section 3.5 of the HEART OpenID Connect profile.The following example shows the JSON document found at a
discovery endpoint for an authorization server:Clients and protected resources SHOULD cache this discovery
information. It is RECOMMENDED that servers provide cache
information through HTTP headers and make the cache valid for at
least one week.The server MUST provide its public key in JWK Set format. The key
MUST contain the following fields:The key ID of the key pair used to sign this
tokenThe key typeThe default algorithm used for this keyThe following is an example of a 2048-bit RSA public key:Clients and protected resources SHOULD cache this key. It is
RECOMMENDED that servers provide cache information through HTTP
headers and make the cache valid for at least one week.Token revocation allows a client to signal to an authorization
server that a given token will no longer be used.An authorization server MUST revoke the token if the client
requesting the revocation is the client to which the token was
issued, the client has permission to revoke tokens, and the token is
revocable.A client MUST immediately discard the token and not use it again
after revoking it.An authorization server MUST support the Proof Key for Code
Exchange (PKCE) extension to the authorization code flow, including
support for the S256 code challenge method. The authorization server
MUST NOT allow a HEART client to use the plain
code challenge method.The authorization server MUST compare a client's registered
redirect URIs with the redirect URI presented during an
authorization request using an exact string match.Unlike the core OAuth protocol, the HEART profile intends to allow
compliant protected resources to connect to compliant authorization
servers.In order to facilitate interoperability with multiple protected
resources, all HEART-compliant authorization servers issue
cryptographically signed tokens in the JSON Web Token (JWT) format.
The information carried in the JWT is intended to allow a protected
resource to quickly test the integrity of the token without
additional network calls, and to allow the protected resource to
determine which authorization server issued the token. When combined
with discovery, this information is sufficient to programmatically
locate the token introspection service, which is in turn used for
conveying additional security information about the token.The server MUST issue tokens as JWTs with, at minimum, the
following claims:The issuer URL of the server that issued the
tokenThe client id of the client to whom this token
was issuedThe expiration time (integer number of seconds
since from 1970-01-01T00:00:00Z UTC), after which the token MUST
be considered invalidA unique JWT Token ID value with at least 128
bits of entropy. This value MUST NOT be re-used in another
token. Clients MUST check for reuse of jti values and reject all
tokens issued with duplicate jti values.The server MAY issue tokens with additional fields, including the
following as defined here:The identifier of the end-user that authorized
this client, or the client id of a client acting on its own
behalf (such as a bulk transfer). Since this information could
potentially leak private user information, it should be used
only when needed.The audience of the token, an array containing
the identifier(s) of protected resource(s) for which the token
is valid, if this information is known. The identifiers SHOULD
be URIs representing the resource servers. The aud claim may
contain multiple values if the token is valid for multiple
protected resources. Note that at runtime, the authorization
server may not know the identifiers of all possible protected
resources at which a token may be used.The following sample claim set illustrates the use of the
required claims for an access token as defined in this profile;
additional claims MAY be included in the claim set:The access tokens MUST be signed with JWS. The authorization server MUST support
the RS256 signature method for tokens and MAY use other asymmetric
signing methods as defined in the IANA
JSON Web Signatures and Encryption Algorithms registry. The
JWS header MUST contain the following fields:The key ID of the key pair used to sign this
tokenThis example access token has been signed with the server's
private key using RS256:Refresh tokens SHOULD be signed with JWS using the same public key and contain
the same set of claims as the access tokens.The authorization server MAY encrypt access tokens and refresh
tokens using JWE. Encrypted access
tokens MUST be encrypted using the public key of the protected
resource. Encrypted refresh tokens MUST be encrypted using the
authorization server's public key.Token introspection allows a protected resource to query the
authorization server for metadata about a token. The protected
resource makes a request like the following to the token
introspection endpoint:The client assertion parameter is structured as described in
.The server responds to an introspection request with a JSON
object representing the token containing the following fields as
defined in the token introspection specification:Boolean value indicating whether or not
this token is currently active at this authorization server.
Tokens that have been revoked, have expired, or were not issued
by this authorization server are considered non-active.Space-separated list of OAuth 2.0 scope
values represented as a single string.Timestamp of when this token expires (integer
number of seconds since from 1970-01-01T00:00:00Z UTC)An opaque string that uniquely identifies the
user who authorized this token at this authorization server (if
applicable)An opaque string that uniquely
identifies the OAuth 2.0 client that requested this tokenThe following example is a response from the introspection
endpoint:The authorization server MUST require authentication for both the
revocation and introspection endpoints as described in . Protected resources calling the
introspection endpoint MUST use credentials distinct from any other
OAuth client registered at the server.A protected resource MAY cache the response from the
introspection endpoint for a period of time no greater than half the
lifetime of the token. A protected resource MUST NOT accept a token
that is not active according to the response from the introspection
endpoint.This profile provides RECOMMENDED lifetimes for different types of
tokens issued to different types of clients. Specific applications MAY
issue tokens with different lifetimes. Any active token MAY be revoked
at any time.For clients using the authorization code grant type, access tokens
SHOULD have a valid lifetime no greater than one hour, and refresh
tokens (if issued) SHOULD have a valid lifetime no greater than
twenty-four hours.For clients using the implicit grant type, access tokens SHOULD
have a valid lifetime no greater than fifteen minutes.For clients using the client credentials grant type, access tokens
SHOULD have a valid lifetime no greater than six hours.Scopes define individual pieces of authority that can be requested
by clients, granted by resource owners, and enforced by protected
resources. Specific scope values will be highly dependent on the
specific types of resources being protected in a given interface.
OpenID Connect, for example, defines scope values to enable access to
different attributes of user profiles.Authorization servers SHOULD define and document default scope
values that will be used if an authorization request does not specify
a requested set of scopes.To facilitate general use across a wide variety of protected
resources, authorization servers SHOULD allow for the use of arbitrary
scope values at runtime, such as allowing clients or protected
resources to use arbitrary scope strings upon registration.
Authorization servers MAY restrict certain scopes from use by
dynamically registered systems.A protected resource MUST accept bearer tokens passed in the
authorization header as described in . A
protected resource MAY also accept bearer tokens passed in the form
parameter or query parameter methods.Protected resources MUST define and document which scopes are
required for access to the resource.Protected resources MUST interpret access tokens using either JWT,
token introspection, or a combination of the two.The protected resource MUST check the aud
(audience) claim, if it exists in the token, to ensure that it
includes the protected resource's identifier. The protected resource
MUST ensure that the rights associated with the token are sufficient
to grant access to the resource. For example, this can be accomplished
by querying the scopes associated with the token from the
authorization server's token introspection endpoint.A protected resource MUST limit which authorization servers it will
accept valid tokens from. A resource server MAY accomplish this using
a whitelist of trusted servers, a dynamic policy engine, or other
means.The preceding portions of this OAuth profile provide a level of
security adequate for a wide range of use cases, while still maintaining
relative ease of implementation and usability for developers, system
administrators, and end users. The following are some additional
security measures that can be employed for use cases where elevated
risks justify the use of additional controls at the expense of
implementation effort and usability. This section also addresses future
security capabilities, currently in the early draft stages, being added
to the OAuth standard suite.OAuth proof of possession tokens are currently defined in a set of
drafts under active development in the Internet Engineering Task Force
(IETF) OAuth Working Group. While a bearer token can be used by anyone
in possession of the token, a proof of possession token is bound to a
particular symmetric or asymmetric key issued to, or already possessed
by, the client. The association of the key to the token is also
communicated to the protected resource; a variety of mechanisms for
doing this are outlined in the draft OAuth 2.0 Proof-of-Possession
(PoP) Security Architecture. When the client presents the token
to the protected resource, it is also required to demonstrate
possession of the corresponding key (e.g., by creating a cryptographic
hash or signature of the request).Proof of Possession tokens are somewhat analogous to the Security
Assertion Markup Language's (SAML's) Holder-of-Key mechanism for
binding assertions to user identities. Proof of possession could
prevent a number of attacks on OAuth that entail the interception of
access tokens by unauthorized parties. The attacker would need to
obtain the legitimate client's cryptographic key along with the access
token to gain access to protected resources. Additionally, portions of
the HTTP request could be protected by the same signature used in
presentation of the token. Proof of possession tokens may not provide
all of the same protections as PKI authentication, but they are far
less challenging to implement on a distributed scale.All transactions MUST be protected in transit by TLS as described in
BCP195.All clients MUST conform to applicable recommendations found in the
Security Considerations sections of and those
found in the OAuth 2.0 Threat Model and Security
Considerations document.Recommendations for Secure Use of Transport Layer Security
(TLS) and Datagram Transport Layer Security (DTLS)Transport Layer Security (TLS) and Datagram Transport Layer
Security (DTLS) are widely used to protect data exchanged over
application protocols such as HTTP, SMTP, IMAP, POP, SIP, and
XMPP. Over the last few years, several serious attacks on TLS have
emerged, including attacks on its most commonly used cipher suites
and their modes of operation. This document provides
recommendations for improving the security of deployed services
that use TLS and DTLS. The recommendations are applicable to the
majority of use cases.OpenID Connect Core 1.0Nomura Research Institute,
Ltd.Ping IdentityMicrosoftGoogleSalesforceOpenID Connect Discovery 1.0Nomura Research Institute,
Ltd.Ping IdentityMicrosoftIllumilaJSONJSON Web Signature and Encryption Algorithms registryThe OpenID Community would like to thank the following people for
their contributions to this specification: Mark Russel, Mary
Pulvermacher, David Hill, Dale Moberg, Adrian Gropper, Eve Maler, Danny
van Leeuwen, John Moehrke, Aaron Seib, John Bradley, Debbie Bucci, Josh
Mandel, and Sarah Squire.The original version of this specification was part of the Secure
RESTful Interfaces project from The MITRE Corporation, available online
at http://secure-restful-interface-profile.github.io/pages/Copyright (c) 2018 The OpenID Foundation.The OpenID Foundation (OIDF) grants to any Contributor, developer,
implementer, or other interested party a non-exclusive, royalty free,
worldwide copyright license to reproduce, prepare derivative works from,
distribute, perform and display, this Implementers Draft or Final
Specification solely for the purposes of (i) developing specifications,
and (ii) implementing Implementers Drafts and Final Specifications based
on such documents, provided that attribution be made to the OIDF as the
source of the material, but that such attribution does not indicate an
endorsement by the OIDF.The technology described in this specification was made available
from contributions from various sources, including members of the OpenID
Foundation and others. Although the OpenID Foundation has taken steps to
help ensure that the technology is available for distribution, it takes
no position regarding the validity or scope of any intellectual property
or other rights that might be claimed to pertain to the implementation
or use of the technology described in this specification or the extent
to which any license under such rights might or might not be available;
neither does it represent that it has made any independent effort to
identify any such rights. The OpenID Foundation and the contributors to
this specification make no (and hereby expressly disclaim any)
warranties (express, implied, or otherwise), including implied
warranties of merchantability, non-infringement, fitness for a
particular purpose, or title, related to this specification, and the
entire risk as to implementing this specification is assumed by the
implementer. The OpenID Intellectual Property Rights policy requires
contributors to offer a patent promise not to assert certain patent
claims against other contributors and against implementers. The OpenID
Foundation invites any interested party to bring to its attention any
copyrights, patents, patent applications, or other proprietary rights
that may cover technology that may be required to practice this
specification.-2018-02-19Clarified audience value in tokensCodified public clients for native applications using PKCE-2017-05-25Fixed spec cross-reference-2017-04-18Changed example to use scopes from HEART OAuth FHIR document-2017-04-10Require native clients to have unique client IDs (restores
previous requirement)Clarified PKCE requirements-2017-02-08Clarified that RS's need to limit which AS's they take tokens
from.Added section and requirements for native applications.-2016-09-19Reorganized document against different conformance aspects.-2016-08-10Added PKCE requirement for native application support.Removed client TLS auth.Added reference to JWS/JWE algs registry.Clarified approval UX guidelines.Clarified client types restrictions.-2016-04-30Added conformance statements.Clarified optionality of "sub" and "aud" claims in JWTs.Add justification for JWT and introspection.Fixed "kid" location information.-2016-02-15Implementer's Draft 1-2015-11-30Clarified client instances.Replaced "mitre.org" with "example.com" (JWTs need to be
regenerated).Fixed specification references to new RFCs.Clarified scope flexibility.Clarified dynamic registration requirement.Added some UX requirements and guidance.Added security considerations section and TLS BCP reference.-2015-04-24Fixed references to make it compile-2015-04-01Imported content from Secure RESTful OAuth profile.