在助手应用程序的Firebase函数中获取Node.js中的Google用户标识
我正在开始使用Google云端平台。
我正在开发一个Android应用程序,收集信息并将其存储在Firebase应用程序中。 这个想法是,谷歌助理function可以查询这些信息并将其读回,例如
OK Google,和Simons App交谈,告诉我上次XYZ完成的时间
但是,我得到的问题是让这个多用户。
我有Android应用程序收集数据并将其放入云中。 我正在使用FirebaseUser
并在Android应用程序中使用getUid()
来获取唯一的id,它是一个28个字符的string,如uVHkia8RRgWD8GGPVvW4AUDUK2
。
我已经在Google上设置了Actions,通过Web Fulfillment将它吸引到API.AI中,并获得了Node.js在Firebase函数中的工作。
不幸的是,我回来的UserID
看起来更像: HTge48H0CF2FC5jJQCigFBc-UCQ
问题是这个UserID
和我从Filebase User得到的UserUID
不一样。
我在用着
let ApiAiApp = require('actions-on-google').ApiAiApp; const app = new ApiAiApp({request: request, response: response});
和
const userId = app.getUser().userId;
我错过了什么? 我看到OAuth2,帐户链接等参考。我不完全确定在这一点上做什么。 我现在需要做的就是从FirebaseUser.getUID()
获取User UID
,以便在Firebase数据库中查看数据。
我认为其余的应该是直截了当的。
从助理链接到Firebase有大量的文档,但在实际身份validation方面很less。 到目前为止,我还没有设置stream程,如授权码stream程,隐式stream程,或者根据API.AI和Fulfillment选项设置用户名/密码。 坦率地说,林不知道什么需要去哪里在这一点上。
由app.getUser().userId
提供的用户被devise为持久匿名标识符 。 它大致相当于一个在Web服务器中设置的cookie–您可以使用它来确定您之前是否看过这个用户,以及他们在您的Action中做了什么,但是它并没有inheritance地与任何外部帐户。
不幸的是,您现在最好的解决scheme是使用账户链接 ,这需要您设置一个OAuth2服务器。 作为此设置的一部分,您将需要创build三个组件:
-
您的服务的login网页。 您会将此页面的url作为帐户关联的一部分提供给Google。 当用户访问您的操作,并且您的操作表明他们需要login时,他们将被redirect到他们的移动设备上的此URL。 在此页面上,用户将login – login后,您现在知道他们的Firebase ID,并将为该用户创build一个授权码 。 然后,您将redirect到不同的URL,并将此身份validation代码(以及其他一些信息)作为parameter passing。
-
令牌交换端点。 Google会使用上面的authentication码调用这个URL。 您将validation此代码,确定用户是谁,并发送一个唯一的访问令牌 。 (您还将发送一个刷新令牌 ,Google将以相同方式使用刷新令牌来获取更新的访问令牌。)
-
webhook中的身份validation令牌处理程序。 当API.AI调用您的webhook时,它将把访问令牌作为请求中的一个字段。 您可以使用此访问令牌来获取用户的Firebase ID。
需要注意的是,authentication代码,访问令牌和刷新令牌需要有一些方法来将这些代码/标记映射到Firebase标识。 有两个好方法可以做到这一点:
-
代码/标记可以是JSON Web令牌(JWT)。 这需要Firebase ID以及您希望保留的有关用户的其他信息,并将其放入标准格式。 然后创build一个encryption签名,以确保它没有被篡改,并以标准格式进行编码。 当您需要从JWT中确定ID时,可以对其进行解码,validation签名是否有效,然后读取该值。
-
生成一个随机string,并将其存储在您的数据库中的Firebase ID。 当你得到令牌时,你可以在你的数据库中查找这个string被分配给的ID。
有许多关于OAuth实施的详细信息,以及这些步骤中的每一个。 有关更多详细信息,请参阅https://developers.google.com/actions/identity/oauth2-code-flow 。