错误 400:invalid_scope 某些请求的范围无法显示:[https://www.googleapis.com/auth/homegraph]
Error 400: invalid_scope Some requested scopes cannot be shown: [https://www.googleapis.com/auth/homegraph]
所以我正在尝试通过调用 API 端点
来使用 Home Graph API
https://homegraph.googleapis.com/v1/devices:requestSync
这是一个 HTTP POST 请求,需要 ACCESS_TOKEN
和服务帐户密钥。
根据 Google 的文档,获取服务帐户密钥很容易。问题是获取 ACCESS_TOKEN.
根据 Google 的 this 文档,我需要使用以下权限范围
创建 ACCESS_TOKEN
https://www.googleapis.com/auth/homegraph
我打开 OAuth 2.0 Playground 请求开发人员临时 ACCESS_TOKEN 进行测试。我写了所有必要的网址,并在范围内写了这个 -
scope is written to be authorized
在此之后,我导航到我的授权 URL(即 Google 的登录页面)。我使用电子邮件 ID 和密码登录。
如果凭据正确并且提到的范围有效,那么我应该被重定向到带有授权代码的 OAuth playground 页面,我会用它交换访问令牌和刷新令牌。
但是,实际发生的是在我输入我的凭据后,我收到以下错误并且我从未被重定向到 Oauth Playground 页面-
Authorization Error
Error 400: invalid_scope
Some requested scopes cannot be shown: [https://www.googleapis.com/auth/homegraph]
Request Details
access_type=offline
o2v=2
response_type=code
redirect_uri=https://developers.google.com/oauthplayground
prompt=consent
client_id=xxxxxxxxx.apps.googleusercontent.com
我也在网上查了很多,都没有找到真正的原因。
因此,由于这个范围问题,我无法获得 ACCESS_TOKEN.
我已经关注了 Google 的文档,那里提到了范围。
这是来自 oauth 2.0 playground 设置的图片- OAuth 2.0 configuration
问题是用户你应该不获取和发送访问令牌。 服务帐户 应该获取和发送访问令牌。这是为了确保您的服务有权与 Home Graph API.
对话
您表示您使用 "userid and password" 登录了 OAuth 游乐场。但是服务帐户没有密码。
如果您使用的是 Google 的库之一,它将负责为您获取访问令牌,这是最简单的方法。如果您只是测试并且需要访问令牌,您可以使用 oauth2l 之类的东西根据服务帐户凭据获取访问令牌。
我已经实现了调用 HomeGraph 报告状态的 REST 方法,如下所示。
我们需要按照以下步骤操作:
- 为您的项目创建一个服务帐户并安全地存储 json 文件
- 使用服务帐户 JSON,从 Google
获取访问令牌
- 使用 Oauth 2.0 令牌作为 Bearer 授权,调用 Report State API
第 1 步:
这很简单。请按照以下步骤操作 link
https://developers.google.com/assistant/smarthome/develop/report-state#expandable-1
第 2 步:
请参考以下代码以使用服务帐户 json
获取访问令牌
GoogleCredentials credentials = GoogleCredentials
.fromStream(Helper.class.getClassLoader().getResourceAsStream("smart-home-key.json"))
.createScoped("https://www.googleapis.com/auth/homegraph");
credentials.refreshIfExpired();
AccessToken token = credentials.getAccessToken();
return token.getTokenValue();
第 3 步:
调用报告状态 API
curl -X POST -H“授权:持有者[[来自步骤 2 的访问令牌]]”
-H "Content-Type: application/json"
-d @request-body.json
“https://homegraph.googleapis.com/v1/devices:reportStateAndNotification”
参考链接:
https://developers.google.com/assistant/smarthome/develop/report-state#http-post
https://cloud.google.com/endpoints/docs/openapi/service-account-authentication
https://developers.google.com/identity/protocols/oauth2/service-account#httprest_1
https://developers.google.com/assistant/smarthome/develop/report-state#expandable-1
所以我正在尝试通过调用 API 端点
来使用 Home Graph APIhttps://homegraph.googleapis.com/v1/devices:requestSync
这是一个 HTTP POST 请求,需要 ACCESS_TOKEN
和服务帐户密钥。
根据 Google 的文档,获取服务帐户密钥很容易。问题是获取 ACCESS_TOKEN.
根据 Google 的 this 文档,我需要使用以下权限范围
创建 ACCESS_TOKENhttps://www.googleapis.com/auth/homegraph
我打开 OAuth 2.0 Playground 请求开发人员临时 ACCESS_TOKEN 进行测试。我写了所有必要的网址,并在范围内写了这个 - scope is written to be authorized
在此之后,我导航到我的授权 URL(即 Google 的登录页面)。我使用电子邮件 ID 和密码登录。
如果凭据正确并且提到的范围有效,那么我应该被重定向到带有授权代码的 OAuth playground 页面,我会用它交换访问令牌和刷新令牌。
但是,实际发生的是在我输入我的凭据后,我收到以下错误并且我从未被重定向到 Oauth Playground 页面-
Authorization Error
Error 400: invalid_scope
Some requested scopes cannot be shown: [https://www.googleapis.com/auth/homegraph]
Request Details
access_type=offline
o2v=2 response_type=code
redirect_uri=https://developers.google.com/oauthplayground
prompt=consent client_id=xxxxxxxxx.apps.googleusercontent.com
我也在网上查了很多,都没有找到真正的原因。 因此,由于这个范围问题,我无法获得 ACCESS_TOKEN.
我已经关注了 Google 的文档,那里提到了范围。
这是来自 oauth 2.0 playground 设置的图片- OAuth 2.0 configuration
问题是用户你应该不获取和发送访问令牌。 服务帐户 应该获取和发送访问令牌。这是为了确保您的服务有权与 Home Graph API.
对话您表示您使用 "userid and password" 登录了 OAuth 游乐场。但是服务帐户没有密码。
如果您使用的是 Google 的库之一,它将负责为您获取访问令牌,这是最简单的方法。如果您只是测试并且需要访问令牌,您可以使用 oauth2l 之类的东西根据服务帐户凭据获取访问令牌。
我已经实现了调用 HomeGraph 报告状态的 REST 方法,如下所示。
我们需要按照以下步骤操作:
- 为您的项目创建一个服务帐户并安全地存储 json 文件
- 使用服务帐户 JSON,从 Google 获取访问令牌
- 使用 Oauth 2.0 令牌作为 Bearer 授权,调用 Report State API
第 1 步: 这很简单。请按照以下步骤操作 link https://developers.google.com/assistant/smarthome/develop/report-state#expandable-1
第 2 步: 请参考以下代码以使用服务帐户 json
获取访问令牌GoogleCredentials credentials = GoogleCredentials
.fromStream(Helper.class.getClassLoader().getResourceAsStream("smart-home-key.json"))
.createScoped("https://www.googleapis.com/auth/homegraph");
credentials.refreshIfExpired();
AccessToken token = credentials.getAccessToken();
return token.getTokenValue();
第 3 步: 调用报告状态 API
curl -X POST -H“授权:持有者[[来自步骤 2 的访问令牌]]”
-H "Content-Type: application/json"
-d @request-body.json
“https://homegraph.googleapis.com/v1/devices:reportStateAndNotification”
参考链接: https://developers.google.com/assistant/smarthome/develop/report-state#http-post https://cloud.google.com/endpoints/docs/openapi/service-account-authentication https://developers.google.com/identity/protocols/oauth2/service-account#httprest_1 https://developers.google.com/assistant/smarthome/develop/report-state#expandable-1