如何在 Google 上的 Actions 上仅使用 Google 帐户对用户进行身份验证?

How to authenticate user with just a Google account on Actions on Google?

目前 Google Assitant 包括一种简单的方法 和通过 OAuth2 在第三方服务上对用户进行身份验证的详细流程。如果我只需要让用户在 Google 本身上进行身份验证怎么办?我尝试使用 Google OAuth2 信息填写帐户 linking 流程,但这似乎不起作用。如果最后一件事应该能流畅地工作,那就足够了。

上下文:用户已经在相关网页上仅使用 Google 进行了身份验证。我只需要 link 这个已经通过身份验证的帐户与 Google 助理上未经过身份验证的帐户。

更新,2018 年 10 月 25 日:

自 2018 年 9 月 13 日起,如果您的项目使用 Google 登录,现在可以更简单地访问用户帐户。 Google Sign-In for Assistant 将在用户许可的情况下为您提供一个 ID 令牌,其中包含有关用户的信息,包括他们的 Google ID。仅使用语音即可授予此权限,并且相当精简。

如果您需要访问 Google 的 API,您可以 获得他们访问 OAuth 范围的权限。

更新,2017 年 10 月 25 日:

截至 10 月 4 日或 7 日左右,Google 已更新 their policy(再次)以恢复有效的语言限制 OAuth 端点。条款现在包括

When implementing account linking using OAuth, you must own your OAuth endpoint

而且(从下面的评论来看)他们现在检查 Google 端点以防止此方法起作用。

此时,您唯一能做的就是设置您自己的 OAuth2 服务器。

原Post:

广义上讲,您需要完成的身份验证任务分为四个部分:

  1. 配置您的项目(在云控制台中)以便启用日历 API 并正确配置 OAuth2 客户端。
  2. 在操作控制台中配置帐户链接操作。
  3. 为您的 API.AI 代理配置 Google 集成操作,以指示需要登录。
  4. 当 API.AI 调用您的 webhook 来实现 Intent 时,它将包含一个身份验证令牌作为 JSON 的一部分。您可以使用此令牌来调用您需要的 Google API。

配置云项目

您需要配置您的云项目,以便它可以访问您需要的 Google API,并设置 OAuth2 客户端 ID、机密和重定向 URI。

  1. 转到 https://console.cloud.google.com/apis/dashboard 并确保您拥有正在使用的项目 selected。然后确保您已启用所需的 APIs。

  2. Select 左侧的 "Credentials" 菜单。你应该看到这样的东西:

  1. Select "Create credentials" 然后 "OAuth client ID"

  2. Select 这是给 "Web application" 的(有点……有点……)

  3. 输入一个名字。在下面的屏幕截图中,我使用了 "Action client" 所以我记得这实际上是针对 Google.

  4. 上的操作
  5. 在 "Authorized Redirect URIs" 部分,您需要包含一个形式为 https://oauth-redirect.googleusercontent.com/r/your-project-id 的 URI,用...您的项目 ID 替换 "your-project-id" 部分云控制台。此时,屏幕应如下所示:

  6. 单击 "Create" 按钮,您将看到一个包含您的客户端 ID 和密码的屏幕。您现在可以获得这些文件的副本,但也可以稍后再获得。

  7. 单击 "Ok",您将返回到添加了新客户端 ID 的 "Credentials" 屏幕。如果您需要再次获取 ID 和机密(或者如果机密已被泄露,则重置机密),您可以单击铅笔图标。

配置操作控制台

为项目设置 OAuth 后,我们需要告诉 Actions 我们将使用它来验证和授权用户。

  1. 转到 https://console.actions.google.com/ 和 select 您将使用的项目。

  2. 在概述中,完成任何必要的配置,直到您可以到达第 4 步,"Account Linking"。这可能需要您设置名称和图标 - 如果需要更正这些,您可以稍后返回。

  1. Select 授予类型 "Authorization Code" 然后单击下一步。

  1. 在“客户端信息”部分,输入您在 Cloud Console 中创建凭据时的客户端 ID 和客户端密码。 (如果您忘记了,请转到 Cloud Console API 凭据部分并单击铅笔。)

  2. 对于授权 URL,输入 https://accounts.google.com/o/oauth2/v2/auth

  3. 对于令牌URL,输入https://www.googleapis.com/oauth2/v4/token

  4. 点击下一步

  1. 您现在为您请求的范围配置您的客户端。与您输入范围的大多数其他地方不同 - 您需要每行一个。然后点击下一步。

  1. 您需要输入测试说明。在您提交您的操作之前,这些说明应包含一个测试帐户和密码,审核团队可以使用它来评估它。但是您可以在测试时将一些东西放在那里,然后点击“保存”按钮。

配置API.AI

在 API.AI 中,您需要指明用户需要登录才能使用该操作。

  1. 转到 https://console.api.ai/ 和 select 您正在处理的项目。

  2. Select "Integrations" 然后 "Actions on Google"。如果你还没有打开它。

  3. 单击 "Sign in required for welcome intent" 复选框。

在您的 webhook 中处理事情

完成所有设置后,在您的 webhook 中处理事情就相当简单了!您可以通过以下两种方式之一获取 OAuth 访问令牌:

  • 如果您正在使用 JavaScript 库,请调用 app.getUser().authToken

  • 如果您正在查看 JSON 正文,它位于 originalRequest.data.user.accessToken

您将使用此访问令牌使用别处定义的方法对 Google 的 API 端点进行调用。

您不需要刷新令牌 - 除非用户已撤消访问权限,否则助理会向您提供有效的访问令牌。

联系Google后,目前的情况似乎是您应该设置自己的 OAuth2 服务器,然后在您的 OAuth2 服务器的登录屏幕上,您应该启动 Google OAuth2 流程。

you have to have your own endpoint with Google Oauth2 - it is correct that you can't use Google Oauth itself as a provider. To use the Google OAuth service, you can use a "sign in with Google" button in your own endpoint instead.

Source: Contacting Google Actions on Google Support

现在有点无语...因为这似乎是 Google 方面的巨大 疏忽。

无论您正在开发什么 Google 助理应用程序,您都需要实施 Oauth 协议。让我更清楚一点:

  1. 用户在小助手上,你需要link他给任何数据 你有你的应用程序端
  2. 对您拥有的数据的访问权限 您的用户受访问令牌保护
  3. Google 然后需要 要求您提供此令牌以访问此资源
  4. 当 google 拥有可以将其发送到应用程序的令牌,因此它会验证每个 请求获取资源。

这就是您需要实现自己的 oauth 服务器的原因(老实说,这只是您应用程序中的另外两个端点):在 google 端检查身份,但 link用户和要访问的资源之间的关系只能由您知道。 上面的过程是有效的,你只需要指定你自己的 token 端点和你自己的 auth 端点。 请注意,如果您只想检查用户是否已登录 google 并获取他的电子邮件,则只需实施不需要 /auth 端点的简化身份流程 (Automatically Sign Up Users with Streamlined Identity Flows)

蜜蜂说我实现了流程但得到了同样的错误: expected_inputs[0].possible_intents[0]: Transactions/Identity API must be enabled before using.

很久以后我就能让它工作了。 我们必须先启用 webhook,我们可以在对话流程实现文档中看到如何启用 webhook 如果我们要使用 Google 助手,那么我们必须先在集成中启用 Google 助手集成。 然后按照下面提到的步骤在 google:-

上的操作中进行帐户链接
  1. 转到 google 云控制台 -> API 和服务 -> 凭据 -> OAuth 2.0 客户端 ID -> Web 客户端 -> 从那里记下客户端 ID、客户端密码 -> 下载 JSON - 来自 json 记下项目 ID,auth_uri,token_uri -> 授权重定向 URIs -> 将我们应用程序的 URL 列入白名单 -> 在这个 URL 固定部分是 https://oauth-redirect.googleusercontent.com/r/ 并在 URL 中附加项目 ID -> 保存更改

  2. 在 Google 上的操作 -> 帐户 link 设置 1.授权类型=授权码 2.客户信息 1. 填写client id,client secrtet, auth_uri, token_uri 2. 输入身份验证 uri 作为 https://www.googleapis.com/auth and token_uri as https://www.googleapis.com/token 3. 保存并 运行 4.在google助手上运行ning会报错,不用担心 5. 返回助手设置中的帐户 linking 部分并输入 auth_uri 为 https://accounts.google.com/o/oauth2/auth token_uri 作为 https://accounts.google.com/o/oauth2/token 6. 将范围设为 https://www.googleapis.com/auth/userinfo.profile and https://www.googleapis.com/auth/userinfo.email 我们很高兴去。 7. 保存更改。

  3. 在托管服务器日志中,我们可以看到访问令牌值,通过访问令牌,我们可以获得有关电子邮件地址的详细信息。

  4. 将访问令牌附加到此 link“https://www.googleapis.com/oauth2/v1/userinfo?access_token=”,我们可以在生成的 json 页面中获得所需的详细信息。
  5. accessToken = req.get("originalRequest").get("data").get("user").get("accessToken")
    r = requests.get(link) print("Email Id= " + r.json()["email"]) print("Name= " + r.json()["name"])