在授权过程中,Google OAuth 可能会返回错误。您可以参考本指南来排查在此过程中最常见的错误。
问题排查
如需详细了解 Google OAuth,请参阅使用 OAuth 2.0 访问 Google API。
刷新令牌不断过期
刷新令牌可能会在 7 天后失效,客户端 ID 未获批准可能是其中一个原因。7 天令牌过期与商用或沙盒审批无关。服务账号或用户账号需要先让其 OAuth 2.0 客户端 ID 获得批准并投入生产环境,才能延长令牌的有效期。如需了解详情,请参阅刷新令牌到期时间。
访问遭拒
如果您已在 Google Cloud 中设置 OAuth 权限请求页面,并且用户类型为外部,那么如果您尝试与未列为应用测试用户的 Google 账号建立账号关联,则会收到“拒绝访问”错误。请务必将该 Google 账号添加到 OAuth 权限请求页面中的测试用户部分。
合作伙伴连接管理工具 (PCM) 错误
如需有关访问 PCM 时遇到的任何错误的帮助,请参阅 Partner Connections Manager (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 凭据页面)。
请求无效,缺少必需的范围
在 PCM 中授予权限后,您可能会遇到“缺少必需参数:scope”的“请求无效”错误。确保您在授权调用中使用的 scope
值与您为 OAuth 2.0 客户端设置的值相同(如 Google Cloud 凭据页面中所示)。
重定向 URI 不匹配
在授权过程中,您可能会遇到“重定向 URI 不匹配”错误。确保您在授权调用中使用的 redirect_uri
值与您为 OAuth 2.0 客户端设置的值相同,如 Google Cloud 凭据页面中所示。
快速参考
请参阅此参考文档,快速执行授权user 并关联其 Google 账号的步骤。
如需使用此快速参考,请使用您具体集成的值修改代码示例中的每个占位符变量,并根据需要进行复制和粘贴:
1 PCM
将 user 指向应用中的 PCM 链接,替换以下代码:
- 将project-id 替换为您的 Device Access Project ID
- oauth2-client-id 替换为您的 Google Cloud 凭据中的 OAuth2 客户端 ID
- redirect-uri,其中包含为您使用的 OAuth2 客户端 ID 指定的重定向 URI
- 将 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 为所选范围授予权限后, user 应重定向到您指定的重定向 URI。授权代码会作为网址中的 code
参数返回,该参数应采用以下格式:
redirect-uri?code=authorization-code&scope=https://www.googleapis.com/auth/scope
3 访问令牌
使用授权代码检索访问令牌,您可以使用该令牌代表用户调用 SDM API。
向 Google 的 OAuth 端点发出 POST 调用,替换以下内容:
- 将 oauth2-client-id 和 oauth2-client-secret 替换为您的 Google Cloud 凭据中的 OAuth2 客户端 ID 和客户端密钥
- 将 authorization-code 替换为您在上一步中收到的代码
- 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 调用,替换以下内容:
- 将 oauth2-client-id 和 oauth2-client-secret 替换为您的 Google Cloud 凭据中的 OAuth2 客户端 ID 和客户端密钥
- 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" }