Home / Specifications / cdsc-wg1-02
- Client Registration
Client Registration
Looking for a more human-readable summary of this specification? Check out our overview.
Below is a rendering of the original specification source: https://github.com/daniel-utilityapi/Connectivity/blob/main/specifications/cdsc-wg1-02.md
CDSC-WG1-02 - Client Registration
Abstract đź”—
This specification defines how utilities and other central entities (“Servers”) may allow third parties (“Clients”) to register, configure, and maintain connectivity with the utility or other central entity. This specification mostly extends various OAuth specifications (Dynamic Client Registration, Authorization Server Metadata, and more) to create a robust framework for offering secure, streamlined, and standardized connectivity between utilities and third parties.
Status đź”—
WARNING: This specification is a DRAFT and has not achieved consensus by the working group.
Copyright đź”—
TODO
Table of Contents đź”—
- 1. Introduction
- 2. Terminology
- 3. Authorization Server Metadata
- 4. Client Registration Process
- 5. Clients API
- 6. Client Settings API
- 7. Client Updates API
- 8. Scope Credentials API
- 9. Grants API
- 10. Directory API
- 11. Extensions
- 12. Examples
- 13. Security Considerations
- 14. References
- 15. Acknowledgments
- 16. Authors’ Addresses
1. Introduction đź”—
This specification was developed as part of the global effort to combat the climate crisis. Specifically, in order to scalably measure carbon emissions of organizations and calculate the impact of deploying and operating clean energy technologies, companies need an efficient means to register and interact with energy utilities and other similar entities.
There are thousands of utilities serving customers across the world, and each have their own way of providing access to privileged functionality and data. This specification defines a way for these utilities and other entities (“Servers”) to provide a standardized, structured process for external users and companies (“Clients”) to register and obtain secure access to privileged functionality and data. By offering a standardized Client registration and management protocol, utilities and other entities can enable secure interoperability with other external systems providing climate-change fighting services such as carbon tracking, decarbonization measures, grid flexibility capabilities, and energy benchmarking.
This specification does NOT describe what specific privileged functionality or data is offered to Clients as part of their registration. Instead, relevant stakeholders are encouraged to write Extensions to this specification that enable various use cases that need access to privileged functionality or data. For example, this specification may be extended to define a method for Clients to be able to access customer-authorized energy usage data.
2. Terminology đź”—
🔗 “Server” - The entity hosting the specified endpoints. A Server can be an energy utility or another type of entity that want to provide access to privileged functionality or data. These entities can include, but are not limited to, distribution utilities, grid operators, electric retailers, community choice aggregators, government agencies, data warehouses, and private infrastructure providers.
🔗 “Client” - The entity requesting Server’s metadata endpoints. A Client can be any organization or user seeking to register with a Server for a specific scope of access. These entities can include, but are not limited to, carbon tracking applications, electric vehicle companies, clean energy technology providers, commercial utility customers, grid management applications, and energy efficiency organizations.
🔗 Referenced Technologies: “HTTPS”, “URL”, “Request Methods”, “Status Codes”, “JSON”, “OAuth”, TODO: add more as needed are defined by their referenced standards documents.
🔗 Key Words: “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” are defined in accordance with BCP 14.
3. Authorization Server Metadata đź”—
To enable automated Client registration, Servers MUST host an endpoint with structured metadata about how to submit a registration request, as well as functionality and data capabilities offered by the Server. The requirements for hosting this metadata endpoint follows OAuth 2.0 Authorization Server Metadata with several additions for Carbon Data Specification (CDS) functionality described in the following sections.
3.1. Metadata URL đź”—
Following OAuth’s Obtaining Authorization Server Metadata process, a Server’s Authorization Server Metadata Object is retrieved by making an HTTPS request to a specified URL.
To ensure discoverability to the specified URL, this specification extends CDSC-WG1-01 Server Capabilities to require the following values:
oauth
- string - (REQUIRED) Including Client Registration via OAuth in the list of a Server’s available capabilities
As well as extending the CDSC-WG1-01 Metadata Object Format to require the following values:
oauth_metadata
- URL - (REQUIRED) Where Clients can obtain the Server’s Authorization Server Metadata Object
In addition to requiring that the URL be included in the CDSC-WG1-01 Metadata Object Format, Servers MAY also configure the URL such that it conforms to the default Well-Known URI format, which can increase interoperability beyond the above specified CDSC-WG1-01 extension.
3.2. Metadata Object Format đź”—
A Server’s Authorization Server Metadata Object follows OAuth’s Authorization Server Metadata object format with the following modifications from OPTIONAL or RECOMMENDED to REQUIRED:
registration_endpoint
- URL - (REQUIRED) OAuth’s Dynamic Client Registration functionality is required to enable the Client Registration Process.scopes_supported
- Array[string] - (REQUIRED) Disclosure of available scopes is required to enable integration capabilities into other platforms. This array MUST contain theclient_admin
scope.service_documentation
- URL - (REQUIRED) Developer documentation is required by the Server to help streamline Client integration.op_policy_uri
- URL - (REQUIRED) Policies for Clients registering is required.op_tos_uri
- URL - (REQUIRED) Terms of use for Clients registering is required.revocation_endpoint
- URL - (REQUIRED) OAuth’s Token Revocation functionality is required.introspection_endpoint
- URL - (REQUIRED) OAuth’s Token Introspection functionality is required.code_challenge_methods_supported
- Array[string] - (REQUIRED) OAuth’s Proof Key for Code Exchange by OAuth Public Clients functionality is required. Servers MUST offerS256
and MUST NOT offerplain
code verifier methods.
In addition to the standard set of OAuth Authorization Server Metadata values, this specification also requires the following OAuth extension capabilities to be included in the metadata object values:
authorization_details_types_supported
- Array[string] - (REQUIRED) OAuth’s Rich Authorization Requests functionality is required. This array of values MUST be the same asscopes_supported
.pushed_authorization_request_endpoint
- URL - (REQUIRED) OAuth’s Pushed Authorization Requests functionality is required.
In addition to the above additionally required set of OAuth Authorization Server Metadata values, this specification clarifies use of the following OAuth sandard values:
response_types_supported
- Array[string] - (REQUIRED) The response types in this array MUST represent a union of allresponse_types_supported
values contained in thecds_scope_descriptions
object.grant_types_supported
- Array[string] - (REQUIRED) The response types in this array MUST represent a union of allgrant_types_supported
values contained in thecds_scope_descriptions
object.token_endpoint_auth_methods_supported
- Array[string] - (REQUIRED) The response types in this array MUST represent a union of alltoken_endpoint_auth_methods_supported
values contained in thecds_scope_descriptions
object.
In addition to OAuth capabilities included in the metadata object, this specification adds the following Carbon Data Specification (CDS) values:
cds_oauth_version
- string - (REQUIRED) The version of the CDS-WG1-02 Client Registration specification that the Server has implemented, which for this version of the specification isv1
cds_human_registration
- URL - (REQUIRED) Where Clients who do not have the technical capacity to use theregistration_endpoint
can visit to manually register a Client using a web browsercds_human_directory
- URL - (REQUIRED) A public web interface where users may browse the list of Clients who have registered and set their Client Settingsprofile_visibility
tolisted
cds_test_accounts
- URL - (REQUIRED) Where Clients can find developer documentation on what test account credentials may be used for testing OAuthresponse_type=code
authorization requestscds_clients_api
- URL - (REQUIRED) The base url for the Clients APIcds_client_settings_api
- URL - (REQUIRED) The base url for the Client Settings APIcds_client_updates_api
- URL - (REQUIRED) The base url for the Client Updates APIcds_scope_credentials_api
- URL - (REQUIRED) The base url for the Scope Credentials APIcds_grants_api
- URL - (REQUIRED) The base url for the Grants APIcds_directory_api
- URL - (REQUIRED) The base url for the Directory APIcds_scope_descriptions
- Map[ScopeDescription] - (REQUIRED) An object providing additional information about what Scope values listed inscopes_supported
mean. This object MUST include a key for each Scope listed inscopes_supported
with a Scope Description as that key’s value.cds_registration_fields
- Map[RegistrationField] - (REQUIRED) An object providing additional information about Registration Field that are referenced in Scope Description’sregistration_requirements
list. This object MUST include a key for each Registration Fieldid
included in theregistration_requirements
lists in the metadata object with a Registration Field as that key’s value. If allregistration_requirements
lists are empty, this reference object is an empty object ({}
).
Other values not mentioned here but listed in specifications for the Authorization Server Metadata specification or other extensions MAY be included as described in their respective specifications.
3.3. Scope Descriptions Object Format đź”—
Scope Description objects are formatted as JSON objects and contain named values. The following values are included in the default list available in scope description objects.
id
- string - (REQUIRED) The unique identifier of the scope. This MUST be the same value as the object key the Metadata Object’scds_scope_descriptions
object.name
- string - (REQUIRED) A human-readable name of the scope.description
- string - (REQUIRED) A human-readable description of what access or actions the scope will enable.documentation
- URL - (REQUIRED) Where developers can find documentation for the scope.registration_requirements
- Array[string] - (REQUIRED) A list of any registration fields that MUST be submitted with Client Registration Requests or requirements that must be completed after registration before the scope is available to use in the Server’s production environment. All values in this array MUST be included in the Metadata Object’scds_registration_fields
object for a complete description of the requirement. If no additional requirements are needed, this value is an empty array ([]
).registration_optional
- Array[string] - (REQUIRED) A list of any registration fields that Clients MAY submit with the Client Registration Requests. If no additional fields are available, this value is an empty array ([]
).response_types_supported
- Array[string] - (REQUIRED) The OAuthresponse_type
values that can be used with this scope. This value follows the same behavior as OAuth’s Metadata objectresponse_types_supported
, except that this value represents the response types supported for this individual scope and not all scopes for the Client. If a scope is not available for OAuth authorization requests (e.g. aclient_credentials
-only scope), this value is an empty array ([]
).grant_types_supported
- Array[string] - (REQUIRED) The OAuth grant type values that can be used with this scope. This value follows the same behavior as OAuth’s Metadata objectgrant_types_supported
, except that this value represents the grant types supported for this individual scope and not all scopes for the Client. This array MUST contain at least one grant type.token_endpoint_auth_methods_supported
- Array[string] - (REQUIRED) The OAuth client authentication methods that can be used for granting tokens with this scope. This value follows the same behavior as OAuth’s Metadata objecttoken_endpoint_auth_methods_supported
, except that this value represents the client authentication methods supported for this individual scope and not all scopes for the Client. A value of"none"
this array indicates that the scope may be used for public application without using a client secret.authorization_details_fields
- Array[AuthorizationDetailsField] - (REQUIRED) A list of fields that MAY be included in Rich Authorization Requests the authorization details object for this scopetype
. If no extra authorization details fields are available, this value is an empty list ([]
).
3.4. Registration Field Object Format đź”—
Registration Field objects are formatted as JSON objects and contain named values. The following values are included in the default list available in registration fields objects.
id
- string - (REQUIRED) The unique identifier of the registration field. This MUST be the same value as the object key the Metadata Object’scds_registration_fields
object.type
- RegistrationFieldType - (REQUIRED) What type of Registration Field this entry is.description
- string - (REQUIRED) A human-readable description of what should be submitted or expected for this registration field.documentation
- URL - (REQUIRED) Where developers can find more information about this registration field.field_name
- string - (OPTIONAL) If type isregistration_field
, this is the name of the field to submit in the Client Registration Request and MUST start withcds_
.format
- RegistrationFieldFormats - (OPTIONAL) If type isregistration_field
, this is the data format that MUST be used in the value of the field.default
- various - (OPTIONAL) If type isregistration_field
and the field is optional, this is the default value that will be used in lieu of the Client submitting a value themselves. Including thisdefault
value in the object indicates the registration field is optional.max_length
- integer - (OPTIONAL) If format is one ofstring
,string_or_null
,url
,url_or_null
,email
, oremail_or_null
, this is the maximum length of the submitted value, if notnull
.max_size
- integer - (OPTIONAL) If format is one ofimage
,image_or_null
,pdf
, orpdf_or_null
, this is the maximum file size of the submitted value before encoding into Base64, if notnull
.amount
- decimal - (OPTIONAL) If type ispayment_required
, this is the amount incurrency
that will be required to complete registration.currency
- string - (OPTIONAL) If type ispayment_required
, this is the monetary currency in ISO 4217 currency code.
3.5. Registration Field Types đź”—
Registration Field types define which type of action the Client or Server will take for that registration field. Registration Fields can be either something that MUST or MAY be submitted as part of the Client Registration Request, depending on the submitted scope’s registration_requirements
and registration_optional
values, or can be something that a Client must do after registration in order to be full approved for use in the production environment.
The following list of strings are an enumerated set of registration field types that are valid type
values in the registration field object.
registration_field
- This field should be submitting with the Client Registration Request as thefield_name
. This type of registration field MUST also havefield_name
andformat
values. If this field is optional as part of registration,default
must also be defined in the registration field object.manual_review
- This field indicates that the Server will manually review the registration before approving it for production use. Notifications and communication about the status of this manual review will be conveyed using the Client Updates API.payment_required
- This field indicates that a setup payment will be required before the Server will approve the Client for production use. Notifications and communication about how to pay and confirmation of payment will be conveyed using the Client Updates API.email_verification
- This field indicates that the Client must verify their email before the Server will approve the Client for production use. Notifications and communication about how to verify the Client’s contact email will be conveyed using the Client Updates API.
3.6. Registration Field Formats đź”—
Registration Field formats define the data type of submitted values for these fields in Client Registration Requests.
The following list of strings are an enumerated set of registration field formats that are valid format
values in the registration field object.
string
- If required, a string value MUST be submitted.string_or_null
- Same asstring
, only withnull
being an additional possible value.url
- If required, a URL value MUST be submitted.url_or_null
- Same asurl
, only withnull
being an additional possible value.email
- If required, a valid email address string MUST be submitted.email_or_null
- Same asemail
, only withnull
being an additional possible value.boolean
- If required, eithertrue
orfalse
MUST be submitted.boolean_or_null
- Same asboolean
, only withnull
being an additional possible value.image
- If required, a valid image file formatted asimage/jpeg
orimage/png
encoded as a string using Base64 MUST be submitted.image_or_null
- Same asimage
, only withnull
being an additional possible value.pdf
- If required, a valid pdf file formatted encoded using Base64 as a string MUST be submitted.pdf_or_null
- Same aspdf
, only withnull
being an additional possible value.
3.7. Authorization Details Field Object Format đź”—
Authorization Details Field objects are formatted as JSON objects and contain named values. The following values are included in the default list available in authorization details field objects.
id
- string - (REQUIRED) The unique identifier of the authorization details field. This value is used as the key for the field when added toauthorization_details
data fields as part of OAuth’s Rich Authorization Requests.name
- string - (REQUIRED) A human-readable name of the authorization details field.description
- string - (REQUIRED) A human-readable description of what submitting values for this authorization details field means.documentation
- URL - (REQUIRED) Where developers can find more information about this authorization details field.format
- AuthorizationDetailsFieldFormats - (OPTIONAL) The data format that MUST be used in the value of the field when including it as a data field inauthorization_details
objects.default
- various - (REQUIRED) The default value that will be used in lieu of the Client submitting a value themselves. This is also the value that will be used if a basic OAuthscope
string parameter is used instead of anauthorization_details
parameter.relative_date_limit
- integer - (OPTIONAL) Ifformat
isrelative_or_absolute_date
, this is the largest relative date range that may be submitted. Servers MUST validate both submitted absolute dates and relative dates against the relative date limit, where when comparing to a submitted absolute date, the current Server date in the Server’s local timezone is used as the relative point of reference.absolute_date_limit
- integer - (OPTIONAL) Ifformat
isrelative_or_absolute_date
, this is the furthest away date that may be submitted. Servers MUST validate both submitted absolute dates and relative dates against the absolute date limit, where when comparing to a submitted relative date, the current Server date in the Server’s local timezone is used as the relative point of reference.limit
- integer - (OPTIONAL) If format is one ofint
ordecimal
, this is the largest value that can be the submitted.
3.8. Authorization Details Field Formats đź”—
Authorization Details Field formats define the data type of submitted values for these fields in authorization_details
for OAuth’s Rich Authorization Requests.
The following list of strings are an enumerated set of authorization details field formats that are valid format
values in the Authorization Details Field objects.
relative_or_absolute_date
- A relative or absolute date string. Relative dates are formatted as a positive integer followed by ay
,m
,w
, ord
character, where the character represents the unit of duration (year, month, week, and day), and the integer represents the number of units for that duration. For example,3y
represents a relative date range of 3 years. Absolute dates are formatted as ISO8601 dates (YYYY-MM-DD
). For example,2024-01-02
represents the 2nd of January, 2024. Dates are defined as the date from the perspective of the Server’s local timezone.int
- An integer value.decimal
- A decimal value, which can have any number of significant units, but MUST NOT be stored or handled as a float value, in order to retain the precision of the value throughout Server and Client processing.
4. Client Registration Process đź”—
OAuth’s Dynamic Client Registration is used as the basis for initially registering Clients with Servers. To perform the dynamic registration process, the Client submits a request to the Server’s registration_endpoint
provided in the Server’s Metadata object as described in Client Registration Request. The Server then responds with either an error or a generated Client registration response as described in Client Registration Response.
4.1. Client Registration Request đź”—
This specification requires Clients and Servers follow the process described in OAuth’s Client Registration Request, with the following modifications.
- Clients MAY submit additional named values that are defined as part of scope
registration_requirements
andregistration_optional
arrays incds_scope_descriptions
objects, using the registration field reference’sfield_name
value as the submitted key in the registration request.
4.2. Client Registration Response đź”—
This specification requires Servers follow the process described in OAuth’s Client Registration Response, with the following modifications to OAuth’s Client Information Response object.
- A
client_secret
value MUST be present in the response and be limited toclient_admin
scope use only. - The
scope
value MUST include theclient_admin
scope. - The
redirect_uris
,grant_types
, andresponse_types
values, if included, MUST be dynamically determined by the Server as a union of all of their respective values in the Client’s Scope Credentials. - The
token_endpoint_auth_method
MUST always be set toclient_secret_basic
.
Additionally, the following additional named values MUST be included in the response.
cds_server_metadata
- URL - (REQUIRED) Where the Client can find their registration-specific version of the CDSC-WG1-01 Server Metadata. If the Client’s CDSC server metadata is no different from the public CDSC server metadata, Servers MAY simply link to the public URL. If this metadata endpoint requires authentication, Servers MUST authenticate Client requests to this endpoint via Bearer access token obtained using OAuth’sclient_credentials
grant with a scope ofclient_admin
, and reject unauthenticated requests with a401 Unauthorized
response code. Clients know that they must use a Bearer token when Servers return a401
response code for this endpoint when the Client makes an unauthenticated request to the endpoint.cds_clients_api
- URL - (REQUIRED) The base url for the Clients API.cds_client_settings_api
- URL - (REQUIRED) The url to a Client’s Settings object for the Client Settings API.cds_client_updates_api
- URL - (REQUIRED) The base url for the Client Updates API.cds_scope_credentials_api
- URL - (REQUIRED) The base url for the Scope Credentials API.cds_grants_api
- URL - (REQUIRED) The base url for the Grants API.
Upon valid registration, Servers MUST generate a listed Scope Credential that is scoped to only client_admin
, where the value of the Scope Credential’s client_secret
and the registration response client_secret
are the same. Servers MUST also create listed Scope Credentials that cover all additional valid scopes submitted, if any, where the Scope Credential objects are grouped by scopes that have the same response_types
, grant_types
, and token_endpoint_auth_method
so as to maximize the number of scopes that may be accessed using the same client_secret
.
Severs MUST assign the submitted redirect_uris
to all Scope Credentials in the Scope Credentials API that have response_types
. Clients MAY subsequently manage which redirect_uris
values are assigned to specific Scope Credentials using the Scope Credentials API.
While Servers MAY support OAuth’s Dynamic Client Registration Management Protocol by including the registration_client_uri
and registration_access_token
values in their registration response, this specification requires that Servers MUST support the Clients API by including the cds_clients_api
value in the registration response as a way for Clients to manage their registrations.
5. Clients API đź”—
This specification requires Servers provide a set of Application Programming Interfaces (APIs) allowing Clients to view and edit their Client registrations. These APIs are authenticated using a Bearer access_token
granted to Clients using OAuth’s client_credentials
grant and the client_secret
provided in the initial Client Registration Response or client_secret
values from the Scope Credentials API that include the client_admin
scope.
5.1. Client Object Format đź”—
Client objects are formatted as JSON objects and contain named values. Client objects are required to follow the same object format as the Client Registration Response, with the addition of the following named values.
cds_created
- ISO8601 datetime - (REQUIRED) When the Client was created.cds_modified
- ISO8601 datetime - (REQUIRED) When the Client was last modified.cds_client_uri
- URL - (REQUIRED) Where to submit modifications using the Clients API Modifying Clients functionality. Servers MUST make this URL unique for each Client registration.
Additionally, while the Client Registration Response MUST contain the client_secret
field. Client objects returned from the Clients API MUST NOT include the client_secret
or client_secret_expires_at
fields. Clients MUST instead use the Scope Credentials API to obtain client_secret
values for use in other APIs.
5.2. Listing Clients đź”—
Clients may request to list Client objects that they have access to by making an HTTPS GET
request, authenticated with a valid Bearer access_token
scoped to the client_admin
scope, to the cds_clients_api
URL included in the Client Registration Response. The Client listing request responses are formatted as JSON objects and contain the following named values.
clients
- Array[Client] - (REQUIRED) A list of Clients to which the requestingaccess_token
is scoped to have access. If no Clients are accessible, this value is an empty list ([]
). If more than 100 Clients are available to be listed, Servers MAY truncate the list and use thenext
value to link to the next segment of the list of Clients.next
- URL ornull
- Where to request the next segment of the list of Clients. If no next segment exists (i.e. the requester is at the end of the list), this value isnull
.previous
- URL ornull
- Where to request the previous segment of the list of Clients. If no previous segment exists (i.e. the requester is at the front of the list), this value isnull
.
Listings of Client objects MUST be ordered in reverse chronological order by cds_modified
timestamp, where the most recently updated relevant Client MUST be first in each listing.
5.3. Retrieving Individual Clients đź”—
The URL to be used to send GET
requests for retrieving individual Client objects MUST be the cds_client_uri
provided in the Client object. If a Server has optionally implemented OAuth’s Dynamic Client Registration Management Protocol, the value of cds_client_uri
MUST be the same as registration_client_uri
, and access tokens issued from either a client_credentials
grant with the scope client_admin
or the access token provided as the registration_access_token
MUST be valid access tokens to interact with the client retrieval endpoint (cds_client_uri
).
5.4. Modifying Clients đź”—
This specification requires that the procedure to modify Clients MUST follow OAuth’s Client Update Request section in Dynamic Client Registration Management Protocol.
The URL to be used to send PUT
requests for updating clients MUST be the cds_client_uri
provided in the Client object. If a Server has optionally implemented OAuth’s Dynamic Client Registration Management Protocol, the value of cds_client_uri
MUST be the same as registration_client_uri
, and access tokens issued from either a client_credentials
grant with the scope client_admin
or the access token provided as the registration_access_token
MUST be valid access tokens to interact with the client update endpoint.
Servers MUST ignore updated values to the following fields and keep the Server-defined values set:
client_id
- This value is immutable from when it was assigned upon Client registration.client_id_issued_at
- This value is immutable from when the Client initially registered.client_secret
- This value is NOT included in any Client object response, except for the initial Client registration request. Clients MUST use the Scope Credentials API to manage client secrets.client_secret_expires_at
- This value is NOT included in any Client object response, except for the initial Client registration request. Clients MUST use the Scope Credentials API to discover when a client secret will expire.redirect_uris
- This list is dynamically determined by the Server as a union of allredirect_uris
values in the Client’s Scope Credentials.grant_types
- This list is dynamically determined by the Server as a union of allgrant_types
values in the Client’s Scope Credentials.response_types
- This list is dynamically determined by the Server as a union of allresponse_types
values in the Client’s Scope Credentials.token_endpoint_auth_method
- Alwaysclient_secret_basic
.cds_server_metadata
- This is a URL set by the Server.cds_clients_api
- This is a URL set by the Server.cds_client_settings_api
- This is a URL set by the Server.cds_client_updates_api
- This is a URL set by the Server.cds_scope_credentials_api
- This is a URL set by the Server.cds_grants_api
- This is a URL set by the Server.
All other fields MAY be submitted for updating by the Client. However, the Server MUST determine the validity of the submitted Client fields and reject with a 400 Bad Response if not all submitted fields are either the same as previously set, or invalid values for that field.
If a Client does not include a field that is included in the Client object, this indicates that the Client wishes to reset the value of that field to the Server default.
If a Server needs to asynchronously review and approve changes to any submitted Client object fields that have been submitted by the Client and are different from the current values, for valid update requests the Server MUST respond with a 202 Accepted
response, which indicates that the submission was accepted but not fully saved as completed yet. Any fields that have not been synchronously updated as part of the request and response MUST remain in the response as their previous values, and the Server MUST add one or more entries to the listed Client Updates for the modified fields that need to be asynchronously reviewed and approved. Clients MAY then use the Client Updates API to track the asynchronous review of the modification request. If all submitted fields have been synchronously updated as part of the response, Servers MUST respond with a 200 OK
response.
6. Client Settings API đź”—
This specification requires Servers provide an API allowing Clients to view and manage their Client settings. While the settings fields are directly related to a specific registered Client, they are not included in the Client object itself in order to allow Clients to make partial updates to their settings values using an HTTPS PATCH
request instead of a PUT request, which is required for the Client object updates to remain compatible with OAuth’s Dynamic Client Registration Management Protocol.
The Client Settings API are authenticated using a Bearer access_token
granted to Clients using OAuth’s client_credentials
grant and the client_secret
provided in the initial Client Registration Response or client_secret
values from the Scope Credentials API that include the client_admin
scope.
Clients request their current Client Settings object my making an authenticated HTTPS GET
request to the cds_client_settings_api
endpoint provided in the Client object.
6.1. Client Settings Object Format đź”—
Client Settings objects are formatted as JSON objects and contain the following named values:
default_scope
- string - (REQUIRED) A space-separated list of scopes the Server will use for OAuth’s Authorization Requests if the Client does not supply ascope
orauthorization_details
parameter in the request.profile_visibility
- ProfileVisibility - (REQUIRED) This is visibility configuration of a Client in the Directory API.profile_visibility_options
- Array[ProfileVisibility] - (REQUIRED) This is the list of available Profile Visibility values that the Client may choose to set as theirprofile_visiblity
.profile_description
- string - (REQUIRED) This is the description that the Client wishes to be displayed in their public directory entry, ifprofile_visibility
is set toautolist
,unlisted
, orlisted
.profile_uri
- URL - (REQUIRED) This is the URL that links directly to the Client’s entry in the Server’s publicly accessible directory web interface, ifprofile_visibility
is set toautolist
,unlisted
, orlisted
. If a Client has set theirprofile_visibility
todisabled
, the Server MUST respond to requests to this URL with a 404 Not Found response code.profile_slug
- string - (OPTIONAL) For Servers that have the ability to partially customize theprofile_uri
string to be a more human-readable URL, this is the part of the URL that is customizeable by the Client.profile_button_uri
- URL ornull
- (REQUIRED) In the profile entry for a Client, Servers MUST offer the ability for the Client to link users to a Client-provided URL. Servers MUST implement this as an anchor link styled as one of the specified Button Styles that opens a new tab via thetarget="_blank"
anchor attribute for the user. If a Client sets this value tonull
, then the Server MUST NOT render the button link in the Client’s directory profile entry.profile_button_style
- ButtonStyle - (REQUIRED) This is the style of button the Server has set for theprofile_button_uri
.profile_button_style_options
- Array[ButtonStyle] - (REQUIRED) This is a list of Button Styles available for the Client to set as their button style in their directory entry.profile_contact_name
- string - (REQUIRED) This the contact name to be listed in the public directory entry for the Client.profile_contact_email
- E.123 email address - (REQUIRED) This the contact email to be listed in the public directory entry for the Client.profile_contact_phone
- E.123 international phone number ornull
- (REQUIRED) This the contact phone number to be listed in the public directory entry for the Client. If the Client sets this tonull
, the phone number field MUST be hidden on the Client’s public directory profile entry by the Server.profile_contact_website
- URL ornull
- (REQUIRED) This is a link to a website the Client wishes the user to visit for more information on how to contact them. If the Client sets this tonull
, the website field MUST be hidden on the Client’s public directory profile entry by the Server.
6.2. Profile Visibilities đź”—
Servers MUST make available the following Profile Visibility options in the profile_visibility_options
list:
listed
- Servers MUST include the Client profile entry in both the Directory API list and Publicly Accessible Web Directory. If Servers are asynchronously reviewing Clients before approving production access to scopes, Servers MUST NOT include this option in the list ofprofile_visibility_options
until the Server has completed and approve the Client for production access to at least one of the non-client_admin
scopes, and instead includeautolist
in the list ofprofile_visibility_options
. For Client profile entries, Servers MUST NOT render the profile entry withX-robots-tag
or<meta name="robots" ...>
HTML head tags with a value ofnoindex
, so that Client profile entries may be indexed by web search engines.autolist
- If Servers are asynchronously reviewing Clients before approving production access to scopes, Servers MUST include this option in the list ofprofile_visibility_options
until the Server has completed and approve the Client for production access to at least one of the non-client_admin
scopes and NOT includelisted
in the list ofprofile_visibility_options
. If the Client has set theirprofile_visibility
toautolist
, when the Server approves at least one non-client_admin
scope for production use, the Server MUST automatically switch the Client’sprofile_visibility
setting fromautolist
tolisted
and removeautolist
from the list ofprofile_visibility_options
. The behavior of this option is the same as theunlisted
Profile Visibility option, with the exception that the Server MUST prominently display a banner message in the rendered profile entry to users that the Client has not yet been approved for production use.unlisted
- Servers MUST NOT include the Client profile entry in the Directory API list or Publicly Accessible Web Directory. However, theprofile_uri
will be publicly visible when requested directly by a user directly and the response to theprofile_uri
MUST include aX-robots-tag
response header withnoindex
in the header values or a<meta name="robots" ...>
HTML head tag withnoindex
included in thecontent
attribute, so that web search engines do not index the profile entry.disabled
- Servers MUST NOT include the Client profile entry in the Directory API list or Publicly Accessible Web Directory. The Server MUST also return a 404 Not Found response code for requests made to the Client’sprofile_uri
.
6.3. Button Styles đź”—
Clients may have registered to a server for different purposes, so their Client profile entry button links may need to be styled as different actions based on the Client’s use case. Servers MUST offer the following button styles for Clients to set as their profile_button_style
:
authorize
- Rendered as a button indicating to the user that the button will allow the user to authorize the Client in some fashion, such as a button saying “Authorize {client_name}”.link
- Rendered as a button indicating to the user that the button will allow the user to link or connect the user’s account to the Client, such as a button saying “Link your account with {client_name}”.goto
- Rendered as a button indicating to the user that the button will allow the user to go to the Client’s website, such as a button saying “Visit the {client_name} website”.
6.4. Modifying Client Settings đź”—
Clients may modify fields in the Client Settings API by sending an authenticated HTTPS PATCH
request to the cds_client_settings_api
endpoint with the body of the request formatted a JSON object. The fields included in JSON object are the fields the Client intends to update with the submitted fields’ values. If a field is not included in the PATCH
request, the Server MUST leave the field unmodified from its current value.
The following are fields that MAY be included in the PATCH
request, and modification MUST be supported by Servers:
default_scope
profile_visibility
profile_description
profile_slug
profile_button_uri
profile_button_style
profile_contact_name
profile_contact_email
profile_contact_phone
profile_contact_website
Servers MUST reject requests with a 400 Bad Request
response when fields are submitted that are not able to be modified by the Client or the submitted values are invalid. For valid PATCH
requests from Clients, Servers MUST respond with a 200 OK
or 202 Accepted
response with an updated JSON object of the complete current Client Settings object.
If a Server needs to asynchronously review and approve changes to any submitted Client Settings object fields that have been submitted by the Client and are different from the current values, for valid modification requests the Server MUST respond with a 202 Accepted
response, which indicates that the submission was accepted but not fully saved as completed yet. Any fields that have not been synchronously updated as part of the request and response MUST remain in the response as their previous values, and the Server MUST add one or more entries to the listed Client Updates for the modified fields that need to be asynchronously reviewed and approved. Clients MAY then use the Client Updates API to track the asynchronous review of the modification request. If all submitted fields have been synchronously updated as part of the response, Servers MUST respond with a 200 OK
response.
7. Client Updates API đź”—
To facilitate automated integration between Servers and Clients, this specification requires that official communication between Servers and Clients be performed using the Client Updates APIs. Servers MAY implement other means of communications for exchanging messages and notifications, such as email support, but they MUST also mirror any official communications that impact Client or Grant statuses, settings, or access using the Client Updates API.
The Client Updates API endpoints are authenticated using a Bearer access_token
granted to Clients using OAuth’s client_credentials
grant and the client_secret
provided in the initial Client Registration Response or client_secret
values from the Scope Credentials API that include the client_admin
scope.
7.1. Client Update Object Format đź”—
Client Update objects are formatted as JSON objects and contain the following named values:
uri
- URL - (REQUIRED) Where to retrieve or modify this specific Client Update object.previous_uri
- URL ornull
- (REQUIRED) Where to find the previous Client Update to which this Client Update has been created as a reply.type
- ClientUpdateType - (REQUIRED) The type of Client Update.read
- boolean - (REQUIRED) Whether the object has been marked as read by a Client. When the Server creates a Client Update, this value MUST befalse
by default, so that the Client Update appears in the unread list.creator
- string ornull
- (REQUIRED) If the Server created the Client Update, this value isnull
. If the Client created the Client Update, this value is the Client’sclient_id
.created
- ISO8601 datetime - (REQUIRED) When the Client Update was created.modified
- ISO8601 datetime - (REQUIRED) When the Client Update was last modified.status
- ClientUpdateStatus - (REQUIRED) The current status of the Client Update.name
- string - (REQUIRED) A human-readable name of the Client Update. If the Client Updatetype
isnotification
,private_message
, orsupport_request
, this is the message subject.description
- string - (REQUIRED) A human-readable description of the Client Update. If the Client Updatetype
isnotification
,private_message
, orsupport_request
, this is the message body.updates_requested
- Array[ClientUpdateRequest] - (OPTIONAL) The list of values that a Client has requested to be updated. This field is required for Client Updates with atype
value offield_changes
orserver_request
.related_uri
- URL ornull
- (OPTIONAL) If the Client Updatetype
isnotification
orprivate_message
, this value is where the Client can find more information, if available. If the Client Updatetype
issupport_request
, this value is a relevant URL for which the Client is requesting technical support. If the Client Updatetype
isfield_changes
, this is where the Client can retrieve the object that has been requested to be modified. If the Client Updatetype
ispayment_request
, this is where the Client can submit their payment to the Server or if paid, a link to the payment receipt. If the Client Updatetype
isserver_request
, this is where the Client can find more information about what information is being requested by the Server.amount
- decimal - (OPTIONAL) If the Client Updatetype
ispayment_request
, this amount the Client needs to pay to satisfy the payment request.currency
- string - (OPTIONAL) If the Client Updatetype
ispayment_request
, this is the monetary currency for theamount
in ISO 4217 currency code.
7.2. Client Update Types đź”—
Client Update object type
values MUST be one of the following:
notification
- The Server is sending the Client at notification message that is relevant to the Client. This message is considered to be not individually tailored to the Client specifically, but instead directed to all relevant Clients.private_message
- The Server or Client is sending a private message to the opposite party. This message is considered to be individually tailored and relevant only to that Client or Server.support_request
- The Client is submitting a technical support request to the Server.field_changes
- This Client Update represents that the Client has submitted changes to field values in other API objects, listed in theupdates_requested
list, but these changes were not synchronously approved by the Server and need to be reviewed asynchronously by the Server. While the Client originally triggered this Client Update to be created by submitting field changes that need to be asynchronously reviewed, the Server is responsible for creating this Client Update, so thecreator
value isnull
.server_request
- The Server is requesting the Client submit a new Client Update of typeclient_submission
with the fields listed inupdates_requested
.client_submission
- The Client is submitting a response to aserver_request
to update one or more fields of a specific object. Both Clients and Servers may create update requests.payment_request
- The Server is requesting payment by the Client to complete a financial payment before the Client may proceed with either registration approval or completing actions listed in theupdates_requested
list.
7.3. Client Update Statuses đź”—
Client Update object status
values MUST be one of the following:
complete
- For Client Updates withtype
values ofnotification
,private_message
, orclient_submission
, thestatus
MUST be set ascomplete
. For Client Updates withtype
values ofsupport_request
,field_changes
,server_request
, orpayment_request
, this represents the Server has completed and approved or resolved the Client’s technical support request, field changes, submission, or payment.open
- For Client Updates withtype
values ofserver_request
orpayment_request
, this represents that the Client has not yet submitted a response to the Server’s submission or payment request.pending
- For Client Updates withtype
values ofsupport_request
,field_changes
,server_request
, orpayment_request
, this represents the Server has not yet completed it’s review of the Client’s technical support request, field changes, submission, or payment.rejected
- For Client Updates withtype
values offield_changes
,server_request
, orpayment_request
, this represents the Server has completed and rejected the Client’s requested field changes, submission, or payment.errored
- For Client Updates withtype
values offield_changes
,server_request
, orpayment_request
, this represents the Server encountered an issue while processing the Client’s field changes, submission, or payment. The Client is RECOMMENDED to submit asupport_request
Client Update with therelated_uri
as this Client Update’suri
.
7.4. Client Update Request Object Format đź”—
Client Update Request objects are formatted as JSON objects and contain the following named values:
field
- string - (REQUIRED) The field name of the field that is being requested to be updated. For Client Updates withtype
values offield_changes
, this is the name of the object’s field on the API. For Client Updates withtype
values ofserver_request
, this is the Server’s identifier for the submission being requested from the client.name
- string - (OPTIONAL) For Client Updates withtype
values ofserver_request
, this MUST be a human-readable name of the submission type being requested as the client.description
- string - (OPTIONAL) For Client Updates withtype
values ofserver_request
, this MUST be a human-readable description providing the Client with more information about what this submission request item is.submitted_uri
- URL - (OPTIONAL) For Client Updates withtype
values ofclient_submission
, this MAY be a URL that the Client is submitting as their response to the Server’sserver_request
, when the Server’s requested field is for a remote resource, such as an logo or binary file.previous_value
- various - (OPTIONAL) For Client Updates withtype
values offield_changes
, this MUST be the value of the field that the is being requested to be changed from.new_value
- various - (OPTIONAL) For Client Updates withtype
values offield_changes
, this MUST be the value of the field that the is being requested to be changed to.
7.5. Listing Client Updates đź”—
Clients may request to list Client Update objects that they have access to by making an HTTPS GET
request, authenticated with a valid Bearer access_token
scoped to the client_admin
scope, to the cds_client_updates_api
URL included in the Client Registration Response or Clients API. The Client Update listing request responses are formatted as JSON objects and contain the following named values.
outstanding
- Array[ClientUpdate] - (REQUIRED) A list of Client Updates where thestatus
isopen
orpending
.outstanding_next
- URL ornull
- Where to request the next segment of the list of outstanding Client Updates. If no next segment exists (i.e. the requester is at the end of the list), this value isnull
.outstanding_previous
- URL ornull
- Where to request the previous segment of the list of outstanding Client Updates. If no previous segment exists (i.e. the requester is at the front of the list), this value isnull
.unread
- Array[ClientUpdate] - (REQUIRED) A list of Client Updates where theread
isfalse
.unread_next
- URL ornull
- Where to request the next segment of the list of unread Client Updates. If no next segment exists (i.e. the requester is at the end of the list), this value isnull
.unread_previous
- URL ornull
- Where to request the previous segment of the list of unread Client Updates. If no previous segment exists (i.e. the requester is at the front of the list), this value isnull
.read
- Array[ClientUpdate] - (REQUIRED) A list of Client Updates where theread
istrue
.read_next
- URL ornull
- Where to request the next segment of the list of read Client Updates. If no next segment exists (i.e. the requester is at the end of the list), this value isnull
.read_previous
- URL ornull
- Where to request the previous segment of the list of read Client Updates. If no previous segment exists (i.e. the requester is at the front of the list), this value isnull
.
Responses to outstanding_next
, outstanding_previous
, unread_next
, unread_previous
, read_next
, or read_previous
MUST be formatted the same as the initial Client Update listing, and MUST only include listings for the relevant next segment. For example, if the Client requests a unread_next
, the Server’s response MUST have outstanding
and read
lists be empty lists ([]
).
Listings of Client Update objects MUST be ordered in reverse chronological order by modified
timestamp, where the most recently updated relevant Client Update MUST be first in each listing.
7.6. Creating Client Updates đź”—
Clients create new Client Updates by sending an authenticated HTTPS POST
request to the cds_client_updates_api
endpoint with the body of the request formatted a JSON object. The fields included in JSON object MUST include the following:
previous_uri
- URL ornull
- If submitting a Client Update with atype
value ofclient_submission
, this value MUST be the Client Updateuri
that this Client Update is being submitted in response to (i.e. must have atype
value ofserver_request
). If submitting a Client Update with atype
value ofsupport_request
orprivate_message
, if the Client is responding to a previous Client Update, this value MUST be the Client Updateuri
of that Client Update. If submitting a Client Update with atype
value ofsupport_request
orprivate_message
that is not responding to another specific Client Update, this value MUST benull
.type
- ClientUpdateType - This value MUST be one ofprivate_message
,support_request
, orclient_submission
.name
- string - If submitting a Client Update with atype
value ofclient_submission
, this value MUST be an empty string (""
). If submitting a Client Update with atype
value ofsupport_request
orprivate_message
, this value MUST be the subject line of the message.description
- string - If submitting a Client Update with atype
value ofclient_submission
, this value MUST be an empty string (""
). If submitting a Client Update with atype
value ofsupport_request
orprivate_message
, this value MUST be the body of the message.updates_requested
- Array[ClientUpdateRequest] - If submitting a Client Update with atype
value ofclient_submission
, this value MUST be a list of Client Update Request objects withfield
values matching thefield
values in the correspondingserver_request
Client Update Request objects, anddescription
orsubmitted_uri
values being the Client’s submission response to the Server’s request for thatfield
.related_uri
- URL ornull
- If submitting a Client Update with atype
value ofsupport_request
, this value MAY be a URL to the relevant API endpoint for the support request. If there is no relevant API endpoint, the Client MUST set this value asnull
.
Servers MUST reject requests with a 400 Bad Request
response when a Client submits an incomplete request or the submitted values are invalid. For valid POST
requests from Clients, Servers MUST respond with a 201 Created
response with an updated JSON object of the complete current Client Update object. When committing Client Updates created by Clients, Servers MUST populate the following fields in addition to the Client’s submitted fields:
uri
- URL - The endpoint where the Client can retrieve the newly created Client Update object.read
- boolean - Always set totrue
.creator
- string - Always set to the Client’sclient_id
.created
- ISO8601 datetime - Always set to the Server’s timestamp for when the Client Update was created.modified
- ISO8601 datetime - Always the same ascreated
.status
- ClientUpdateStatus - Fortype
values ofprivate_message
orclient_submission
, this value MUST becomplete
. Fortype
values ofsupport_request
, this value MUST bepending
.
When Clients submit Client Updates with type
value of client_submission
, if the Client Update referenced in the previous_uri
has a status
of open
, then the Server MUST update the status
of that referenced Client Update to pending
, which indicates that the Client has submitted a response for Server review.
7.7. Modifying Client Updates đź”—
Clients may modify fields in a Client Updates object by sending an authenticated HTTPS PATCH
request to the Client Update uri
endpoint with the body of the request formatted a JSON object. The fields included in JSON object are the fields the Client intends to update with the submitted fields’ values. If a field is not included in the PATCH
request, the Server MUST leave the field unmodified from its current value.
The following are fields that MAY be included in the PATCH
request, and modification MUST be supported by Servers:
read
- Servers MUST accept values oftrue
andfalse
from the Client.
If a Client wishes to modify a previously submitted Client Update of type client_submission
they created, the Client MUST create a new Client Update with the same previous_uri
value as the Client Update the Client is wishing to supersede. Severs MUST process newer Client Updates created by the Client as overriding the Client’s previous submission.
If a Client wishes to amend a previously created Client Update of type private_message
or support_request
they created, the Client MUST create a new Client Update with the previous_uri
value set as the Client Update uri
for which they are wanting to amend. Severs MUST consider newer Client Updates created by the Client as amending the Client’s previous support request or message.
8. Scope Credentials API đź”—
To allow Clients to manage client_secret
values used for authentication to APIs, this specification requires that Server implement a Scope Credentials API. Servers MAY implement other means of managing Scope Credentials, such as a web interface, but they MUST also mirror any Scope Credentials managed by other means on this required Scope Credentials API.
The Scope Credentials API endpoints are authenticated using a Bearer access_token
granted to Clients using OAuth’s client_credentials
grant and the client_secret
provided in the initial Client Registration Response or client_secret
values from the Scope Credentials API that include the client_admin
scope.
8.1. Scope Credentials Object Format đź”—
Scope Credentials objects are formatted as JSON objects and contain the following named values:
credential_id
- string - (REQUIRED) The unique identifier for the Scope Credential on the Server’s system.uri
- URL - (REQUIRED) Where to retrieve, modify, or delete this specific Scope Credential object.client_id
- string - (REQUIRED) Which Client this Scope Credential belongs to.created
- ISO8601 datetime - (REQUIRED) When the Scope Credential was created.modified
- ISO8601 datetime - (REQUIRED) When the Scope Credential was last modified.scope
- string - (REQUIRED) The scopes for which this Scope Credential may obtain access.authorization_details
- Array[OAuth AuthorizationDetail] - (REQUIRED) Any authorization details scopes that this Scope Credential may obtain access, in addition to this object’sscope
value. If no authorization details scopes are configured in addition to thescope
string, this value is an empty array ([]
). If thetype
field of an authorization detail object in this array is the same as a value in thescope
string, the authorization detail object replaces the scope with additional more refined access details for the scope.client_secret
- string ornull
- (REQUIRED) A sufficiently random value generated by the Server that can be used by the Client to authenticate themselves when obtaining anaccess_token
from the Server’s OAuth token endpoint. For Scope Credentials that have atoken_endpoint_auth_method
value ofnone
, this value MUST benull
.client_secret_expires_at
- ISO8601 datetime ornull
- (REQUIRED) When theclient_secret
will expire. If theclient_secret
is not currently set to expire, this value isnull
.status
- ScopeCredentialStatus - (REQUIRED) The current status of accessibility for this Scope Credential.status_options
- Array[ScopeCredentialStatus] - (REQUIRED) Whatstatus
values to which the Client MAY change the Scope Credential when modifying it. This list MUST always contain at least the values ofsandbox_only
anddisabled
.response_types
- Array[OAuth ResponseType] - (REQUIRED) What type of OAuthresponse_types
are available for use with this Scope Credential. Only aresponse_type
value ofcode
is supported by this specification.grant_types
- Array[OAuth GrantType] - (REQUIRED) What type of OAuthgrant_types
are available for use with this Scope Credential.token_endpoint_auth_method
- OAuth TokenEnpointAuthMethod - (REQUIRED) What type of OAuthtoken_endpoint_auth_method
MUST be used when requesting anaccess_token
from the Server’s OAuth token endpoint. This value MUST beclient_secret_basic
for which scopes the Server requires a non-public Client. This value MAY benone
when the Server allows the scope to be used by public Clients.redirect_uris
- Array[URL] - (REQUIRED) A list of URLs that the Client MAY use asredirect_uri
parameter values in the Server’s OAuth authorization endpoint. Servers MUST support public domain name URLs (e.g. “https://example.com/redirect”), as well as internal development URLs (e.g. “http://localhost:4000/redirect”) and IP addresses in the host of the URL (e.g. “http://127.0.0.1:9999/redirect”). Servers MUST support bothhttp
andhttps
schemas in URLs. Servers MUST also support the addition of parameters in the URL, and when redirected to, append the Server’s parameters (e.g.code=...&state=...
) properly to the Client’sredirect_uri
even in cases where the Client’sredirect_uri
already has additional parameters. For example, if the Client’sredirect_uri
is “https://example.com/redirect?pageid=123”, the Server’s redirect would be “https://example.com/redirect?pageid=123&code=aaaaaaa&state=bbbbbbb” and not “https://example.com/redirect?pageid=123?code=aaaaaaa&state=bbbbbbb”.authorization_endpoint
- URL - (OPTIONAL) A specific OAuth authorization endpoint that overrides the default Clientauthorization_endpoint
for this specific Scope Credential. This MAY be added by Servers who have different authorization interfaces for different sets of scopes.token_endpoint
- URL - (OPTIONAL) A specific OAuth token endpoint that overrides the default Clienttoken_endpoint
for this specific Scope Credential. This MAY be added by Servers who have different token interfaces for different sets of scopes.
8.2. Scope Credentials Statuses đź”—
Scope Credential object status
values MUST be one of the following:
production_only
- Thescope
,authorization_details
, andclient_secret
MAY be used by the Client to request access on the Server’s production systems. For scopes that require user authorization (i.e.response_type
values ofcode
), thisstatus
indicates that the Client may request authorization from real users.production_and_sandbox
- Thescope
,authorization_details
, andclient_secret
MAY be used by the Client to request access on the Server’s production or test environment systems. For scopes that require user authorization (i.e.response_type
values ofcode
), thisstatus
indicates that the Client may request authorization from real or test users, as provided in the Server’scds_test_accounts
documentation.sandbox_only
- Thescope
,authorization_details
, andclient_secret
MAY be used by the Client to request access on the Server’s test environment systems. For scopes that require user authorization (i.e.response_type
values ofcode
), thisstatus
indicates that the Client may request authorization from fictional test users, as provided in the Server’scds_test_accounts
documentation.disabled
- The Scope Credential is disabled.
8.3. Evaluating Authorization Request Scopes đź”—
When responding to an OAuth authorization request, Servers MUST evaluate the requested scope
or authorization_details
against the scope
and authorization_details
listed in all of the Client’s Scope Credentials objects. If the authorization request’s scope
or authorization_details
is compatible with all or a subset of an individual Scope Credential’s scope
or authorization_details
, and the status
of the Scope Credential is compatible with the type of authenticated user (production_and_sandbox
for any test or real users, sandbox_only
for test users, production_only
for real users), and the redirect_uri
parameter in the authorization request is listed in the Scope Credential.
If a Server finds that an authorization request is compatible with multiple Scope Credentials, the Server MUST accept the authorization request as valid. When the user authorizes, the code
parameter created by the Server and sent to the Client via the redirect_uri
parameter MUST be able to be used to obtain an access_token
via the token endpoint using any of the matching Scope Credentials’ client_secret
values. If one of the compatible Scope Credentials
8.4. Listing Scope Credentials đź”—
Clients may request to list Scope Credential objects that they have access to by making an HTTPS GET
request, authenticated with a valid Bearer access_token
scoped to the client_admin
scope, to the cds_scope_credentials_api
URL included in the Client Registration Response or Clients API. The Scope Credential listing request responses are formatted as JSON objects and contain the following named values.
scope_credentials
- Array[ScopeCredential] - (REQUIRED) A list of Scope Credentials to which the requestingaccess_token
is scoped to have access. If no Scope Credentials are accessible, this value is an empty list ([]
). If more than 100 Scope Credentials are available to be listed, Servers MAY truncate the list and use thenext
value to link to the next segment of the list of Scope Credentials.next
- URL ornull
- Where to request the next segment of the list of Scope Credentials. If no next segment exists (i.e. the requester is at the end of the list), this value isnull
.previous
- URL ornull
- Where to request the previous segment of the list of Scope Credentials. If no previous segment exists (i.e. the requester is at the front of the list), this value isnull
.
Servers MUST support Clients adding any of the following URL parameters to the GET
request, which will filter the list of Scope Credentials to be the intersection of results for each of the URL parameters filters:
statuses
- A space-separated list ofstatus
values for which the Servers MUST filter the Scope Credentials.client_ids
- A space-separated list ofclient_id
values for which the Servers MUST filter the Scope Credentials.cds_client_uris
- A space-separated list ofcds_client_uris
values for which the Servers MUST filter the Scope Credentials.scopes
- A space-separated list ofscope
values for which the Server MUST filter the Scope Credentials, where the includedscope
values are values within the Scope Credentialscope
(space separated) or as atype
value in theauthorization_details
list.after
- An ISO8601 datetime for which the Server MUST filter Scope Credentials that were created after or on the datetime.before
- An ISO8601 datetime for which the Server MUST filter Scope Credentials that were created before or on the datetime.
Listings of Scope Credential objects MUST be ordered in reverse chronological order by modified
timestamp, where the most recently updated relevant Scope Credential MUST be first in each listing.
8.5. Retrieving Individual Scope Credentials đź”—
The URL to be used to send GET
requests for retrieving individual Scope Credential objects MUST be the Scope Credential uri
provided in the Scope Credential object.
8.6. Creating Scope Credentials đź”—
Clients create new Scope Credentials by sending an authenticated HTTPS POST
request to the cds_scope_credentials_api
endpoint with the body of the request formatted a JSON object. The fields included in JSON object MUST include the following:
scope
- string - This value is a space-separated list of scopes for which the new Scope Credentials is requesting to be provisioned.authorization_details
- Array[OAuth AuthorizationDetail] - This value is a list of additional authorization detail objects that specify more granular access than simple scope strings. If thetype
field of an authorization detail object in this list is the same as a value in thescope
string, the authorization detail object replaces the scope with additional more refined access details for the scope.redirect_uris
- Array[URL] - A list of URLs that the Client MAY use asredirect_uri
parameter values in the Server’s OAuth authorization endpoint when requesting user authorization for the scopes (scope
orauthorization_details
). If the scopes do not require user authorization (e.g. agrant_type
value ofclient_credentials
), this list may be an empty list ([]
). For scopes that require user authorization (e.g. aresponse_type
value ofcode
), this list may also be empty ([]
) and updated by the Client later using the Scope Credentials modification API.token_endpoint_auth_method
- OAuth TokenEnpointAuthMethod - Eithernone
orclient_secret_basic
, depending on if the Client is adding a Scope Credential for a public or non-public use case, respectively. Server MUST only allownone
to be valid in cases where the requested scopes require user authorization and authorization requests are permitted by public Clients.
Servers MUST reject requests with a 400 Bad Request
response when a Client submits an incomplete request or the submitted values are invalid. Scopes for which user authorization is required (i.e. response_type
value of code
) MUST NOT be included with scopes that do not require user authorization (i.e. grant_type
value of client_credentials
), and if submitted together, MUST be rejected by the Server as invalid. For valid POST
requests from Clients, Servers MUST respond with a 201 Created
response with an updated JSON object of the complete current Scope Credential object. When committing Scope Credentials created by Clients, Servers MUST populate the following fields in addition to the Client’s submitted fields:
credential_id
- string - The unique identifier for the Scope Credential on the Server’s system.uri
- URL - The endpoint where the Client can retrieve the newly created Scope Credential object.created
- ISO8601 datetime - Always set to the Server’s timestamp for when the Scope Credential was created.modified
- ISO8601 datetime - Always the same ascreated
.status
- ScopeCredentialStatus - Always set tosandbox_only
.status_options
- Array[ScopeCredentialStatus] - Always a list containing at least two values:sandbox_only
anddisabled
. If the Client has already previously been approved for production for the same scopes, the Server MUST include any ofproduction_only
orproduction_and_sandbox
in the list. If the Server can synchronously approve the Scope Credential for production mode, the Server MAY also include any ofproduction_only
orproduction_and_sandbox
values in the list. If the Server will be reviewing the Scope Credential creation for production approval, Servers MUST also create a Client Update entry of typefield_changes
with a Client Update Request entry with afield
value ofstatus_options
, indicating that the Client has requested the Server to review production access approval for the new Scope Credential.response_types
- Array[OAuth ResponseType] - For scopes for which user authorization is required, this is always a single-entry list with the valuecode
in the list. For scopes for which user authorization is not required, this is always an empty list ([]
).grant_types
- Array[OAuth GrantType] - For scopes for which user authorization is required, this is always a two-entry list with the valuesauthorization_code
andrefresh_token
. For scopes for which user authorization is not required, this is always a single-entry list with the valueclient_credentials
in the list.authorization_endpoint
- URL - (OPTIONAL) If different from the Client object’sauthorization_endpoint
value.token_endpoint
- URL - (OPTIONAL) If different from the Client object’stoken_endpoint
value.
8.7. Modifying Scope Credentials đź”—
Clients may modify fields in the Scope Credentials API by sending an authenticated HTTPS PATCH
request to the Scope Credential uri
endpoint with the body of the request formatted a JSON object. The fields included in JSON object are the fields the Client intends to update with the submitted fields’ values. If a field is not included in the PATCH
request, the Server MUST leave the field unmodified from its current value.
The following are fields that MAY be included in the PATCH
request, and modification MUST be supported by Servers:
status
- Servers MUST only accept a value list in the object’sstatus_options
from the Client.status_options
- This value is a list of Scope Credential Status values for which the Client is requesting approval. This list MUST always containdisabled
andsandbox_only
, and if these values are not submitted by the Client, the Server MUST automatically add them to the Client-submitted list.scope
- string - This value is a space-separated list of scopes for which the new Scope Credentials is requesting to be provisioned.authorization_details
- Array[OAuth AuthorizationDetail] - This value is a list of additional authorization detail objects that specify more granular access than simple scope strings. If thetype
field of an authorization detail object in this list is the same as a value in thescope
string, the authorization detail object replaces the scope with additional more refined access details for the scope.redirect_uris
- Array[URL] - A list of URLs that the Client MAY use asredirect_uri
parameter values in the Server’s OAuth authorization endpoint when requesting user authorization for the scopes (scope
orauthorization_details
). If the scopes do not require user authorization (e.g. agrant_type
value ofclient_credentials
), this list may be an empty list ([]
). For scopes that require user authorization (e.g. aresponse_type
value ofcode
), this list may also be empty ([]
) and updated by the Client later using the Scope Credentials modification API.
Servers MUST reject requests with a 400 Bad Request
response when fields are submitted that are not able to be modified by the Client or the submitted values are invalid. If a Server needs to asynchronously review and approve changes to any submitted Scope Credential object fields that have been submitted by the Client and are different from the current values, for valid update requests the Server MUST respond with a 202 Accepted
response, which indicates that the submission was accepted but not fully saved as completed yet. Any fields that have not been synchronously updated as part of the request and response MUST remain in the response as their previous values, and the Server MUST add one or more entries to the listed Client Updates for the modified fields that need to be asynchronously reviewed and approved. Clients MAY then use the Client Updates API to track the asynchronous review of the modification request. If all submitted fields have been synchronously updated as part of the response, Servers MUST respond with a 200 OK
response.
If a Client updates the status
of a Scope Credential to disabled
, the Server MUST assume the Scope Credential is compromised and synchronously disable the Scope Credential’s client_secret
from being used on the token endpoint and revoke any access_token
or refresh_token
values issued by the token endpoint as a result of using the now-disabled Scope Credential.
9. Grants API đź”—
This specification requires Servers provide an API allowing Clients to view and edit OAuth user authorizations and client credentials grants (“Grants”) related to their registration. These APIs are authenticated using a Bearer access_token
granted to Clients using OAuth’s client_credentials
grant and the client_secret
provided in the initial Client Registration Response or client_secret
values from the Scope Credentials API that include the client_admin
scope.
9.1. Grant Object Format đź”—
Grant objects are formatted as JSON objects and contain the following named values:
grant_id
- string - (REQUIRED) The unique identifier for the Grant on the Server’s system.uri
- _URL - (REQUIRED) A link to this specific Grant that can be used to retrieve or modify the individual Grant.replacing
- Array[URL] - (REQUIRED) If this Grant is superseding another Grant, this is the list of Granturi
values of the superseded Grants. If this grant is not superseding any other Grants, this value is an empty list ([]
).replaced_by
- Array[URL] - (REQUIRED) If this Grant has been superseded by other Grants, this is the list of Granturi
values of the superseding Grants. If no other Grants have superseded this Grant, this value is an empty list ([]
).parent
- URL ornull
- (REQUIRED) If this Grant represents an individual sub-authorization that is part of another Grant that required multiple authorizations, this is where to find the parent Grant. If this Grant is not a sub-authorization, this value isnull
.children
- Array[URL] - (REQUIRED) If this Grant represents a parent Grant that has multiple sub-authorizations underneath it, this is a list of Granturi
values for where to find the sub-authorizations. If this Grant does not have any sub-authorizations, this value is an empty list ([]
).created
- ISO8601 datetime - (REQUIRED) When the Grant was created.modified
- ISO8601 datetime - (REQUIRED) When the Grant was most recently modified. If the Grant has not been modified since creation, this is the same value ascreated
.not_before
- ISO8601 datetime ornull
- (REQUIRED) When a Grant that is for future access, Grant’sstatus
will be switched fromfuture
to another value. If the Grant is not for future access and access is available immediately upon creation, this value isnull
.not_after
- ISO8601 datetime ornull
- (REQUIRED) When a Grant has access that will expire in the future, this value indicates when the Grant’sstatus
will be switched toexpired
. If the Grant does not expire, this value isnull
.eta
- ISO8601 datetime ornull
- (REQUIRED) When a Grant has astatus
with the valuepending
, this value indicates an estimated time for when the status is expected to be switched to another value. If the Grant’sstatus
is notpending
this value isnull
.expires
- ISO8601 datetime ornull
- (REQUIRED) When the Grant will expire and access will be removed by the Server. If the Grant is to continue indefinitely, this value isnull
.status
- GrantStatus - (REQUIRED) The current Grant Status of the Grant.client_id
- string - (REQUIRED) Which Client for which this Grant is issued.cds_client_uri
- URL - (REQUIRED) Where to retrieve using the Clients API the Client for which the Grant is issued.scope
- string - (REQUIRED) The scopes for which this Grant has issued access.authorization_details
- Array[OAuth AuthorizationDetail] - (REQUIRED) Any authorization details scopes that are granted in addition to this object’sscope
value. If no authorization details scopes are configured in addition to thescope
string, this value is an empty array ([]
). If thetype
field of an authorization detail object in this array is the same as a value in thescope
string, the authorization detail object replaces the scope with additional more refined access details for the scope.receipt_confirmations
- Array[string] - (REQUIRED) For Grants with scopes that can be obtained via user authorization (grant_types
containsauthorization_code
), this is a list of receipt confirmation codes that were provided to the end users who authorized the access. If no receipt was provided or the Grant did not get issued viaauthorization_code
then this value is an empty list ([]
).enabled_scope
- string - For Grants where access has been partially granted, but some access is still disabled, this value is thescope
that has been enabled by the server. For Grants where access has been fully granted, this value is the same as thescope
value. For Grants that have had their access removed (e.g.disabled
), this value is an empty string (""
).enabled_authorization_details
- Array[OAuth AuthorizationDetail] - For Grants where access has been partially granted, but some access is still disabled, this value is theauthorization_details
that has been enabled by the server. For Grants where access has been fully granted, this value is the same as theauthorization_details
value. For Grants that have had their access removed (e.g.disabled
), this value is an empty list ([]
).sub_authorization_scopes
- Array[string] - (REQUIRED) For Grants that require sub-authorizations where users must provide additional authorization to enable access, this is the outstanding list ofscope
values that have yet to be authorized individually by users.
9.2. Grant Statuses đź”—
Grants object status
values MUST be one of the following:
active
- The Grant is active and access for the features and data specified in thescope
orauthorization_details
is currently enabled. For Grants that provide access to data APIs that are being regularly updated, this status also indicates that the Server is currently on schedule to provide the expected ongoing data updates.future
- The Grant will be made in the future, and the Client should check thenot_before
value for when the Grant will have its status switched toactive
.pending
- The Grant has been create and is valid, but the Server is still processing or reviewing the Grant and the status will be changed to another status at approximately the time provided in the Grant’seta
value. While a Grant’s status ispending
, Servers MUST provide access to the granted scope’s features or data as the Server processes and the features or data becomes available.partial
- The Grant was submitted originally with thescope
andauthorization_details
values, but the Server has limited the Client’s access a subset of the Grant’sscope
. The enabled access is listed in theenabled_scope
andenabled_authorization_details
values.needs_authorization
- The Grant has been created, but access is limited to theenabled_scope
andenabled_authorization_details
until a user authorizes the listedscope
andauthorization_details
values using an authorization URL with acds_grant_id
parameter of thisgrant_id
.needs_sub_authorizations
- The Grant has been created, but access is limited to theenabled_scope
andenabled_authorization_details
until user sub-authorizations, listed in thesub_authorization_scopes
value, are granted using an authorization URL with acds_parent_id
parameter of thisgrant_id
.disabled
- The Grant has been indefinitely disabled by the Server, and the Client SHOULD NOT expect the Grant’s status to be updated in the future.suspended
- The Grant has been temporarily disabled by the Server or user who authorized access, and the Client SHOULD expect the Grant’s status to be updated in the future.revoked
- For Grants with scopes that can be obtained via user authorization (grant_types
containsauthorization_code
), this status means the user has revoked access.closed
- The Grant has been revoked by the Client via the Modifying Grants API.expired
- The Grant has expired and access has been removed. The Grant’snot_after
value indicates when the Grant’s access was removed and the Grant is considered expired.delayed
- For Grants that provide access to data APIs that are being regularly updated, this status indicates that the data being provided is behind schedule and will be updated when the Server resolves its internal delay issues.stopped
- For Grants that provide access to data APIs that are being regularly updated, this status indicates that the data being provided has stopped being updated either by the Server or the user who originally authorized the access. Access to existing data is still available, but the Client should not expect updates to the data being provided.errored
- The Server has encountered an internal error for this Grant, and Client access cannot be confirmed by the Server.
Grant status
values of future
, disabled
, suspended
, revoked
, closed
, and expired
indicate that access to all features and data that were accessible via this Grant are no longer accessible.
9.3. Listing Grants đź”—
Clients may request to list Grant objects that they have access to by making an HTTPS GET
request, authenticated with a valid Bearer access_token
scoped to the client_admin
scope, to the cds_grants_api
URL included in the Client Registration Response or Clients API. The Grant listing request responses are formatted as JSON objects and contain the following named values.
grants
- Array[Grant] - (REQUIRED) A list of Grants to which the requestingaccess_token
is scoped to have access. If no Grants are accessible, this value is an empty list ([]
). If more than 100 Grants are available to be listed, Servers MAY truncate the list and use thenext
value to link to the next segment of the list of Grants.next
- URL ornull
- Where to request the next segment of the list of Grants. If no next segment exists (i.e. the requester is at the end of the list), this value isnull
.previous
- URL ornull
- Where to request the previous segment of the list of Grants. If no previous segment exists (i.e. the requester is at the front of the list), this value isnull
.
Servers MUST support Clients adding any of the following URL parameters to the GET
request, which will filter the list of Grants to be the intersection of results for each of the URL parameters filters:
statuses
- A space-separated list ofstatus
values for which the Servers MUST filter the Grants.client_ids
- A space-separated list ofclient_id
values for which the Servers MUST filter the Grants.cds_client_uris
- A space-separated list ofcds_client_uri
values for which the Servers MUST filter the Grants.scopes
- A space-separated list ofscope
values for which the Server MUST filter the Grants, where the includedscope
values are values within the Grantscope
(space separated) or as atype
value in theauthorization_details
list.receipt_confirmations
- A space-separated list of receipt confirmation codes for which the Server MUST filter the Grants.after
- An ISO8601 datetime for which the Server MUST filter Grants that were created after or on the datetime.before
- An ISO8601 datetime for which the Server MUST filter Grants that were created before or on the datetime.
Listings of Grant objects MUST be ordered in reverse chronological order by modified
timestamp, where the most recently updated relevant Grant MUST be first in each listing.
9.4. Retrieving Individual Grants đź”—
The URL to be used to send GET
requests for retrieving individual Grant objects MUST be the Grant uri
provided in the Grant object.
9.5. Modifying Grants đź”—
Clients may modify fields in the Grants API by sending an authenticated HTTPS PATCH
request to the Grant uri
endpoint with the body of the request formatted a JSON object. The fields included in JSON object are the fields the Client intends to update with the submitted fields’ values. If a field is not included in the PATCH
request, the Server MUST leave the field unmodified from its current value.
The following are fields that MAY be included in the PATCH
request, and modification MUST be supported by Servers:
status
- Servers MUST only accept a value ofclosed
from the Client.scope
- Servers MUST evaluate the updated scope for whether another user authorization is required. Servers MUST not require another user authorization if the updated scope is a reduction in scope of access (e.g. removal of a scope value from the scope string). If a new user authorization or sub-authorizations are required, the Server MUST update thestatus
to one ofneeds_authorization
orneeds_sub_authorizations
and update theenabled_scope
to be the value of the current scope for which the Client is allowed access.authorization_details
- Servers MUST evaluate the updated authorization details for whether another user authorization is required. Servers MUST not require another user authorization if the updated scope is a reduction in scope of access (e.g. removal of a scope value from the scope string). If a new user authorization or sub-authorizations are required, the Server MUST update thestatus
to one ofneeds_authorization
orneeds_sub_authorizations
and update theenabled_authorization_details
to be the value of the current authorization details for which the Client is allowed access.
Servers MUST reject requests with a 400 Bad Request
response when fields are submitted that are not able to be modified by the Client or the submitted values are invalid. For valid PATCH
requests from Clients, Servers MUST respond with a 200 OK
response with an updated JSON object of the complete current Grant object.
If a Server needs to asynchronously review and approve changes to any submitted Grant object fields that have been submitted by the Client and are different from the current values, for valid modification requests the Server MUST update the Grant’s status
to pending
in the response. Additionally, if the scope
or authorization_details
has been updated, the Server MUST update the enabled_scope
and enabled_authorization_details
to reflect for what the Client currently has access while the Grant is pending.
10. Directory API đź”—
Servers MUST provide both an authenticated API-based directory list of Clients, as well as publicly accessible web directory interface of Clients who have been configured to be listed.
The Directory APIs are authenticated using a Bearer access_token
granted to Clients using OAuth’s client_credentials
grant and the client_secret
provided in the initial Client Registration Response or client_secret
values from the Scope Credentials API that include the client_admin
scope. However, the Publicly Accessible Web Directory not authenticated, as it is intended to be publicly accessible to browser users.
10.1. Directory Entry Object Format đź”—
Directory Entry objects are formatted as JSON objects and contain the following named values:
client_id
- From the Client objectclient_name
- From the Client objectclient_uri
- From the Client objecttos_uri
- From the Client objectpolicy_uri
- From the Client objectlogo_uri
- From the Client objectscope
- From the Client object, containing the list of scopes approved for production use, and NOT containing theclient_admin
scope.profile_visibility
- From the Client Settings objectprofile_uri
- From the Client Settings objectprofile_description
- From the Client Settings objectprofile_button_uri
- From the Client Settings objectprofile_button_style
- From the Client Settings objectprofile_contact_name
- From the Client Settings objectprofile_contact_email
- From the Client Settings objectprofile_contact_phone
- From the Client Settings objectprofile_contact_website
- From the Client Settings object
10.2. Listing Directory Entries đź”—
Clients may request to list Directory Entry objects that they have access to by making an HTTPS GET
request, authenticated with a valid Bearer access_token
scoped to the client_admin
scope, to the cds_directory_api
URL included in the Client Registration Response or Client object. The Client listing request responses are formatted as JSON objects and contain the following named values.
entries
- Array[DirectoryEntry] - (REQUIRED) A list of Directory Entry objects for Clients who have set theirprofile_visiblity
tolisted
. If no Clients are listed, this value is an empty list ([]
). If more than 100 Directory Entry objects are available to be listed, Servers MAY truncate the list and use thenext
value to link to the next segment of the list of Directory Entry objects.next
- URL ornull
- Where to request the next segment of the list of Directory Entry objects. If no next segment exists (i.e. the requester is at the end of the list), this value isnull
.previous
- URL ornull
- Where to request the previous segment of the list of Directory Entry objects. If no previous segment exists (i.e. the requester is at the front of the list), this value isnull
.
10.3. Publicly Accessible Web Directory đź”—
Additionally, Servers MUST provide a publicly accessible directory web interface that allows users to browse and view the Client profile entries that are listed in the Directory API. Servers MUST NOT require authentication for users to browse the directory. Server MUST include searching capabilities in the web interface that allows users to search for Clients by name, description, and website. Servers MUST also include filtering capabilities in the web interface that allows users to filter the list of Clients by scope. Servers MUST also enable linking directly to a Client profile entry as defined by the Client Settings profile_uri
. Servers MUST design the publicly accessible directory to be compatible for desktop, mobile, and accessibility-focused browsers and tools, such as vision impaired screen readers. Servers MAY include other features and functionality in addition to these requirements for the publicly accessible directory.
For Client profile entries, Servers MUST render the Client profile entry with at least the following contents:
client_name
- From the Client object, as the name of the Client.client_uri
- From the Client object, as a link to the Client’s website.tos_uri
- From the Client object, as a link to the Client’s terms of service.policy_uri
- From the Client object, as a link to the Client’s privacy policy.logo_uri
- From the Client object, as an image and embedded in the rendered Client profile. Servers MAY fetch and cache logos set by Clients when they are configured as part of the Client Registration request or when a Client modifies their registration on the Clients API. If a Client sets this value tonull
, then the Server MUST render the logo as a placeholder image, such as an image with the words “No Logo Provided”.scope
- From the Client object, as a list of scopes for which the Client is approved for production use, except for theclient_admin
scope.profile_description
- From the Client Settings object, as a block of text as a description of the Client. Servers MUST NOT render URLs, phone numbers, emails, and other text that may be auto-detected as a link as links, and instead MUST render the description text as text. Servers MUST render line breaks in the profile entry as submitted by the Client.profile_button_uri
- From the Client Settings object, as an anchor link styled as one of the specified Button Styles that opens a new tab via thetarget="_blank"
anchor attribute for the user. If a Client sets this value tonull
, then the Server MUST NOT render this button link.profile_button_uri
- From the Client Settings object, as an anchor link styled as the specifiedprofile_button_style
Button Styles and when clicked opens a new tab via thetarget="_blank"
andrel="noopener noreferrer nofollow"
anchor attributes. If a Client sets this value tonull
, then the Server MUST NOT render this button link.profile_contact_name
- From the Client Settings object, as text of the Client’s contact name.profile_contact_email
- From the Client Settings object, as amailto:
link to the Client’s contact email.profile_contact_phone
- From the Client Settings object, as atel:
link to the Client’s contact phone number, where the linkhref
is formatted as an E.123 international phone number and the link text is displayed as the Server’s locale format. If a Client sets this value tonull
, then the Server MUST NOT render this contact phone number link.profile_contact_website
- From the Client Settings object, as an anchor link when clicked opens a new tab via thetarget="_blank"
andrel="noopener noreferrer nofollow"
anchor attributes. If a Client sets this value tonull
, then the Server MUST NOT render this contact website link.
Additionally, for Clients registered and approved for scopes that have authorization_code
in the scope’s grant_types
(thus allowing the Client to obtain user authorizations), Server MUST render a link on the Client profile entry for where users may go to view their current and previous authorization grants with the Client.
11. Extensions đź”—
TODO
12. Examples đź”—
TODO
13. Security Considerations đź”—
This specification describes a protocol by which a utility or other entity (a Server) can allow third parties (Clients) to register and obtain privileged access to the Server’s offered capabilities and data. Because the functionality described in this specification enables access to private Server functionality and data, Servers MUST follow industry cybersecurity best practices when securing their implementations of this specification to prevent unintended or inadvertent access to privileged functionality or data to Clients who are not authorized. These best practices include requiring HTTPS for API endpoints using the latest widely adopted encryption standards, undergoing regular security audits and penetration tests, and internally requiring security-focused process controls and data handling procedures.
TODO: Security considerations on public directory descriptions, buttons, etc.
13.1. Restricted Access đź”—
For unauthenticated endpoints (Authorization Server Metadata, Client Registration Process), while Servers can add rate limiting configurations to protect their systems from being overwhelmed with requests, Servers MUST NOT add anti-bot blocking measures (e.g. captchas) that prevent automated requests from other systems. The functionality described in this specification is intended to be able to be integrated in other platforms to allow those platforms to automate interactions with Servers on their users’ behalf.
If Authorization Server Metadata is referenced in a public CDSC-WG1-01 Server Metadata endpoint, then the Authorization Server Metadata and Client Registration Process must also be public.
Servers that wish to restrict access of by-default unauthenticated endpoints to certain Clients MUST configure well established authentication processes for Clients to ensure that only the approved Clients may access the restricted endpoint. This specification does not describe specifically how Servers will authenticate Clients for by-default unauthenticated endpoints, as these restricted access protocols are context dependent. For example, if a Server providing a private Client Registration endpoint as part of an existing logged in portal, then they can use that logged in portal’s session cookie to authenticate Client requests to the registration endpoint.
For authenticated endpoints (Clients API, Client Settings API, Client Updates API, Scope Credentials API, Grants API), Servers MUST authenticate requests using OAuth’s Authorization Request Header Field with access tokens obtained using the OAuth’s Issuing an Access Token process.
13.2. Rate Limiting đź”—
For unauthenticated endpoints (Authorization Server Metadata, Client Registration Process), Servers SHOULD configure rate limiting restrictions so that bots and misconfigured scripts will not flood and overwhelm the endpoints with requests, while still allowing legitimate and low-volume automated requests have access to the endpoints.
For authenticated endpoints (Clients API, Client Settings API, Client Updates API, Scope Credentials API, Grants API), Servers SHOULD configure rate limiting by Client and Scope Credential to ensure that individual Clients do not overwhelm Servers with authenticated API requests. Additionally, Servers SHOULD configure rate limiting for unauthenticated or failed authentication requests to authenticated API endpoints to prevent brute force attempts to gain access to authenticated APIs.
14. References đź”—
TODO
15. Acknowledgments đź”—
The authors would like to thank the late Shuli Goodman, who was the Executive Director of LFEnergy, for her incredible leadership in initially organizing the Carbon Data Specification.
16. Authors’ Addresses 🔗
Daniel Roesler
UtilityAPI
Email: daniel@utilityapi.com
URI: https://utilityapi.com/