Google 使用 Polymer 和 Firebase 进行身份验证的操作

Actions on Google Authentication with Polymer and Firebase

我编写了一个托管在 Firebase 中的简单 Web 应用程序,并使用 Firebase Functions(用于 API 层)和 Firebase Authentication 来管理和验证用户。 Web 客户端层是使用包括 Polymerfire 在内的 Polymer 编写的,用于处理用户身份验证。我只接受 Google 用户 ID。

下图给出了更多细节。

Web 客户端流程:

  1. 用户通过 <firebase-auth> 标签与 Firebase 身份验证 组件一起使用进行身份验证
  2. 进行 REST 调用以创建或更新从用户对象
  3. 传递 idToken 的记录
  4. API 函数验证来自 Firebase Authentication
  5. idToken
  6. 数据库中的数据已更新

我已经阅读了所有文档和许多 SO 帖子(包括 Linking Google Assistant with Firebase Auth 关于为 AoG/Dialogflow 实施帐户链接的内容,但我感到非常困惑。我发现 material假定我没有而且我似乎无法获得的知识水平:-)

我想使用:

  1. 隐式流
  2. 简化身份流程
  3. V1 Webhook协议(因为有getUser功能;V2没有)

任何人都可以指导我找到可以提供明确说明以实现此目的的文档、教程或示例应用程序吗?

问题是关于如何做到这一点的明确教程很少,因为每个授权情况都不同。它在您的情况下变得复杂,因为您并不是真正在寻找授权 - 您正在寻找身份验证。但是 Google 和助手需要将此视为授权。具体来说 - 他们想确保 Google 主页的用户有权访问您的服务。

此过程在 Google 的文档中称为帐户链接。您正在将 Google 助理用户链接到您的用户帐户系统。

为此,他们将使用 OAuth...但与您当前使用它的方式相反。在您当前的模型中,您的 Web 客户端使用 OAuth(通过 Google 登录)通过 Google 的服务器获得授权。但是对于智能助理 - 智能助理是客户端,它需要通过你的服务器获得授权。

这是对你的图表的更新,它试图说明这一点,尽管这被简化了一点。 Google's documentation 给出了分步实施要求,但它不能提供任何细节或代码,因为这些取决于您的需要。数字指的是每个步骤,我在下面讲。

  1. 您的用户触发了您的操作或操作中的一个步骤,需要授权。所有请求都经过 Google 的服务器(在到达 Dialogflow 之前),并且它知道是否需要提供该授权信息。

    如果已经有授权,我们可以跳到第6步

  2. 如果它还没有授权,它将在您配置的授权页面上联系您的 OAuth 服务器。它通过指示您的用户打开 Home 应用程序来执行此操作,这会将用户重定向到该授权页面。跳到第 3 步。

    如果它有授权,但该授权已过期,它将在令牌交换点联系您的 OAuth 服务器,以将刷新令牌交换为授权令牌。跳到第 4 步。

  3. 用户可能需要登录并且您的服务器需要对他们进行身份验证(一堆箭头反映了您的网络应用程序正在执行的操作,所以我省略了它们)。通常,您还将明确确保用户授权 Google 助手访问他们在您的服务中的资源。 (Google 始终显示 OAuth 屏幕,以便第三方访问您存储在 Google 上的资源。您可能已经看过它们。)您的授权服务器需要发回一个限制使用的代码,该代码我们将很快交换刷新令牌和授权令牌。

  4. 您的身份验证服务器现在获得刷新令牌或访问代码(取决于步骤 2 和 3 中发生的情况)。然后你的服务器需要接受它,验证它是否有效,然后生成一个授权令牌(如果这是第一次,还生成一个刷新令牌。)当你验证它时,你可能会查询你的用户数据库,可能是为了存储令牌,但肯定是为了确保用户仍然是用户。

  5. 然后您将 return 授权令牌(可能还有刷新令牌)发送到 Google 的服务器。他们将存储这些令牌 - 无限期地刷新令牌,以及令牌生命周期内的授权令牌。

  6. 对于每个请求,Google 会将身份验证令牌传递给 Dialogflow...

  7. ...它将在 JSON 正文中传递给 webhook。

  8. 您的 webhook 然后需要从 JSON 正文(或使用 app.getUser())中获取此身份验证令牌并将其转换为您需要的 ID。一种方法是在您的身份验证服务器中使用 API 来获取身份验证令牌和 return 的 ID。或者,如果您使用的是共享用户数据库,则可以直接在数据库中查找它。或者 auth 令牌可能是已签名的 JWT,一旦您验证签名来自您的 auth 服务器,您就可以使用 JWT 中包含的 ID。

    然后您可以按照概述进行操作。

出于以下几个原因,我为此使用了授权代码流:

  1. 比隐式流更安全。

  2. 实施起来并不复杂。

  3. 如果您想执行“简化”/“流线型”身份流程,则需要使它变得更复杂的东西(代码交换端点),它允许用户注册您的服务,如果他们还没有这样做的话。

我不讨论使简化流程工作的额外要求。首先完成上述工作,然后 follow the directions 添加简化的帐户创建,这主要涉及阶段 2、4 和 5 的额外工作。