Google Home授权码和Google帐户身份验证

Tim*_*man 5 google-authentication oauth-2.0 actions-on-google

我目前正在尝试使用Google Home Action对Google帐户进行身份验证,并从凭据中检索授权码.我想要访问令牌,而是授权代码.

我查看过此帖并发现Google已更新其政策,不再允许将自己的OAuth端点用于链接授权代码流的帐户:

使用OAuth实施帐户关联时,您必须拥有OAuth端点

话虽如此,

  1. 使用我的操作和必要的范围对现有Google用户进行身份验证的正确方法是什么?(我需要日历访问)
  2. 是否可以在不创建自己的OAuth2.0端点的情况下进行此身份验证?
  3. 从这个流程中,是否可以提取授权代码

Pri*_*ner 15

目前通过Google帐户对用户进行身份验证的方法是使用Google Sign-In for Assistant.一旦他们登录您的操作,您将获得一个ID令牌,您可以对其进行解码以获取其Google ID,您可以使用该ID在数据存储区中查找其帐户以获取其访问/刷新令牌.

由于需要更多的范围,如果在助理的用户登录,并还没有连接到他们的帐户的范围,你会重定向到一个基于网络的登录页面,他们可以登录使用谷歌登录功能与你需要的范围.在这种情况下,当他们通过Web登录并授权访问时,您将获得auth代码,您需要交换auth代码并刷新令牌并存储这些代码.

您无需为此创建自己的OAuth端点,但您需要做一些额外的工作,以确保在必要时将其重定向到您的网站以进行授权.

您只有在登录并授权您时才会获得一次身份验证代码.您需要将此交换为auth并刷新令牌,然后存储这些令牌.

更新以更好地解释事情.

看看架构,我们看到它有一些组件.在我们完成流程时,我们将详细介绍每个细节:

在此输入图像描述

  • 您有某种数据存储,您将为用户存储Auth Token和Refresh Token.我将假设您使用Google的用户ID作为此数据存储的索引.

    • 在这种情况下,"Google用户ID"是指Google为每个帐户分配的唯一数字标识符.这通常表示为字符串,尽管只有数字,因为它通常比大多数数字类型长得多.在ID令牌中,这是"子"声明.

    • 理论上,您可以使用ID令牌中的声明中提供的其他标识符,例如其电子邮件地址.遗憾的是,并非所有这些字段都可用 - 只保证"sub".

  • 您有一个Web服务器,它有一些重要的URL用于我们的目的:

    • 您的行动实现的webhook.
    • 登录/验证页面.
    • 登录页面上的javascript将向您发送验证码的端点.
  • Google智能助理,可能在Google Home或移动设备上运行.我们还假设用户将能够访问浏览器以查看他们授权的内容.

  • 您将使用的Google服务,包括Google的OAuth服务

让我们从用户之前登录并授权我们代表他们访问服务的情况开始.我们在数据存储中拥有Auth Token和Refresh Token,并根据其Google用户ID编制索引.这是一个简单的案例,但它有助于我们理解所有数据如何进入的更复杂的情况.

数据流看起来像这样:

在此输入图像描述

  1. 助手向Action webhook发送一个Intent和可能的参数.如果这是第一条消息,这是一个受欢迎的意图,但没关系.它包括一个身份令牌,我们需要解码和验证.作为我们解码时获得的数据的一部分,它包含用户的用户ID.
  2. 使用用户ID ...
  3. ...我们从数据存储中获取Auth Token和Refresh Token.
  4. 通过Auth Token和Refresh Token,我们可以代表用户对Google的服务执行一些操作.
  5. 我们会从服务中得到一些结果......
  6. ...我们通常希望以某种形式传回给用户.

容易,对吗?但是,如果用户之前从未使用过助手与我们的行动交谈怎么办?并且从未授权我们访问他们的Google服务,因此我们没有他们的令牌?那个流看起来更像是这样的:

在此输入图像描述

  1. 助手向Action webhook发送Intent和可能的参数.这将是第一条消息,因此触发了我们的欢迎意图.没有身份令牌.
  2. webhook看到没有身份令牌,因此它发送回请求"登录"帮助程序功能的消息.由于您的项目已配置为使用Google登录,因此助理会提示用户是否可以向您提供其个人资料信息.
  3. 如果他们说是,你会得到另一个回复,说他们已经登录并包括身份令牌,我们会解密并验证并获取他们的用户ID.(如果他们拒绝,我们会得到一个回复​​说它失败了.你如何处理这个是另一个故事.我会假设他们说是的.)
  4. 使用用户ID ...
  5. ...我们尝试从数据存储中获取Auth Token和Refresh Token.但是他们还没有授权我们.我们已经对它们进行了身份验证,但没有授权 ......
  6. ...所以我们发回一条消息说他们需要访问我们的网站以授权我们访问他们的Google服务.我们可能要求他们切换到移动设备来执行此部分,甚至包括指向登录页面的链接.
  7. 他们将关注具有屏幕的设备上的链接.
  8. 我们将发回登录页面,其中包含指向Google登录的链接.我们已将此按钮配置为还要求我们访问其服务所需的其他范围,以及在"离线"时代表他们访问服务的权限.
  9. 他们将浏览Google Login舞蹈,OAuth范围屏幕,并希望授予我们想要的所有权限.(同样,如果不这样做,我会忽略会发生什么.)我省略了那种舞蹈的样子,因为它不涉及我们.假设一切顺利,Google会给他们一个Auth Code,登录页面上的javascript会发送给我们.
  10. 我们称Google的OAuth服务器验证Auth代码并使用它来获取Auth Token和Refresh Token ...
  11. ...然后我们存储在数据存储中......
  12. ...然后发回一些内容,以便Javascript页面可以告诉用户他们可以从现在起正常使用我们的Action.

他们现在可以做什么,并且它的行为与早期的简单场景一样.

这看起来很复杂,但事实证明我们可以在某些情况下删除一些步骤.如果谷歌云计算项目是您使用为您的行动,以及基于网络的谷歌登录功能,那么一旦他们授权在网络上的项目相同的项目,你完成所有通话将包括身份标记.这让我们删除了上面的步骤2-6,所以看起来更像是这样:

在此输入图像描述

  1. 助手向Action webhook发送Intent和可能的参数.这将是第一条消息,因此触发了我们的欢迎意图.没有身份令牌.
  2. webhook看到没有身份令牌,因此我们发回一条消息,说他们需要访问我们的网站以授权我们访问他们的Google服务.我们可能要求他们切换到移动设备来执行此部分,甚至包括指向登录页面的链接.(这是从上面折叠的第2步和第6步.)
  3. 他们将关注具有屏幕的设备上的链接.
  4. 我们将发回登录页面,其中包含指向Google登录的链接.我们已将此按钮配置为还要求我们访问其服务所需的其他范围,以及在"离线"时代表他们访问服务的权限.
  5. 他们将浏览Google Login舞蹈,OAuth范围屏幕,并希望授予我们想要的所有权限.(同样,如果不这样做,我会忽略会发生什么.)我省略了那种舞蹈的样子,因为它不涉及我们.假设一切顺利,Google会给他们一个Auth Code,登录页面上的javascript会发送给我们.
  6. 我们称Google的OAuth服务器验证Auth代码并使用它来获取Auth Token和Refresh Token ...
  7. ...然后我们存储在数据存储中......
  8. ...然后发回一些内容,以便Javascript页面可以告诉用户他们可以从现在起正常使用我们的Action.

值得注意的是,如果他们在尝试使用助手版本之前访问网站(即 - 因为搜索结果或他们从第二个图表中的第8步开始或从第三个图表中的4个开始)并登录,那么我们将在他们一次通过智能助理访问我们时获得他们的身份令牌,这将像简单的场景一样工作.