在适用于助理应用程序的Firebase功能中获取Node.js中的Google用户ID

Sim*_*mon 5 node.js google-cloud-platform firebase-authentication actions-on-google dialogflow-es

我正在开始使用Google Cloud Platform.

我正在开发一个Android应用程序,它将收集信息并将其存储在Firebase应用程序中.我们的想法是,Google智能助理功能可以查询此信息并将其读回 - 例如

好的谷歌,与西蒙斯应用交谈,告诉我XYZ最后一次完成

然而,我遇到的问题是让它成为多用户.

我有Android应用程序收集数据并将其放入云端.我在Android应用程序中使用FirebaseUser和使用getUid()获取一个28字符串的唯一ID uVHkia8RRgWD8GGPVvW4AUDUK2.

我在Google上设置了Actions,通过Web Fulfillment将它连接到API.AI,并让Node.js在firebase函数中工作.

不幸的是,UserID我回来看起来更像是:HTge48H0CF2FC5jJQCigFBc-UCQ

问题是这UserIDUserUID我从Filebase User获得的不一样.

我正在使用

let ApiAiApp = require('actions-on-google').ApiAiApp;
const app = new ApiAiApp({request: request, response: response});
Run Code Online (Sandbox Code Playgroud)

const userId = app.getUser().userId;
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我看到对OAuth2,帐户链接等的引用.我不完全确定此时该做什么.我现在需要做的就是得到User UIDFirebaseUser.getUID()想要的内容,以便在Firebase数据库中查看数据.

我认为其余的应该是直截了当的.

有大量关于从智能助理链接到Firebase的文档,但实际身份验证却很少.到目前为止,我还没有设置流程,如授权代码流,隐式流,或者针对API.AI和Fulfillment选项设置用户名/密码.坦白说,我不确定在这一点上需要去哪里.

Pri*_*ner 4

提供的用户app.getUser().userId被设计为持久的匿名标识符。它大致相当于在 Web 服务器中设置的 cookie - 您可以使用它来确定您以前是否见过该用户,以及他们在您的 Action 中还做了什么,但它并不与任何外部帐户。

不幸的是,目前最好的解决方案是使用帐户链接,这需要您设置 OAuth2 服务器。作为此设置的一部分,您将需要创建三个组件:

  1. 为您提供服务的登录网页。您需要将此页面的网址作为帐户链接的一部分提供给 Google。当用户访问您的操作,并且您的操作表明他们需要登录时,他们将被重定向到移动设备上的此 URL。在此页面上,用户将登录 - 登录后,您现在知道他们的 Firebase ID 并将为此用户创建一个授权代码。然后,您将它们重定向回不同的 URL,并将此身份验证代码(以及一些其他信息)作为参数传递。

  2. 令牌交换端点。Google 将使用上面的身份验证代码调用此 URL。您将验证此代码,确定用户是谁,并发回唯一的访问令牌。(您还将发回一个刷新令牌,Google 将使用该令牌以相同的方式获取更新的访问令牌。)

  3. Webhook 中的身份验证令牌处理程序。当 API.AI 调用您的 Webhook 时,它将包含访问令牌作为请求中的字段之一。您可以使用此访问令牌获取用户的 Firebase ID。

对于身份验证代码、访问令牌和刷新令牌,需要注意的一件事是,您需要通过某种方式将这些代码/令牌映射到 Firebase ID。有两种好方法可以做到这一点:

  1. 代码/令牌可以是 JSON Web 令牌 (JWT)。这将获取 Firebase ID 以及您希望保留的有关用户的其他信息,并将其采用标准格式。然后,它创建一个加密签名,以确保它没有被篡改,并以标准格式对其进行编码。当您需要从 JWT 确定 ID 时,您可以对其进行解码、验证签名是否有效并读取值。

  2. 生成一个随机字符串并将其根据 Firebase ID 存储在数据库中。获得令牌后,您可以在数据库中查找分配给该字符串的 ID。

关于 OAuth 实现以及每个步骤还有许多其他详细信息。有关更多详细信息,请参阅https://developers.google.com/actions/identity/oauth2-code-flow 。