我目前正在尝试使用Google Home Action对Google帐户进行身份验证,并从凭据中检索授权代码。我不要访问令牌,但授权码。
我查看了this post,发现Google更新了其策略,并且不再允许将其自己的OAuth端点用于帐户链接授权代码流:
使用OAuth实施帐户关联时,您必须拥有自己的OAuth端点
话虽这么说
答案 0 :(得分:12)
当前通过其Google帐户验证用户身份的方法是使用Google Sign-In for Assistant。他们登录到您的操作后,您将获得一个ID令牌,您可以对其进行解码以获取其Google ID,您可以使用该ID来在数据存储区中查找其帐户以获取其访问/刷新令牌。
由于您需要其他范围,如果用户登录到Assistant且尚未将范围附加到其帐户,则可以将其重定向到基于Web的登录页面,以便他们可以使用Google Sign-在您需要的范围内。在这种情况下,当他们登录并授权通过Web的访问权限时,您将获得身份验证代码,您需要该身份验证代码来交换身份验证令牌并刷新令牌并存储它们。
您无需为此创建自己的OAuth端点,尽管您需要做一些额外的工作来确保将它们重定向到您的网站以在必要时进行授权。
只有他们登录并授权您时,您才会获得身份验证码一次。您需要将其交换为auth和refresh令牌,然后存储这些令牌。
更新以更好地说明事情。
看看该体系结构,我们看到它包含一些组件。在处理流程中,我们将详细介绍其中的每个细节:
您有某种类型的数据存储,您将在其中存储用户的Auth令牌和Refresh令牌。我假设您使用Google的用户ID作为该数据存储区的索引。
在这种情况下,“ Google用户ID”是指Google分配给每个帐户的唯一数字标识符。尽管它只有数字,但通常用字符串表示,因为它通常比大多数数字类型长得多。在ID令牌中,这是“子”声明。
理论上,您可以使用ID令牌中的声明中可用的其他标识符,例如其电子邮件地址。不幸的是,并非所有这些字段都保证可用-只能保证“ sub”。
您有一台Web服务器,其中有一些重要的URL用于我们的目的:
Google助手,该助手可能在Google Home或移动设备上运行。我们还假定用户将能够访问浏览器来查看他们正在授权的内容。
您将使用的Google服务,包括Google的OAuth服务
让我们从用户先前登录并授权我们代表他们访问服务的情况开始。我们在数据存储区中拥有他们的Auth令牌和Refresh令牌,并根据其Google用户ID进行了索引。这是简单的情况,但可以帮助我们了解所有数据如何进入其中的更复杂的情况。
数据流看起来像这样:
容易,对吧?但是,如果用户之前从未使用过助手与我们的操作进行交谈该怎么办?而且从未授权我们访问他们的Google服务,所以我们没有他们的令牌吗?该流程看起来像这样:
他们现在可以做到,并且其行为与早期简单场景中的行为相同。
这看起来很复杂,但事实证明,在某些情况下我们可以删除一些步骤。如果Google Cloud Project与您的操作以及基于网络的Google登录所使用的项目都是同一项目,则一旦他们在网络上授权了该项目,则所有实现您的通话都将包含身份令牌。这使我们可以删除上面的步骤2-6,因此事情看起来像这样:
还值得注意的是,如果他们在尝试使用Assistant版本之前就已经访问了网站(即-由于搜索结果,或者他们从第二个图表的第8步或从第三个图表的第4步开始),然后登录,那么当他们通过助手访问我们时,我们将在第一次时获得他们的身份令牌,这就像简单的场景一样。