我开始使用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选项设置用户名/密码。坦白说,我不确定在这一点上需要做些什么。
答案 0 :(得分:3)
app.getUser().userId
提供的用户被设计为persistent anonymous identifier。它大致相当于在Web服务器中设置的cookie - 您可以使用它来确定您之前是否已经看过此用户,以及他们在您的Action中做了什么,但它没有与任何外部账户有关。
不幸的是,此时您遇到的最佳解决方案是使用Account Linking,这需要您设置OAuth2服务器。作为此设置的一部分,您需要创建三个组件:
您服务的登录网页。您将此页面的网址作为帐户关联的一部分提供给Google。当用户访问您的操作,并且您的操作表明他们需要登录时,他们会在其移动设备上重定向到此网址。在此页面上,用户将登录 - 一旦登录,您现在就知道他们的Firebase ID,并将为该用户创建身份验证代码。然后,您将它们重定向回不同的URL,并将此身份验证代码(以及其他一些信息)作为参数传递。
令牌交换端点。 Google会使用上面的验证码调用此网址。您将验证此代码,确定用户是谁,并发回一个唯一的访问令牌。 (您还将发回一个刷新令牌,Google将以相同的方式使用它来获取更新的访问令牌。)
您的webhook中的身份验证令牌处理程序。当API.AI调用您的webhook时,它将包含访问令牌作为请求中的一个字段。您可以使用此访问令牌获取用户的Firebase ID。
对于验证码,访问令牌和刷新令牌,需要注意的一点是,您需要通过某种方式将这些代码/令牌映射到Firebase ID。有两种好方法可以做到这一点:
代码/令牌可以是JSON Web令牌(JWT)。这会获取Firebase ID以及您希望保留的有关用户的其他信息,并将其置于标准格式中。然后,它会创建加密签名,以确保它没有被篡改,并以标准格式对其进行编码。当您需要从JWT确定ID时,您可以解码它,验证签名是否有效,并读取值。
生成一个随机字符串,并将其存储在您的数据库中,以抵御Firebase ID。获得令牌后,您可以在数据库中查找该字符串所分配的ID。
有关OAuth实施的许多其他详细信息以及每个步骤。有关详细信息,请参阅https://developers.google.com/actions/identity/oauth2-code-flow。