适用于 IoT 集成的 OAuth 2.0 设备流
要集成在输入或显示能力有限的设备上运行的应用程序,例如智能电视、电器和其他 IoT 设备,请使用 OAuth 2.0 设备流。命令行应用程序也可以使用该流。通过在支持更多高级输入功能的设备(例如台式机或移动设备)上访问浏览器,用户可以将这些应用程序连接到 Salesforce。
所需的 Edition
| 适用于 Salesforce Classic 和 Lightning Experience |
| 适用于:所有版本 |
例如,一位客户晚上外出时,使用蓝牙设备来控制室内灯光。您可以为蓝牙设备创建外部客户端应用程序,以启用此流。
- 用户在他们的移动设备上打开蓝牙应用程序,然后单击“开灯”。
- 外部客户端应用程序向 Salesforce 令牌端点发布请求。
- Salesforce 验证该请求,并返回可读的用户代码、验证 URL 和设备代码。
- 蓝牙应用程序会显示设备代码,并指示用户在指定的验证 URL 中输入。应用程序还开始轮询 Salesforce 标记端点进行授权。
- 用户单击验证 URL 的链接并输入代码。
- 然后,用户授权应用程序访问他们受保护的数据,在这种情况下是他们家的位置。
- Salesforce 向外部客户端应用程序发送访问和刷新令牌。
- 蓝牙应用程序可以访问用户的家庭位置并打开灯。
让我们来看看这个授权流中的步骤。
设备请求授权
为了启动授权流,设备通过外部客户端应用程序向 Salesforce 令牌端点发布授权请求。
例如:
POST /services/oauth2/token HTTP/1.1
Host: login.salesforce.com
Content-Type: application/x-www-form-urlencoded
response_type=device_code&
client_id=3MVG9PhR6g6B7ps7TTI4cP7Mppg3l7tu.MRAYULyVqcmA9hGLpHiiS.Q7rO9yjlmffiBUM6tFpYAlXEkRjHb9&scope=api在请求中包括这些参数。
| 参数 | 描述 |
|---|---|
Request Header
|
请求标题包含此信息:
|
response_type
|
外部客户端应用程序请求的 OAuth 2.0 授权类型。该流的值必须是 device_code。 |
client_id
|
外部客户端应用程序的使用者密钥。要访问使用者密钥,请从外部客户端应用程序管理器中找到外部客户端应用程序,并从下拉列表中选择编辑设置。然后,展开 Oauth 设置部分,并单击消费者密钥和密码。在查看消费者密钥之前,有时会提示您验证您的身份。 |
scope
|
可选。定义外部客户端应用程序可以访问的受保护资源类型的权限。在构建外部客户端应用程序时,您可为其分配范围,并在授权流期间包含在 OAuth 令牌中。如果您不包含此参数,则会请求分配给外部客户端应用程序的所有范围。此参数中传递的范围必须是已注册范围的子集。有关有效参数,请参见 Oauth 范围。 |
Salesforce 返回验证代码
验证该请求后,Salesforce 会返回可读的用户代码、验证 URL 和设备代码。
此示例响应会返回这些包含带有 200 个成功状态代码的值。
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"device_code":"M01WRzlQaFI2ZzZCN3BzN1RUSTRjUDdNcHBnM2w3dHUuTVJBWVVMeVZxY21BOWhHTHBIaWlTLlE3ck85eWpsbWZmaUJVTTZ0RnBZQWxYRWtSakhiOTsxMC4yMi4zNC45MjsxNDc3Njc0NDg3NTA1O1gxRDlTRUVU",
"user_code":"X1D9SEET",
"verification_uri":"https://acme.my.salesforce.com/setup/connect",
"interval":5
}
响应中包括以下参数。
| 参数 | 描述 |
|---|---|
Response Header
|
响应标题包含此信息:
|
device_code
|
设备的验证代码。该代码在 10 分钟内有效。代码可以包括大写字母、小写字母和数字。 Salesforce 可以随时更改我们格式化设备代码的方式。在您开发使用此流的集成时,请勿对设备代码格式和长度进行假设。 |
user_code
|
最终用户的验证代码,以 8 位字母数字代码的形式发送。用户必须在验证 URL 上输入该代码。该代码在 10 分钟内有效。 |
verification_uri
|
授权服务器上的最终用户验证 URL。用户必须在验证 URL 上输入用户代码。 通过 My Domain 登录 URL 或 Experience Cloud 站点 URL 进行验证,verification_uri 会反映启动流的 URL。例如,如果设备会将令牌请求发送到 https://acme.my.salesforce.com/services/oauth2/token,verification_uri 是 https://acme.my.salesforce.com/setup/connect。 或者,您可以将 |
interval
|
我们建议在标记端点投票请求之间等待的最小秒数。 |
用户会在设备投票标记端点时验证和认证
设备上的客户端应用程序会指示用户在计算机或智能手机上访问验证 URL,并输入用户代码。用户打开浏览器,导航到验证 URL,并输入显示在设备上的代码。如果代码有效,用户将根据需要登录。在成功登录后,用户允许设备访问 Salesforce 客户数据。
同时,在显示用户代码和验证 URL 后,设备上的客户端应用程序会重复为标记端点投票。投票会检查用户是否已授权访问,以及授权服务器是否已发布访问标记。
此处是投票请求示例:
POST /services/oauth2/token HTTP/1.1
Host: login.salesforce.com
Content-Type: application/x-www-form-urlencoded
grant_type=device&
client_id=3MVG9PhR6g6B7ps7TTI4cP7Mppg3l7tu.MRAYULyVqcmA9hGLpHiiS.Q7rO9yjlmffiBUM6tFpYAlXEkRjHb9&code=M01WRzlQaFI2ZzZCN3BzN1RUSTRjUDdNcHBnM2w3dHUuTVJBWVVMeVZxY21BOWhHTHBIaWlTLlE3ck85eWpsbWZmaUJVTTZ0RnBZQWxYRWtSakhiOTsxMC4yMi4zNC45MjsxNDc3Njc0NDg3NTA1O1gxRDlTRUVU投票请求除了标题之外,还包含这些参数。
| 参数 | 描述 |
|---|---|
grant_type
|
对于该流,该值必须是设备。 |
client_id
|
外部客户端应用程序的使用者密钥。要访问使用者密钥,请从外部客户端应用程序管理器中找到外部客户端应用程序,并从下拉列表中选择编辑设置。然后,展开 Oauth 设置部分,并单击消费者密钥和密码。在查看消费者密钥之前,有时会提示您验证您的身份。 |
code
|
授权服务器创建授权代码,这是一个短期标记,并在成功身份验证后将其传递给客户端。客户端会将授权码发送到授权服务器,以获取访问标记,或刷新标记。 |
Salesforce 授予访问标记
如果用户拥有授权访问权限,Salesforce 会以成功消息和访问标记以及其他值作为响应。例如:
{
"access_token": "00DD00000008Uw2!ARkAQGppKf6n.VwG.EnFSvi731qWh.7vKfaJjL7h49yutIC84gAsxMrqcE81GjpTjQbDLkytl2ZwosNbIJwUS0X8ahiILj3e"
"refresh_token": "your token here"
"signature": "hJuYICd2IHsjyTcFqTYiOr8THmgDmrcjgWaMp13X6dY="
"scope": "api"
"instance_url": "https://yourInstance.salesforce.com"
"id": "https://login.salesforce.com/id/00DD00000008Uw2MAE/005D0000001cAGmIAM"
"token_type": "Bearer"
"issued_at": "1477674717112"
}这些参数包含在示例响应中。
| 参数 | 描述 |
|---|---|
access_token
|
外部客户端应用程序用来代表客户端应用程序请求访问受保护资源的 OAuth 标记。访问标记可以附带范围形式的附加权限。 |
refresh_token
|
从 Web 服务器、用户代理或混合应用程序标记流中获取的标记。该值是密钥。采取适当措施保护它。仅当您的外部客户端应用程序设置了refresh_token范围时,才会返回此参数。 |
signature
|
使用 client_secret 签名的 Base64 编码 HMAC-SHA256 签名。签名可以包括连接 ID 和issued_at value,您可以使用它们来验证身份 URL 在服务器发送后没有更改。 |
scope
|
与访问标记关联的范围。 范围进一步定义了客户端可以访问的受保护资源的类型。在构建外部客户端应用程序时,您可为其分配范围,并在授权流期间包含在 OAuth 令牌中。 有关有效参数,请参见 Oauth 范围。 |
instance_url
|
指示用户的组织实例的 URL。例如:https://yourInstance.salesforce.com/. |
id
|
可用于标识用户以及查询有关用户的更多信息的身份 URL。请参阅身份 URL。 |
token_type
|
Bearer标记类型,用于包含访问标记的所有响应。 |
issued_at
|
签名创建时间的时间戳,单位毫秒。 |

