OAuth Working Group | P. Hunt, Ed. |
Internet-Draft | Oracle Corporation |
Intended status: Standards Track | M. Ansari |
Expires: January 06, 2014 | Cisco |
T. Nadalin | |
Microsoft | |
July 05, 2013 |
OAuth 2.0 SCIM Client Registration Profile
draft-hunt-oauth-scim-client-reg-00
This specification defines a SCIM endpoint used to register and provision OAuth 2.0 clients to access a OAuth 2.0 protected service API in a just-in-time fashion. This draft profiles how a OAuth 2.0 client may use SCIM and OAuth 2.0 to manage its registration.
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."
This Internet-Draft will expire on January 06, 2014.
Copyright (c) 2013 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
The OAuth 2.0 Authorization Framework [RFC6749] is a framework by which client applications are authorized by authorization servers to access software API servers using access tokens issued by a token server. As a framework, OAuth 2.0 enables many different flows by which a client application may obtain an access token including delegated authorization from a user. Most of these flows require that each client have a client identifier and some means of authentication.
In order for an OAuth 2.0 client to work with an OAuth authorization server, it must have previously obtained a client identifier (client_id) and a client credential (such as a password, secret, or authentication token). The OAuth 2.0 authorization framework does not define how the relationship between the client and the authorization server is initialized, or how a given client is assigned a unique client identifier. Further, because many clients (such as mobile applications) are copied for wide distribution, special security considerations are defined for those clients known as "public" clients. Public clients represent a high risk when hundreds to millions of clients share the same authentication credential and client_id. This draft provides a means by which public clients can be issued unique client identifiers to become confidential clients.
This draft profiles using SCIM [I-D.ietf-scim-api] as a just-in-time identity management system enabling every client to register itself with a designated SCIM endpoint to obtain a unique OAuth 2.0 [RFC6749] client_id and authentication credential. In addition to accepting a registration request, the profile specifies how the endpoint can be used to dynamically assign a client identifier, and optionally a client credential. This specification defines OAuth 2.0 client schema and objects accessible through SCIM. The OAuth 2.0 client schema includes metadata about the client software being registered as well as OAuth 2.0 protocol metadata required for the successful operation of a client in an OAuth 2.0 protected environment.
Finally, this specification also defines how a publisher of software services APIs deployed in multiple environments may issue a software assertion that may be used by the registration endpoint to recognize and accept client software. Additionally, the specification also defines a mechanism for pre-approval of client software within an administrative domain.
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'MAY', and 'OPTIONAL' in this document are to be interpreted as described in [RFC2119].
Unless otherwise noted, all the protocol parameter names and values are case sensitive.
This specification uses the terms "Access Token", "Refresh Token", "Authorization Code", "Authorization Grant", "Authorization Server", "Authorization Endpoint", "Client", "Client Identifier", "Client Secret", "Protected Resource", "Resource Owner", "Resource Server", and "Token Endpoint" defined by OAuth 2.0 [RFC6749].
In RFC6749, a client identifier was typically given to a developer for inclusion in the software. As a result, client identifier often had two different meanings when comparing public and confidential clients. A confidential client tended to be deployed in limited locations on server platforms and thus a client identifier was associated with a client instance. Public clients on the other hand are deployed in many locations. In these cases, the client identifier has closer association to the software being used rather than the instance.
In this specification, "client identifier" is re-scoped more narrowly to imply an instance of client software (or a cluster). A new term, "software identifier" refers to a packaging of a software that is deployed in one or more location. Thus for every software identifier, there may be one or more client identifiers.
This specification defines the following additional terms:
+------------+ +--------------+ | Client App +-(A)---------------------------------->| Software API | | Developer | [Register] | Publisher | | |<--------------------------------------+ | +-----+------+ +--------------+ | v +------------+ + Builds App | |Distribution| [Package & Distribute] +-----+------+ +--------------+ (B) +---(C)-----------------------------------+ Pre-reg Auth | | | +--------------+ v V +------------+ +--------------+ | +-(D)-----------------------------------> | | | [POST/Register-Add] | | | |<--------------------------------------+ | | | +-----------+ | OAuth2 | | +-(E)------------->| OAuth2 AS | | SCIM JIT | | Client App | [Token Request] | Token | | Registration | | Deployment |<-----------------+ Endpoint | | Endpoint | | Instance | +-----------+ | | | +-(F)---------------------------------->| | | | [PATCH/Update][PUT/Replace][GET/Read] | | | |<--------------------------------------+ | | | | | | | | | | +-(G)---------------------------------->| | | | [DELETE/Unregister] | | | |<--------------------------------------+ | +------------+ +--------------+
Figure 1: Figure 1: Registration Lifecycle Flow
The abstract OAuth 2.0 SCIM JIT Client Registration flow illustrated in Figure 1 describes the interaction between a software API publisher, a client developer, a deployed client software instance and the software API deployment registration services in this specification. This figure does not demonstrate error conditions. This flow includes the following steps:
Clients that need to register for more than one service API should typically make a separate registration request for each API being registered.
This specification defines a new SCIM resource type known as a Client identified using the URI urn:scim:schemas:oauth:Client:1.0. [[Note include in IANA considerations]]
For each attribute defined, a qualifier (OPTIONAL, RECOMMENDED, REQUIRED) is included that indicates the usage requirement for the client. If the word "READ-ONLY" is used, it shall mean the attribute SHOULD be server generated. String attributes and mult-valued attributes are based on the attribute types defined in Section 3.1 and 3.2 [I-D.ietf-scim-core-schema]. Unless otherwise stated, ALL client schema attributes are String based values. For example, URIs, email addresses, identifiers, are all defined as SCIM String Attributes.
Extensions and profiles of this specification MAY expand this list. Authorization servers MUST accept all fields in this schema. The authorization server MUST ignore any additional parameters sent by the client that it does not understand. Clients MAY ignore additional parameters returned by the Server that the client does not understand.
The following is a list of attributes that MUST have only a SINGLE value.
Additional values can be defined via the IANA OAuth Token Endpoint Authentication Methods registry
Section 6.1. Absolute URIs can also be used as values for this parameter. If unspecified or omitted, the default is client_secret_basic, denoting HTTP Basic Authentication Scheme as specified in Section 2.3.1 of OAuth 2.0.The following is a list of SCIM multi-valued attributes that MAY be part of a Client resource.
Authorization servers MAY allow for other values as defined in grant type extensions to OAuth 2.0. The extension process is described in OAuth 2.0 Section 2.5, and the value of this parameter MUST be the same as the value of the
grant_type parameter passed to the Token Endpoint defined in the extension.Authorization servers MAY allow for other values as defined in response type extensions to OAuth 2.0. The extension process is described in OAuth 2.0 Section 2.5, and the value of this parameter MUST be the same as the value of the
response_type parameter passed to the Authorization Endpoint defined in the extension.{ "schemas":["urn:scim:schemas:core:1.0", "urn:scim:schemas:oauth:2.0:Client"], "id":"2060107e82-fbe3-42bd-b199-15df7081a8ae", "resourceType":"Client", "software_id":"5ed2dd14-3ef7-4655-a41d-b5bd4c5266cc", "software_version":"5.1.2.3.4", "client_name":"Example Social Client", "logo_uri":"https://client.example.org/logo.png", "jwks_uri":"https://client.example.org/my_public_keys.jwks", "token_endpoint_auth_method":"client_secret_post", "scope":"read write dolphin", "client_id":"2060107e82-fbe3-42bd-b199-15df7081a8ae", "client_secret":"Z7tk2XqLKo1CfE14374teR4V554e8JUS", "redirect_urls":[""https://client.example.org/callback", "https://client.example.org/callback2"], "targetEndpoint":"https://social.example.com/base" }
Figure 2: Example Client Resource
The following is a non-normative example of a fully populated SCIM OAuth 2.0 client registration in JSON format.
The grant_types and response_types values described above are partially orthogonal, as they refer to arguments passed to different endpoints in the OAuth protocol. However, they are related in that the grant_types available to a client influence the response_types that the client is allowed to use, and vice versa. For instance, a grant_types value that includes authorization_code implies a response_types value that includes code, as both values are defined as part of the OAuth 2.0 Authorization Code Grant. As such, a server supporting these fields SHOULD take steps to ensure that a client cannot register itself into an inconsistent state.
The correlation between the two fields is listed in the table below.
grant_types value includes: | response_types value includes: |
---|---|
authorization_code | code |
implicit | token |
password | (none) |
client_credentials | (none) |
refresh_token | (none) |
urn:ietf:params:oauth:grant-type:jwt-bearer | (none) |
urn:ietf:params:oauth:grant-type:saml2-bearer | (none) |
Extensions and profiles of this document that introduce new values to either the grant_types or response_types parameter MUST document all correspondences between these two parameter types.
[[This needs to be updated to be compatible with SCIM. There is a also a problem with how to limit the amount of localization data exchange for an instance registration. Note that mobile clients tend to only need one preferred language while web clients represent many clients and may have more than 20 languages to support.]]
Human-readable Client Metadata values and client Metadata values that reference human-readable values MAY be represented in multiple languages and scripts. For example, the values of fields such as client_name, tos_uri, policy_uri, logo_uri, and client_uri might have multiple locale-specific values in some client registrations.
To specify the languages and scripts, BCP47 [RFC5646] language tags are added to client Metadata member names, delimited by a # character. Since JSON member names are case sensitive, it is RECOMMENDED that language tag values used in Claim Names be spelled using the character case with which they are registered in the IANA Language Subtag Registry [IANA.Language]. In particular, normally language names are spelled with lowercase characters, region names are spelled with uppercase characters, and languages are spelled with mixed case characters. However, since BCP47 language tag values are case insensitive, implementations SHOULD interpret the language tag values supplied in a case insensitive manner. Per the recommendations in BCP47, language tag values used in Metadata member names should only be as specific as necessary. For instance, using fr might be sufficient in many contexts, rather than fr-CA or fr-FR.
For example, a client could represent its name in English as "client_name#en": "My Client" and its name in Japanese as "client_name#ja-Jpan-JP": "\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u540D" within the same registration request. The authorization server MAY display any or all of these names to the Resource Owner during the authorization step, choosing which name to display based on system configuration, user preferences or other factors.
If any human-readable field is sent without a language tag, parties using it MUST NOT make any assumptions about the language, character set, or script of the string value, and the string value MUST be used as-is wherever it is presented in a user interface. To facilitate interoperability, it is RECOMMENDED that clients and servers use a human-readable field without any language tags in addition to any language-specific fields, and it is RECOMMENDED that any human-readable fields sent without language tags contain values suitable for display on a wide variety of systems.
Implementer's Note: Many JSON libraries make it possible to reference members of a JSON object as members of an Object construct in the native programming environment of the library. However, while the # character is a valid character inside of a JSON object's member names, it is not a valid character for use in an object member name in many programming environments. Therefore, implementations will need to use alternative access forms for these claims. For instance, in JavaScript, if one parses the JSON as follows, var j = JSON.parse(json);, then the member client_name#en-us can be accessed using the JavaScript syntax j["client_name#en-us"].
A registration server MAY override any value that a client requests during the registration process (including any omitted values) and replace the requested value with a server generated value or default at the server's discretion.
If a software assertion is provided the registration server SHOULD validate the assertion as per Section 4.
All calls to the registration endpoint follow the HTTP verbs defined in [I-D.ietf-scim-api].
All resources accessible through the SCIM client registration endpoint are OAuth 2.0 protected. Clients that require access to their own registration resource, MAY use the registration access token (registration_token) returned after registration, OR obtain an access token from the token server endpoint using the client credentials flow Section 4.4 [RFC6749], and scope urn:oauth:scim:api:scope:registration.
The initial access token used in the initial registration SHOULD NOT be used for this purpose of managing or updating client resources. Access to the client registration base for the purpose of adding a new registration MAY permit anonymous access as desribed in the next section.
Clients SHOULD NOT be able to access the registration resources of other clients.
Clients with expired client credentials SHOULD follow the procedures in Section 3.5.
Adding a registration follows the normal SCIM method for creating a resource (an HTTP POST) as described in Section 3.1 [I-D.ietf-scim-api].
The SCIM registration endpoint MAY support anonymous registration for those clients that have not been issued an initial access token. For those clients that have been issued a software assertion, the clients SHOULD include this assertion in the software_assertion field of the client resource being created. The Server SHOULD validate the assertion and validate the issuer, subject, audience, and expiry fields as described in Section 4.1.
For a non-normative example, see Figure 2. In the anonymous case, the HTTP Authorization header is omitted.
POST /Users HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Bearer h480djs93hd8 Content-Length: ... { "schemas":["urn:scim:schemas:core:1.0", "urn:scim:schemas:oauth:2.0:Client"], "software_id":"5ed2dd14-3ef7-4655-a41d-b5bd4c5266cc", "software_assertion":"eyJhbGciOiJSUzI1NiJ9.", "software_version":"5.1.2.3.4", "client_name":"Example Social Client", "logo_uri":"https://client.example.org/logo.png", "jwks_uri":"https://client.example.org/my_public_keys.jwks", "token_endpoint_auth_method":"client_secret_post", "scope":"read write dolphin", "redirect_urls":[""https://client.example.org/callback", "https://client.example.org/callback2"], "targetEndpoint":"https://social.example.com/base" }
Figure 2: Figure 3: Client Registration Request
A pre-authorized registration is where the client or the installer of the client has been issued an initial access token which may be used to call the SCIM registration endpoint. Clients should use the token by inserting the appropriate value in the HTTP Authorization header. Additionally, as with anonymous registrations, clients MAY include a software assertion. For example, a non-normative registration (line breaks inserted for readability):
HTTP/1.1 201 Created Content-Type: application/json Location: https://example.com/v2/Clients/2060107e82-42bd-b199-15df7081a8ae ETag: W/"e180ee84f0671b1" { "schemas":["urn:scim:schemas:core:1.0", "urn:scim:schemas:oauth:2.0:Client"], "resourceType":"Client", "id":"2060107e82-42bd-b199-15df7081a8ae", "software_id":"5ed2dd14-3ef7-4655-a41d-b5bd4c5266cc", "software_assertion":"eyJhbGciOiJSUzI1NiJ9.", "software_version":"5.1.2.3.4", "client_name":"Example Social Client", "logo_uri":"https://client.example.org/logo.png", "jwks_uri":"https://client.example.org/my_public_keys.jwks", "token_endpoint_auth_method":"client_secret_post", "scope":"read write dolphin", "client_id":"2060107e82-fbe3-42bd-b199-15df7081a8ae", "client_secret":"Z7tk2XqLKo1CfE14374teR4V554e8JUS", "redirect_urls":[""https://client.example.org/callback", "https://client.example.org/callback2"], "targetEndpoint":"https://social.example.com/base" }
Figure 4: Client Registration Response
On successful processing, the SCIM endpoint would respond with:
Clients SHOULD read the response and review and retain the following items:
When a server receives a GET request from an HTTP client whose access token is assigned to the OAuth 2.0 client that is the subject of the registration, the server MAY elect to rotate the client credential (e.g. client_secret) or other relevant attributes. If the access request is not from the registered client (such as an administrator), the server SHOULD NOT change any registration values. [[should the server mask anything?]]
Reading a client resource is done using the SCIM HTTP GET verb as defined in Section 3.2 [I-D.ietf-scim-api]
GET /Clients/? filter=client_id%20eq%2060107e82-fbe3-42bd-b199-15df7081a8ae Host: example.com Accept: application/json Authorization: Bearer deadbeef
Figure 3: Figure 5: Retrieving a Registration
A client resource may be retrieved using the "location" returned from the original client registration. The registration MAY be retrieved directly using this URL. If the location is not available, the current values of the registration can be obtained by querying this URL, or by searching the "/Clients" with a query parameter for client_id that corresponds to the client's client_id.
HTTP/1.1 200 OK Content-Type: application/json { "totalResults":1, "schemas":["urn:scim:schemas:core:1.0", "urn:scim:schemas:oauth:Client:1.0"], "Resources":[ { "id":"2060107e82-fbe3-42bd-b199-15df7081a8ae", "resourceType":"Client", "software_id":"5ed2dd14-3ef7-4655-a41d-b5bd4c5266cc", "software_version":"5.1.2.3.4", "client_name":"Example Social Client", ... "token_endpoint_auth_method":"client_secret_post", "client_id":"2060107e82-fbe3-42bd-b199-15df7081a8ae", "client_secret":"Z7tk2XqLKo1CfE14374teR4V554e8JUS" } ] }
Figure 6: Retrieving Registration Response
If found, the server will respond with a HTTP 200 message containing a single client resource, with one or more attributes:
If no resource is found, the server will respond with a HTTP 200 message containing zero result resources.
When a client returns its own record, clients should check for updates to the following items:
Modification of a client resource can be done using the SCIM PUT or PATCH verbs as defined in Section 3.3 [I-D.ietf-scim-api].
When a server receives a PUT or PATCH request from an HTTP client whose access token is assigned to the OAuth 2.0 client that is the subject of the registration, the server MAY elect to rotate the client credential (e.g. client_secret) or other relevant attributes.
De-registration of a client resource can be done using the SCIM DELETE verbs as defined in Section 3.4 [I-D.ietf-scim-api]. When a delete is completed, all associated client credentials and access tokens MUST be revoked or invalidated.
An expired registration occurs when the client's credential has expired, or has been revoked by the registration service. On expiry, access tokens issued to the client MUST be revoked or invalidated.
If, on registration, the client was returned a registration access token (registration_token), the client MAY obtain new credentials by simply retrieving its client profile using the registration token and the SCIM GET verb at the location returned after the initial registration (see Figure 3).
Clients that do not have a valid registration access token MAY re-register as a new client instance. In such case, the client MAY include it's existing client_idin its client meta data as client_idfor tracking purposes only. In such cases, the old client_id SHOULD NOT be re-activated and the server SHOULD issue a new client_id value.
A software assertion is an 'authorization' bearer JSON Web Token as defined in Section 2.1 [OAuth.JWT]. While the software assertion is a JWT authorization token, it SHOULD not be used with the authorization server token endpoint. It is used by the client registration endpoint for the purpose of registration. A software assertion is a statement of claims about the client software being registered and SHOULD NOT be used as an authentication of the software.
Software assertions may be generated by a software API publisher for the purpose of allowing a developer to incorporate a signed assertion that can be used to register client software at more than one Software API deployment.
In order to create and validate a software assertion, the following requirements apply in addition to those stated in Section 3 [OAuth.JWT].
[[This section to be revised pending clarification of schema extensions methodology in draft-ietf-core-schema]]
[ ... { "name": "Client", "endpoint": "/Clients", "schema": "urn:scim:schemas:oauth:2.0" }, ... ]
Figure 7: Client Resource Type
The following is a normative JSON representation of a SCIM ResourceType representing a client resorce in a SCIM server returned by querying GET [scimendpoint}/ResourceTypes. "..." indicates other ResourceTypes removed for clarity.
{ "id":"urn:scim:schemas:oauth:2.0:Client", "name":"Client", "description":"OAuth 2 Client", "schema":["urn:scim:core:1.0", "urn:scim:schemas:oauth:2.0"], "endpoint":"/Clients", "attributes":[ { "name":"id", "type":"string", "multiValued":false, "description":"Unique identifier for the SCIM resource....", "readOnly":true, "required":true, "caseExact":false }, { "name":"client_id", "type":"string", "multiValued":false, "description": "OAuth 2.0 client_id assigned to the registered client.", "readOnly":false, "required":false, "caseExact":true }, { "name":"software_assertion", "type":"string", "multiValued":false, "description": "A signed JWT assertion about the client.", "readOnly":false, "required":false, "caseExact":true }, { "name":"software_id", "type":"string", "multiValued":false, "description":"Unique identifier for client software.", "readOnly":false, "required":false, "caseExact":true }, { "name":"software_version", "type":"string", "multiValued":false, "description":"A version identifier for the software.", "readOnly":false, "required":false, "caseExact":true }, { "name":"client_name", "type":"string", "multiValued":false, "description":"A human readable name of the client.", "readOnly":false, "required":false, "caseExact":true }, { "name":"client_secret", "type":"string", "multiValued":false, "description": "A client secret assigned by the registration endpoint.", "readOnly":true, "required":false, "caseExact":true }, { "name":"client_uri", "type":"string", "multiValued":false, "description": "URL of homepage for client(displayable to an end-user).", "readOnly":false, "required":false, "caseExact":true }, { "name":"jwks_uri", "type":"string", "multiValued":false, "description":"A URL for the client's JSON Web Key Set.", "readOnly":false, "required":false, "caseExact":true }, { "name":"logo_uri", "type":"string", "multiValued":false, "description":"A URL that references a logo image for client.", "readOnly":false, "required":false, "caseExact":true }, { "name":"policy_uri", "type":"string", "multiValued":false, "description": "A URL of a human-readable policy document for the client.", "readOnly":false, "required":false, "caseExact":true }, { "name":"registration_token", "type":"string", "multiValued":false, "description": "A token issued to client for updating its registration.", "readOnly":true, "required":false, "caseExact":true }, { "name":"scope", "type":"string", "multiValued":false, "description":"Registered OAuth 2 scopes the client uses.", "readOnly":false, "required":false, "caseExact":true }, { "name":"targetEndpoint", "type":"string", "multiValued":false, "description": "The OAuth2 resource endpoint the client intends to access.", "readOnly":false, "required":false, "caseExact":true }, { "name":"token_endpoint_auth_method", "type":"string", "multiValued":false, "description":"OAuth 2 Token Endpoint authorization method.", "readOnly":false, "required":false, "caseExact":true }, { "name":"tos_uri", "type":"string", "multiValued":false, "description": "A URL pointing to a human readable terms of service.", "readOnly":false, "required":false, "caseExact":true }, { "name":"contacts", "type":"string", "multiValued":true, "description": "One or more email addresses of contacts for client.", "readOnly":false, "required":false, "caseExact":true }, { "name":"redirect_uris", "type":"string", "multiValued":true, "description":"One or more OAuth 2 redirect URI values.", "readOnly":false, "required":false, "caseExact":true }, { "name":"grant_types", "type":"string", "multiValued":true, "description": "One or more OAuth 2 grant types the client may use.", "readOnly":false, "required":false, "caseExact":true }, { "name":"response_types", "type":"string", "multiValued":true, "description":"One or more OAuth 2 response types.", "readOnly":false, "required":false, "caseExact":true }, ] }
Figure 8: Client Schema Representation
The following is a normative exammple of the SCIM Schema for a client in JSON format returned when querying GET {scimendpoint}/Schemas.
This specification establishes the OAuth Token Endpoint Authentication Methods registry.
Additional values for use as token_endpoint_auth_method metadata values are registered with a Specification Required ([RFC5226]) after a two-week review period on the oauth-ext-review@ietf.org mailing list, on the advice of one or more Designated Experts. However, to allow for the allocation of values prior to publication, the Designated Expert(s) may approve registration once they are satisfied that such a specification will be published.
Registration requests must be sent to the oauth-ext-review@ietf.org mailing list for review and comment, with an appropriate subject (e.g., "Request to register token_endpoint_auth_method value: example").
Within the review period, the Designated Expert(s) will either approve or deny the registration request, communicating this decision to the review list and IANA. Denials should include an explanation and, if applicable, suggestions as to how to make the request successful.
IANA must only accept registry updates from the Designated Expert(s) and should direct all requests for registration to the review mailing list.
The OAuth Token Endpoint Authentication Methods registry's initial contents are:
Since requests to the client registration endpoint result in the transmission of clear-text credentials (in the HTTP request and response), the server MUST require the use of a transport-layer security mechanism when sending requests to the registration endpoint. The server MUST support TLS 1.2 RFC 5246 [RFC5246] and/or TLS 1.0 [RFC2246] and MAY support additional transport-layer mechanisms meeting its security requirements. When using TLS, the client MUST perform a TLS/SSL server certificate check, per RFC 6125 [RFC6125].
Since the SCIM client configuration endpoint is an OAuth 2.0 protected resource, it SHOULD have some rate limiting on failures to prevent initial access tokens from being disclosed though repeated access attempts.
For clients that use redirect-based grant types such as Authorization Code and Implicit, authorization servers SHOULD require clients to register their redirect_uris. Requiring clients to do so can help mitigate attacks where rogue actors inject and impersonate a validly registered client and intercept its authorization code or tokens through an invalid redirect URI.
The authorization server MUST treat all client metadata, including software assertions, as self-asserted. A rogue client might use the name and logo for the legitimate client, which it is trying to impersonate. An authorization server needs to take steps to mitigate this phishing risk, since the logo could confuse users into thinking they're logging in to the legitimate client. For instance, an authorization server could warn if the domain/site of the logo doesn't match the domain/site of redirect URIs. An authorization server can also present warning messages to end users about untrusted clients in all cases, especially if such clients have been dynamically registered and have not been trusted by any users at the authorization server before.
Authorization servers MAY assume that registered client software sharing the same software assertion, software_id, and other metadata SHOULD have similar operational behaviour metrics. Similarly, Authorization server administrators MAY use software_id and software_version to facilitate normal change control and approval management of client software including:
In a situation where the authorization server is supporting open client registration, it must be extremely careful with any URL provided by the client that will be displayed to the user (e.g. logo_uri, tos_uri, client_uri, and policy_uri). For instance, a rogue client could specify a registration request with a reference to a drive-by download in the policy_uri. The authorization server SHOULD check to see if the logo_uri, tos_uri, client_uri, and policy_uri have the same host and scheme as the those defined in the array of redirect_uris and that all of these resolve to valid Web pages.
Access tokens issued to clients to facilitate update or retrieval of client registrations SHOULD be short lived.
Clients SHOULD rotate their client credentials before they expire by obtaining an access token from the authorization server using the registration scope. If a client has not successfully rotated its credential prior to expiry, the client MUST register as a new client.
If a client is deprovisioned from a server (due to expiry or de-registration), any outstanding Registration Access Token for that client MUST be invalidated at the same time. Otherwise, this can lead to an inconsistent state wherein a client could make requests to the client configuration endpoint where the authentication would succeed but the action would fail because the client is no longer valid.
Clients that are unable to retain a client credential for the life of the client instance MAY NOT register and should continue to be treated as Public clients as defined by OAuth 2.0.
This draft was based upon in large part upon the work in draft-ietf-oauth-dyn-reg-12. The author would like to thank Justin Richter and the members of the OAuth Working Group.
In turn, the authors thank the OAuth Working Group, the User-Managed Access Working Group, and the OpenID Connect Working Group participants for their input to this document. In particular, the following individuals have been instrumental in their review and contribution to various versions of this document: Amanda Anganes, Tim Bray, Domenico Catalano, Donald Coffin, George Fletcher, Thomas Hardjono, Torsten Lodderstedt, Eve Maler, Josh Mandel, Nov Matake, Nat Sakimura, Christian Scholz, and Hannes Tschofenig.
[[ to be removed by the RFC editor before publication as an RFC ]]
-00