node.js - 在 Firebase 的 Node.js 中获取谷歌用户 ID 用于助手应用程序

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

我正在开始使用 Google Cloud Platform。

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

OK Google, Talk To Simons App, Tell me the last time XYZ was done

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

我已经让 Android 应用程序收集数据并将其放入云端。我正在使用 FirebaseUser 并在 Android 应用程序中使用 getUid() 来获取一个唯一 ID,它是一个 28 个字符的字符串,例如 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、帐户链接等的引用。我不完全确定此时该做什么。我现在需要做的就是获取 User UID,就像我从 FirebaseUser.getUID() 中获取的那样,以便在 Firebase 数据库中查找数据。

我认为剩下的应该是直截了当的。

关于从 Google 助理链接到 Firebase 的文档很多,但关于实际身份验证的文档却很少。到目前为止,我还没有设置流程,例如授权代码流程、隐式流程,或者针对 API.AI 和 Fulfillment 选项设置用户名/密码。坦率地说,我不确定此时需要去哪里。

最佳答案

app.getUser().userId 提供的用户被设计为 persistent anonymous identifier .它大致相当于在网络服务器中设置的 cookie - 您可以使用它来确定您之前是否见过该用户,以及他们在您的 Action 中还做了什么,但它并不固有地与任何相关外部帐户。

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

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

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

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

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

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

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

还有许多关于 OAuth 实现和其中每个步骤的其他详细信息。参见 https://developers.google.com/actions/identity/oauth2-code-flow了解更多详情。

关于node.js - 在 Firebase 的 Node.js 中获取谷歌用户 ID 用于助手应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46005716/

相关文章:

google-cloud-platform - 是否可以像在终端中使用 `ls` 命令一样查询 Google Cloud Storage?

JavaScript 在索引处插入数组

javascript - 如何将链接 promise 与数组的循环一起使用?

javascript - express.js 和 mysql 身份验证

swift - "Value of type ' AuthDataResult ' has no member ' uid '"错误

Flutter Firebase 身份验证 : delay on startup

go - 无法连接到代理 "Certificate signed by unknown authority"

javascript - 在 Google Cloud Functions 中使用 process.exit

node.js - 使用 Nodemailer 从本地主机发送电子邮件

Firebase 验证同一用户的多个电子邮件地址