获取助理应用程序的Firebase函数中的Node.js中的Google用户ID

时间:2017-09-01 18:00:07

标签: node.js firebase-authentication google-cloud-platform dialogflow actions-on-google

我开始使用Google Cloud Platform。

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

  

确定Google,与Simons App对话,告诉我XYZ最后一次完成

然而,我遇到的问题是让这个人成为多用户。

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

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

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

问题是此UserID与我从Filebase用户获得的UserUID不同。

我正在使用

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

const userId = app.getUser().userId;

我错过了什么?我看到对OAuth2,帐户链接等的引用。我不完全确定此时该做什么。我现在需要做的就是获取User UID,就像我从FirebaseUser.getUID()获取一样,以便在Firebase数据库中查看数据。

我认为其余部分应该是直截了当的。

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

1 个答案:

答案 0 :(得分:3)

app.getUser().userId提供的用户被设计为persistent anonymous identifier。它大致相当于在Web服务器中设置的cookie - 您可以使用它来确定您之前是否已经看过此用户,以及他们在您的Action中做了什么,但它没有与任何外部账户有关。

不幸的是,此时您遇到的最佳解决方案是使用Account Linking,这需要您设置OAuth2服务器。作为此设置的一部分,您需要创建三个组件:

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

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

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

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

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

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

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