授权错误

在授权过程中,Google OAuth 可能会返回错误。请使用本指南排查此过程中最常见的错误。

问题排查

如需详细了解 Google OAuth,请参阅使用 OAuth 2.0 访问 Google API

刷新令牌不断过期

如果客户端 ID 未获批准,刷新令牌可能会在 7 天后停止工作,这是一种可能的原因。7 天令牌过期与商业版或沙盒批准无关。服务或用户账号需要获得 OAuth 2.0 客户端 ID 批准并投入生产,才能获得更长的令牌有效期。 如需了解详情,请参阅刷新令牌过期

访问遭拒

如果您已在 Google Cloud 中设置 OAuth 权限请求页面,且 用户类型外部,则当您尝试使用未列为应用的测试用户的 Google 账号进行账号关联时,系统会显示“访问遭拒”错误。请务必将 Google 账号添加到 测试用户 部分 中的 OAuth 权限请求页面

合作伙伴连接管理工具 (PCM) 错误

如需获得有关访问 PCM 时遇到的任何错误的帮助,请参阅 合作伙伴连接管理工具 (PCM) 错误参考

此应用未经 Google 验证

SDM API 使用受限范围,这意味着,除非完成OAuth API 验证,否则在授权期间使用此范围的任何 应用都将“未经验证”。如果仅供 Device Access 个人 使用,则无需进行 OAuth API 验证。

在授权 过程中,您可能会看到“此应用未经 Google 验证”屏幕,如果未在 Google Cloud 的OAuth 权限请求页面上配置 sdm.service 范围,则会显示此屏幕。您可以依次点击高级 选项和前往 项目名称(不安全) 来绕过此屏幕。

如需了解详情,请参阅未经验证的应用 屏幕

客户端无效

尝试获取访问令牌或刷新令牌时,如果您提供的 OAuth 2.0 客户端密钥不正确,则会收到“客户端无效”错误。请确保您在访问令牌和刷新令牌调用中使用的 client_secret值是您使用的 OAuth 2.0 客户端 ID 的值,如您的 Google Cloud Credentials 页面所示。

请求无效,缺少必需的范围

在 PCM 中授予权限后,您可能会遇到“请求无效”错误,并显示“缺少必需的参数:scope”。请确保您在授权调用中使用的 scope值与您为 OAuth 2.0 客户端设置的值相同, 如您的 Google Cloud 凭据 页面所示。

重定向 URI 不匹配

在进行授权时,您可能会遇到“重定向 URI 不匹配”错误。请确保您在授权调用中使用的 redirect_uri 值与您为 OAuth 2.0 客户端设置的值相同,如您的 Google Cloud 凭据 页面所示。

快速参考

使用此参考快速实现授权 user 和关联其 Google 账号 的步骤。

如需使用此快速参考,请使用特定集成的值修改代码示例中的每个占位符变量,并根据需要复制和粘贴:

1 PCM

将 user 重定向到应用中的 PCM 链接,替换以下内容:

  1. project-id 替换为您的 Device Access Project ID
  2. oauth2-client-id 替换为您的 Google Cloud 凭据中的 OAuth2 客户端 ID
  3. redirect-uri 替换为您使用的 OAuth2 客户端 ID 指定的重定向 URI
  4. scope 替换为您的 可用 范围之一
https://nestservices.google.com/partnerconnections/project-id/auth?redirect_uri=redirect-uri&access_type=offline&prompt=consent&client_id=oauth2-client-id&response_type=code&scope=https://www.googleapis.com/auth/scope

2 授权代码

通过 PCM 为 您选择的范围授予权限后,应重定向到您指定的重定向 URI。 user 授权代码以网址中的 code 参数的形式返回, 网址应采用以下格式:

redirect-uri?code=authorization-code&scope=https://www.googleapis.com/auth/scope

3 访问令牌

使用授权代码检索访问令牌,您可以使用该令牌代表用户调用 SDM API。

对 Google 的 OAuth 端点进行 POST 调用,替换以下内容:

  1. oauth2-client-idoauth2-client-secret 替换为您的 Google Cloud 凭据中的 OAuth2 客户端 ID 和客户端密钥
  2. authorization-code 替换为您在上一步中收到的代码
  3. redirect-uri 替换为您使用的 OAuth2 客户端 ID 指定的重定向 URI

Google OAuth 会返回两个令牌:访问令牌和一个 刷新令牌。

请求

curl -L -X POST 'https://www.googleapis.com/oauth2/v4/token?client_id=oauth2-client-id&client_secret=oauth2-client-secret&code=authorization-code&grant_type=authorization_code&redirect_uri=redirect-uri'

响应

{
  "access_token": "access-token",
  "expires_in": 3599,
  "refresh_token": "refresh-token",
  "scope": "https://www.googleapis.com/auth/scope",
  "token_type": "Bearer"
}

4 API 调用

在您使用 user访问令牌进行 API 调用之前,授权尚未完成。此 初始调用会完成授权过程并启用事件。

必须 使用为指定范围列出的 API 调用之一来完成授权。

sdm.service

设备

如需了解详情,请参阅 devices.list API 参考。

curl -X GET 'https://smartdevicemanagement.googleapis.com/v1/enterprises/project-id/devices' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer access-token'

5 刷新令牌

SDM API 的访问令牌仅在 1 小时内有效,如 Google OAuth 返回的 expires_in 参数中所述。如果 您的访问令牌过期,请使用刷新令牌获取新令牌。

对 Google 的 OAuth 端点进行 POST 调用,替换以下内容:

  1. oauth2-client-idoauth2-client-secret 替换为您的 Google Cloud 凭据中的 OAuth2 客户端 ID 和客户端密钥
  2. refresh-token 替换为您在首次获取访问令牌时收到的代码。

Google OAuth 会返回新的访问令牌。

请求

curl -L -X POST 'https://www.googleapis.com/oauth2/v4/token?client_id=oauth2-client-id&client_secret=oauth2-client-secret&refresh_token=refresh-token&grant_type=refresh_token'

响应

{
  "access_token": "new-access-token",
  "expires_in": 3599,
  "scope": "https://www.googleapis.com/auth/scope",
  "token_type": "Bearer"
}