适用于外部 API 网关的 OpenID Connect 动态客户端注册
虽然不是典型的授权流程,但您可以使用 OpenID Connect 动态客户端注册来使您的 Salesforce 实例成为独立的 OAuth 授权服务器,以保护托管在外部 API 网关上的资源。
所需的 Edition
| 适用于 Salesforce Classic 和 Lightning Experience |
| 适用于:所有版本 |
动态客户端注册使资源服务器能够直接将客户端应用程序在 Salesforce 上注册为连接的应用程序。客户端应用程序是请求访问受保护资源的外部应用程序。要将客户端应用程序注册为连接的应用程序,资源服务器会向授权服务器发送一个请求。授权服务器验证资源服务器的请求,并创建连接的应用程序,为其提供唯一的客户端 ID 和客户端密码。
作为授权过程的一部分,标记自检允许所有 OAuth 连接的应用程序检查 OAuth 2.0 访问或刷新标记的当前状态。资源服务器或连接的应用程序将客户端应用程序的客户端 ID 和密码发送到授权服务器,启动 OAuth 授权流。作为该流的一部分,授权服务器验证或自检客户端应用程序的访问标记。如果访问标记为最新且有效,客户端应用程序将被授予访问权限。
例如,您希望 Salesforce 合作伙伴能够独立访问订单状态数据。因此,您可以构建一个服务,通过在它前面加上 API 网关来公开多个系统的订单状态,该网关部署在 MuleSoft Anypoint 平台上。要启用对此数据的受保护访问,请执行以下步骤。
- 在 API 网关上应用 OpenID 令牌强制策略。
- 将您的 Salesforce 实例配置为 Mulesoft Anypoint 平台上的客户端管理提供商。
通过该配置,API 网关在 OpenID Connect 动态客户端注册流中使用您的 Salesforce 实例作为其授权提供商。
下面是该流的操作步骤。
- 为 API 网关创建连接的应用程序,并为其生成初始访问令牌。Salesforce 需要此令牌,以对动态客户端注册请求进行身份验证。请查看生成初始访问令牌。
- 配置 API 网关:
- 应用 OpenID 令牌强制策略。
- 将您的 Salesforce 实例配置为客户端管理提供商。
- 如果您的 API 网关需要,请注册您的初始访问令牌。
- 为了启动流,API 网关向 Salesforce 动态客户端注册端点注册连接的应用程序。
- 成功注册后,Salesforce 会使用注册的已连接应用程序的元数据进行响应。
- API 网关向 Salesforce 授权端点发送请求,以基于与其相关联的授权许可类型来批准注册的连接应用程序。验证成功后,Salesforce 会为注册的已连接应用程序生成访问令牌。
- API 网关向 Salesforce 令牌自检端点发送请求,以验证访问令牌。
- 验证成功后,API 网关允许注册的连接应用程序访问受保护的数据。
注册连接的应用程序
代表外部 API 网关的连接的应用程序向 Salesforce 动态客户端注册端点注册新的客户端应用程序,作为连接的应用程序。动态客户端注册端点 URL 的格式是 https://hostname/services/oauth2/register。
Salesforce 需要请求 OAuth 2.0 连接的应用程序,以在请求的标题中提供初始访问令牌。此示例是请求发布到动态客户端注册端点。
POST /services/oauth2/register HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer <initial.access.token>
Host: myorg.salesforce.com
{"redirect_uris":["https://client.salesforce.com/redirect.html",
"https://client.salesforce.com/callback","http://localhost"],
"response_types":["code","token","id_token"],
"grant_types":["authorization_code","implicit","refresh_token"],
"application_type":"web",
"contacts":["abc@sf.com","ve7jtb@example.org"],
"client_name","Client Name Example",
"logo_uri":"https://client.salesforce.com/logo.png",
"client_uri":"https://client.salesforce.com/info.html"}在注册请求中包括以下参数。有关这些参数的其他信息,请参阅包含在正误表集 1 中的 OpenID Connect 动态客户端注册 1.0 中的章节 3.1 客户端注册请求。
| 参数 | 描述 |
|---|---|
redirect_url
|
成功身份验证后用户重定向的 URL。重定向 URL 必须匹配连接的应用程序的回拨 URL 字段中的一个值。否则,批准失败。您可以在连接的应用程序的“管理连接的应用程序”页面或连接的应用程序的定义中找到重定向 URI。该值必须是编码 URL。 |
response_types
|
(可选)客户端限制自己使用的 OAuth 2.0 响应值。 Salesforce 未存储或限制客户端的响应类型。 |
grant_types
|
(可选)客户端限制自己使用的 OAuth 2.0 授予类型。 Salesforce 未存储或限制客户端的授予类型。 |
application_type
|
(可选)应用程序类型,例如本地或 web。 Salesforce 不会存储客户端的应用程序类型。 |
contacts
|
(可选)如果您未提供联系人值,Salesforce 会自动生成默认联系人。 |
client_name
|
(可选)如果您未提供客户端名称值,Salesforce 会自动生成默认客户端名称。 |
scopes
|
(可选)定义连接的应用程序可以访问的受保护资源类型的权限。当您构建连接的应用程序时,您可以为它分配范围,并且它们在授权流程中包含在 OAuth 标记中。如果不包含此参数,将请求分配给已连接应用程序的所有范围。此参数中传递的范围必须是已注册范围的子集。有关有效参数,请参见 Oauth 范围。 如果您未提供范围,Salesforce 会添加客户端的 id、api 和 openid。 如果您在请求中包含 refresh_token 授予类型,但未提供范围,Salesforce 会添加 refresh_token 范围。 |
Salesforce 使用注册的已连接应用程序的元数据进行响应
成功注册后,Salesforce 会向 API 网关发送响应,其中包含有关新连接的应用程序的client_id、client_secret和所有注册的元数据。此示例显示了 Salesforce 对代表 API 网关的已连接应用程序的响应。
HTTP/1.1 201 Created
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{"client_id":"client_id=3MVG9lKcPoNINVBIPJjdw1J9LLM82HnFVVX19KY1
uA5mu0QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCscA9GE",
"client_secret":"client_secret=
1955279925675241571",
"registration_access_token":"00DR00000009GVP!ARQAQE5XuPV7J4GoOu3wvLZjZI_TxoBpeZpRb6d8AVdII6cz
_BY_uu1PKxGeAjkSvO0LpWoL_qfbQWKlXoz1f2ICNiy.6Ndr",
"registration_client_uri":"https://login.salesforce.com/
services/oauth2/register/3MVG9qKMKuRGRcbs8STMW7uUqqf0OP5l1GeQt1qRF6_
UyAqTC1ky0RlpN3L9Z8PSo4nTTTmDzymYy4tEbrKY.",
"client_id_issued_at":1534292303,
"client_secret_expires_at":0,
"token_endpoint_auth_method":"client_secret_post",
"redirect_uris":["https://login.salesforce.com/redirect.html",
"https://client.salesforce.com/callback","http://localhost"],
"response_types":["code","token","id_token"],
"grant_types":["authorization_code","implicit","refresh_token"],
"contacts":["abc@sf.com"],
"client_name":"Client Name Example",
"logo_uri":"https://client.salesforce.com/logo.png",
"client_uri":"https://client.salesforce.com/info.html",
"scopes":["openid","refresh_token","id","api"]}
Salesforce 验证令牌
Salesforce 会验证页头中的客户端凭据并发送响应表示令牌是否处于活动状态。此响应表示令牌仍处于活动状态。
HTTP/1.1 200 OK
Content-Type: application/json
{
"active":true,
"scope":"id api web full refresh_token openid",
"client_id":"OAuthSp",
"username":"myuser@salesforce.com",
"sub":"https://login.salesforce.com/id/00Dxx0000001gEREAY/005xx000001Sv6AAAS",
"token_type":"access_token",
"exp":1528502109,
"iat":1528494909,
"nbf":1528494909"
}如果您在请求中包含 child_sessions 参数,响应会包含有关子会话有效性的信息,例如以下内容。
HTTP/1.1 200 OK
Content-Type: application/json
{
"active":true,
"scope":"id api web full refresh_token openid",
"client_id":"OAuthSp",
"username":"myuser@salesforce.com",
"sub":"https://login.salesforce.com/id/00Dxx0000001gEREAY/005xx000001Sv6AAAS",
"token_type":"access_token",
"exp":1528502109,
"iat":1528494909,
"nbf":1528494909
child_sessions":{
"content":"inactive",
"lightning":"active",
"visualforce":"missing"}
}如果令牌未处于活动状态,Salesforce 会发送以下响应。
HTTP/1.1 200 OK
Content-Type: application/json
{
"active": false
}
