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

时间:2018-06-19 15:04:32

标签: oauth-2.0 actions-on-google google-authentication

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

我查看了this post,发现Google更新了其策略,并且不再允许将其自己的OAuth端点用于帐户链接授权代码流:

  

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

话虽这么说

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

1 个答案:

答案 0 :(得分:12)

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

由于您需要其他范围,如果用户登录到Assistant且尚未将范围附加到其帐户,则可以将其重定向到基于Web的登录页面,以便他们可以使用Google Sign-在您需要的范围内。在这种情况下,当他们登录并授权通过Web的访问权限时,您将获得身份验证代码,您需要该身份验证代码来交换身份验证令牌并刷新令牌并存储它们。

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

只有他们登录并授权您时,您才会获得身份验证码一次。您需要将其交换为auth和refresh令牌,然后存储这些令牌。

更新以更好地说明事情。

看看该体系结构,我们看到它包含一些组件。在处理流程中,我们将详细介绍其中的每个细节:

enter image description here

  • 您有某种类型的数据存储,您将在其中存储用户的Auth令牌和Refresh令牌。我假设您使用Google的用户ID作为该数据存储区的索引。

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

    • 理论上,您可以使用ID令牌中的声明中可用的其他标识符,例如其电子邮件地址。不幸的是,并非所有这些字段都保证可用-只能保证“ sub”。

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

    • 实现操作的网络钩子。
    • 登录/身份验证页面。
    • 登录页面上的javascript将向您发送身份验证代码的端点。
  • Google助手,该助手可能在Google Home或移动设备上运行。我们还假定用户将能够访问浏览器来查看他们正在授权的内容。

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

让我们从用户先前登录并授权我们代表他们访问服务的情况开始。我们在数据存储区中拥有他们的Auth令牌和Refresh令牌,并根据其Google用户ID进行了索引。这是简单的情况,但可以帮助我们了解所有数据如何进入其中的更复杂的情况。

数据流看起来像这样:

enter image description here

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

容易,对吧?但是,如果用户之前从未使用过助手与我们的操作进行交谈该怎么办?而且从未授权我们访问他们的Google服务,所以我们没有他们的令牌吗?该流程看起来像这样:

enter image description here

  1. 助手向动作Webhook发送一个Intent和可能的参数。这将是第一个消息,因此我们的欢迎意向被触发。没有身份令牌。
  2. webhook看到没有身份令牌,因此它发回一条消息,请求“登录”帮助程序功能。由于您的项目已配置为使用Google登录,因此助手会提示用户是否可以向您提供其个人资料信息。
  3. 如果他们回答“是”,您将收到另一个答复,称他们已经登录并包括身份令牌,我们将对其进行解码和验证并获取其用户ID。 (如果他们回答“否”,我们将收到答复,说它失败了。您如何处理这是另一回事。我将假设他们回答“是”。)
  4. 使用用户ID ...
  5. ...我们尝试从数据存储中获取身份验证令牌和刷新令牌。但是他们还没有授权我们。我们已经对其进行了认证,但是没有授权 ...
  6. ...因此我们发回一条消息,说他们需要访问我们的网站才能授权我们访问其Google服务。我们可能会要求他们切换到移动设备来执行此部分,甚至包括指向登录页面的链接。
  7. 他们将在带有屏幕的设备上点击链接。
  8. 我们将发回登录页面,其中包括指向“使用Google登录”的链接。我们已经配置了此按钮,以询问我们访问其服务所需的其他范围,以及在“离线”时代表他们访问服务的权限。
  9. 他们将经历Google登录舞步,OAuth范围屏幕,并有望授予我们所需的所有权限。 (同样,如果他们不这样做,我会忽略发生的事情。)由于与我们无关,我忽略了这种舞蹈的样子。假设一切顺利,Google会为他们提供一个Auth代码,登录页面上的javascript发送给我们。
  10. 我们致电Google的OAuth服务器以验证身份验证代码,并使用它来获取身份验证令牌和刷新令牌…
  11. ...然后将其存储在数据存储中...
  12. …然后发回一些东西,以便Javascript页面可以告诉用户他们从现在开始可以正常使用我们的Action。

他们现在可以做到,并且其行为与早期简单场景中的行为相同。

这看起来很复杂,但事实证明,在某些情况下我们可以删除一些步骤。如果Google Cloud Project与您的操作以及基于网络的Google登录所使用的项目都是同一项目,则一旦他们在网络上授权了该项目,则所有实现您的通话都将包含身份令牌。这使我们可以删除上面的步骤2-6,因此事情看起来像这样:

enter image description here

  1. 助手向动作Webhook发送一个Intent和可能的参数。这将是第一个消息,因此我们的欢迎意向被触发。没有身份令牌。
  2. webhook发现没有身份令牌,因此我们发回一条消息,说他们需要访问我们的网站以授权我们访问其Google服务。我们可能会要求他们切换到移动设备来执行此部分,甚至包括指向登录页面的链接。 (这是从上方折叠的步骤2和6。)
  3. 他们将在带有屏幕的设备上点击链接。
  4. 我们将发回登录页面,其中包括指向“使用Google登录”的链接。我们已经配置了此按钮,以询问我们访问其服务所需的其他范围,以及在“离线”时代表他们访问服务的权限。
  5. 他们将经历Google登录舞步,OAuth范围屏幕,并有望授予我们所需的所有权限。 (同样,如果他们不这样做,我会忽略发生的事情。)由于与我们无关,我忽略了这种舞蹈的样子。假设一切顺利,Google会为他们提供一个Auth代码,登录页面上的javascript发送给我们。
  6. 我们致电Google的OAuth服务器以验证身份验证代码,并使用它来获取身份验证令牌和刷新令牌…
  7. ...然后将其存储在数据存储中...
  8. …然后发回一些东西,以便Javascript页面可以告诉用户他们从现在开始可以正常使用我们的Action。

还值得注意的是,如果他们在尝试使用Assistant版本之前就已经访问了网站(即-由于搜索结果,或者他们从第二个图表的第8步或从第三个图表的第4步开始),然后登录,那么当他们通过助手访问我们时,我们将在第一次时获得他们的身份令牌,这就像简单的场景一样。