错误 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

scope=https://www.googleapis.com/auth/homegraph**

我也在网上查了很多,都没有找到真正的原因。 因此,由于这个范围问题,我无法获得 ACCESS_TOKEN.

我已经关注了 Google 的文档,那里提到了范围。

这是来自 oauth 2.0 playground 设置的图片- OAuth 2.0 configuration

问题是用户应该获取和发送访问令牌。 服务帐户 应该获取和发送访问令牌。这是为了确保您的服务有权与 Home Graph API.

对话

您表示您使用 "userid and password" 登录了 OAuth 游乐场。但是服务帐户没有密码。

如果您使用的是 Google 的库之一,它将负责为您获取访问令牌,这是最​​简单的方法。如果您只是测试并且需要访问令牌,您可以使用 oauth2l 之类的东西根据服务帐户凭据获取访问令牌。

我已经实现了调用 HomeGraph 报告状态的 REST 方法,如下所示。

我们需要按照以下步骤操作:

  1. 为您的项目创建一个服务帐户并安全地存储 json 文件
  2. 使用服务帐户 JSON,从 Google
  3. 获取访问令牌
  4. 使用 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