适用于服务器到服务器集成的 OAuth 2.0 客户端凭据流
有时,您想要在两个应用程序之间直接共享信息,而无需用户参与。对于这些场景,您可以使用 OAuth 2.0 客户端凭据流。在此流中,客户端应用程序将其在外部客户端应用程序中定义的客户端凭据(它的使用者密钥和使用者密码)交换为访问令牌。此消除了对显式用户交互的需要,尽管它要求您指定集成用户来运行集成。您可以使用此流作为 OAuth 2.0 用户名密码流的更安全的替代方案。
所需的 Edition
| 适用于 Salesforce Classic 和 Lightning Experience |
| 适用于:所有版本 |
要使用客户端凭据流,您必须创建外部客户端应用程序,并配置 OAuth 设置和访问策略。
例如,您构建了一个自定义应用程序来运行 Salesforce 的自动报表。您希望应用程序每晚运行报表。要将自定义应用程序与 Salesforce 集成,您需要设置外部客户端应用程序。然后,要为客户端凭据流配置外部客户端应用程序,您需要启用该流并分配集成用户。当夜间报表服务开始时,您的自定义应用程序会使用这些高级步骤访问 Salesforce 数据。
- 外部客户端应用程序通过 POST 请求将其客户端凭据发送到 Salesforce OAuth 令牌端点。
- Salesforce 验证客户端凭据并验证应用程序。
- Salesforce 会代表您分配的集成用户返回访问令牌。
- 外部客户端应用程序使用访问令牌调用 Salesforce API,例如 REST API。
- API 以报表的请求数据作为响应。
请求访问标记
让我们深入了解通过客户端凭据流获取访问标记的过程。
为了启动流,外部客户端应用程序将其客户端凭据发布到 Salesforce 令牌端点。您可以将客户端凭据作为参数包含在请求正文中。或者,为了增加安全性,请将客户端凭据放入基本授权标题中。
以下是请求正文中包含客户端凭据的示例 POST 请求。
POST /services/oauth2/token HTTP/1.1
Host: MyDomainName.my.salesforce.com
grant_type=client_credentials&
client_id=*******************&
client_secret=*******************对于此流,不支持对 https://login.salesforce.com 和 https://test.salesforce.com 的请求。请改用 My Domain URL。要查找 My Domain URL,从“设置”中,在快速查找框中输入 My Domain,然后选择 My Domain。
请求中必须包含这些参数。
| 参数 | 描述 |
|---|---|
client_id |
外部客户端应用程序的使用者密钥。要访问使用者密钥,请从外部客户端应用程序管理器中找到外部客户端应用程序,并从下拉列表中选择编辑设置。然后,展开 Oauth 设置部分,并单击消费者密钥和密码。在查看消费者密钥之前,有时会提示您验证您的身份。 |
client_secret |
外部客户端应用程序的使用者密码。要访问使用者密码,请从外部客户端应用程序管理器中找到外部客户端应用程序,并从下拉列表中选择编辑设置。然后,展开 Oauth 设置部分,并单击消费者密钥和密码。在查看使用者密码之前,有时会提示您验证您的身份。 |
grant_type |
外部客户端应用程序请求的 OAuth 2.0 授权类型。对于客户端凭据流,此值必须设置为 有关客户端凭据授予类型的详细解释,请参见 Internet 工程任务组中的OAuth 2.0 授权框架 中的 4,4 客户端凭据授权部分。 |
以下是基本授权标题中客户端凭据的示例。使用此格式,client_id会以格式 client_id:client_secret 附加到client_secret,结果值为 Base64 编码。
POST /services/oauth2/token HTTP/1.1
Host: MyDomainName.my.salesforce.com
Header: Authorization: Basic
TXlDbGllbnRJRDpNeUNsaWVudFNlY3JldA==
grant_type=client_credentials如果您使用此格式,grant_type 是请求正文中唯一必需的参数。grant_type必须设置为 client_credentials。
Salesforce 授予访问标记
验证客户端凭据后,Salesforce 返回包含访问标记和请求范围的响应。应用程序可以使用访问标记访问 Salesforce 中的受保护数据。
以下是 JSON 格式的访问标记响应示例。
{
"access_token": "*******************",
"instance_url": "https://yourInstance.salesforce.com",
"id": "https://login.salesforce.com/id/XXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXX",
"token_type": "Bearer",
"scope": "id api",
"issued_at": "1657741493799",
"signature": "c2lnbmF0dXJl"
}这些参数包含在响应中。
| 参数 | 描述 |
|---|---|
access_token
|
外部客户端应用程序用来代表客户端应用程序请求访问受保护资源的 OAuth 标记。访问标记可以附带范围形式的附加权限。 |
instance_url
|
指示用户的组织实例的 URL。例如:https://yourInstance.salesforce.com/. |
id
|
可用于标识组织和集成用户的身份 URL。URL 的格式是 https://login.salesforce.com/id/orgID/userID。 |
token_type
|
Bearer 令牌类型,用于包含访问令牌的所有响应。
|
scope
|
与访问标记关联的范围。 范围进一步定义了客户端可以访问的受保护资源的类型。在构建外部客户端应用程序时,您可为其分配范围,并在授权流期间包含在 OAuth 令牌中。 由于客户端凭据流不支持 UI 会话,并且不发行刷新令牌,因此 Salesforce 会自动筛选出这些范围。
有关更多信息,请查看OAuth 标记和范围。 |
issued_at
|
签名创建时间的时间戳,单位毫秒。 |
signature
|
使用 client_secret 签名的 Base64 编码 HMAC-SHA256 签名。签名可以包括连接 ID 和issued_at值,您可以使用它们来验证身份 URL 自服务器发送以来没有更改。 |

