使用 Google 操作对 API.AI 上的 Google 日历进行身份验证

Authenticate Google Calendar on API.AI with Google Actions

我正在编写一个带有 Google 操作的 API.AI 应用程序(将 运行 用于 google 助手和 google 家)。该应用程序应该能够 read\add 事件到用户的 google 日历帐户。

后端是 Google Cloud Functions,我在开发人员控制台中启用了日历 API。

用户应该体验的流程是这样的:

User: "Hey Google, when was my last meeting with Anna?"

Agent: "Your last meeting with Anna was two days ago"

User: "Set a meeting with Anna for the tomorrow"

Agent: "Ok. Meeting is set"

我应该如何构建身份验证过程以授予应用访问日历的权限?

如果您使用 Google 登录作为您的登录提供商,您可以在 OAuth 流程中请求访问日历范围。

public policy 状态:

"Don't request any OAuth scope from Google unless the user is signing in to your service using Google Sign-In."

更新,2017 年 11 月 8 日

大约在 2017 年 10 月 4 日,Google 更新了他们的政策以明确禁止这样做。大约在同一时间,他们也采取了技术措施来防止这种情况。

关于启用日历的部分 API 仍然是正确的,尽管不足以完成原始问题的要求。

原答案

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

  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。 (在这种情况下,日历 API)

  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,将 "your-project-id" 部分替换为...您的项目 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 端点进行调用。

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