获取 Google 用户 ID 在 Node.js 中的 Firebase 助手应用函数
Getting Google User ID in Node.js in Firebase Functions for Assistant App
我开始使用 Google Cloud Platform。
我正在开发一个 Android 应用程序,它将收集信息并将其存储在 Firebase 应用程序中。这个想法是 Google 辅助功能可以查询此信息并将其读回 - 例如
OK Google, Talk To Simons App, Tell me the last time XYZ was done
然而,我遇到的问题是让它成为多用户。
我有 Android 应用程序收集数据并将其放入云端。我在 FirebaseUser
中使用 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 选项设置 username/password。坦率地说,我不确定此时需要去哪里。
app.getUser().userId
提供的用户设计为persistent anonymous identifier。它大致相当于在网络服务器中设置的 cookie - 您可以使用它来确定您之前是否见过该用户,以及他们在您的 Action 中还做了什么,但它并不固有地与任何相关外部帐户。
不幸的是,此时您拥有的最佳解决方案是使用 Account Linking,这需要您设置 OAuth2 服务器。作为此设置的一部分,您需要创建三个组件:
您的服务的登录网页。作为帐户链接的一部分,您需要将此页面的 URL 提供给 Google。当用户访问您的操作,并且您的操作指示他们需要登录时,他们将被重定向到移动设备上的此 URL。在此页面上,用户将登录 - 登录后,您现在知道他们的 Firebase ID,并将为此用户创建一个 授权代码 。然后,您会将它们重定向回另一个 URL 并将此授权码(连同其他一些信息)作为参数传递。
令牌交换端点。 Google 将使用上面的授权代码调用此 URL。您将验证此代码,确定用户是谁,然后发回一个唯一的 访问令牌 。 (您还将发回 刷新令牌,Google 将以相同的方式使用它来获取更新的访问令牌。)
您的 webhook 中的身份验证令牌处理程序。当 API.AI 调用您的 webhook 时,它将包含访问令牌作为请求中的字段之一。您可以使用此访问令牌获取用户的 Firebase ID。
关于授权代码、访问令牌和刷新令牌需要注意的一件事是,您需要通过某种方式将这些 codes/tokens 映射到 Firebase ID。有两种好方法可以做到这一点:
code/token 可以是 JSON Web 令牌 (JWT)。这会获取 Firebase ID 以及您希望保留的有关用户的其他信息,并将其置于标准格式中。然后它创建一个加密签名,以确保它没有被篡改,并以标准格式对其进行编码。当需要从JWT判断ID时,可以解码,验证签名是否有效,读取值。
生成一个随机字符串并将其根据 Firebase ID 存储在您的数据库中。获得令牌后,您可以在数据库中查找分配给该字符串的 ID。
关于 OAuth 实施和其中每个步骤还有许多其他详细信息。有关详细信息,请参阅 https://developers.google.com/actions/identity/oauth2-code-flow。
我开始使用 Google Cloud Platform。
我正在开发一个 Android 应用程序,它将收集信息并将其存储在 Firebase 应用程序中。这个想法是 Google 辅助功能可以查询此信息并将其读回 - 例如
OK Google, Talk To Simons App, Tell me the last time XYZ was done
然而,我遇到的问题是让它成为多用户。
我有 Android 应用程序收集数据并将其放入云端。我在 FirebaseUser
中使用 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 选项设置 username/password。坦率地说,我不确定此时需要去哪里。
app.getUser().userId
提供的用户设计为persistent anonymous identifier。它大致相当于在网络服务器中设置的 cookie - 您可以使用它来确定您之前是否见过该用户,以及他们在您的 Action 中还做了什么,但它并不固有地与任何相关外部帐户。
不幸的是,此时您拥有的最佳解决方案是使用 Account Linking,这需要您设置 OAuth2 服务器。作为此设置的一部分,您需要创建三个组件:
您的服务的登录网页。作为帐户链接的一部分,您需要将此页面的 URL 提供给 Google。当用户访问您的操作,并且您的操作指示他们需要登录时,他们将被重定向到移动设备上的此 URL。在此页面上,用户将登录 - 登录后,您现在知道他们的 Firebase ID,并将为此用户创建一个 授权代码 。然后,您会将它们重定向回另一个 URL 并将此授权码(连同其他一些信息)作为参数传递。
令牌交换端点。 Google 将使用上面的授权代码调用此 URL。您将验证此代码,确定用户是谁,然后发回一个唯一的 访问令牌 。 (您还将发回 刷新令牌,Google 将以相同的方式使用它来获取更新的访问令牌。)
您的 webhook 中的身份验证令牌处理程序。当 API.AI 调用您的 webhook 时,它将包含访问令牌作为请求中的字段之一。您可以使用此访问令牌获取用户的 Firebase ID。
关于授权代码、访问令牌和刷新令牌需要注意的一件事是,您需要通过某种方式将这些 codes/tokens 映射到 Firebase ID。有两种好方法可以做到这一点:
code/token 可以是 JSON Web 令牌 (JWT)。这会获取 Firebase ID 以及您希望保留的有关用户的其他信息,并将其置于标准格式中。然后它创建一个加密签名,以确保它没有被篡改,并以标准格式对其进行编码。当需要从JWT判断ID时,可以解码,验证签名是否有效,读取值。
生成一个随机字符串并将其根据 Firebase ID 存储在您的数据库中。获得令牌后,您可以在数据库中查找分配给该字符串的 ID。
关于 OAuth 实施和其中每个步骤还有许多其他详细信息。有关详细信息,请参阅 https://developers.google.com/actions/identity/oauth2-code-flow。