如何将元数据添加到 Firebase 身份验证

Urc*_*boy 7 firebase firebase-authentication google-cloud-functions

我需要在使用 firebase 身份验证的 google 登录期间传递自定义值 (device_id)。此值稍后通过侦听身份验证事件触发器从云函数中获取,然后将该值添加到 Firestore

我知道您可以将值作为 http 触发器的查询参数传递。但是,在我的情况下,我只需要在身份验证期间和之后传递并获取值。因此,firebase 身份验证中是否存在某种 auth.addMetaData(metadata) 函数?

我需要能够在身份验证触发器之后检索自定义数据,就像我们可以执行 user.email 一样。我需要类似 user.custom_data 的东西

Tom*_*und 14

尽管 Doug 提到了 Firebase Custom Claims,但我认为值得提供额外的文档,因为它确实允许您向 Firebase User 对象添加简单的元数据。

重要笔记

  • 大警告:自定义声明仅在用户登录时刷新。因此,isAdministrator声明将要求用户在激活之前注销/登录。
  • Firebase 建议“使用自定义声明来存储仅用于控制用户访问的数据。所有其他数据应通过实时数据库或其他服务器端存储单独存储。”

设置元数据(仅限服务器)

这是一个关于如何设置device_idFirebase 用户对象的示例(在服务器上使用firebase-admin):

await admin.auth().setCustomUserClaims(uid, { deviceId })
Run Code Online (Sandbox Code Playgroud)

注意:您不能在客户端上设置自定义声明。

获取元数据(服务器和客户端)

然后device_id从服务器上的用户检索:

const userRecord = await admin.auth().getUser(uid)
console.log(userRecord.customClaims.deviceId)
Run Code Online (Sandbox Code Playgroud)

……在客户端:

const idTokenResult = await firebase.auth().currentUser.getIdTokenResult()
console.log(idTokenResult.claims.deviceId)
Run Code Online (Sandbox Code Playgroud)

在 Firebase 安全规则中使用元数据

有趣的是,自定义声明也可以在 Firebase 安全规则中使用。这个(有点不切实际)的例子只允许用户deviceId === 123查看数据:

{
  "rules": {
    "secureContent": {
      ".read": "auth.token.deviceId === 123"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更多信息


Dou*_*son 10

Firebase 身份验证不支持客户端提供的任何类型的额外数据。与 Firebase 为每个用户存储的元数据最接近的是custom claim ,但是,存储在那里的 JSON blob 只能由特权服务器端应用程序设置。

如果您需要存储每个用户的数据,由客户端应用程序编写,您可能应该为此使用数据库(Cloud Firestore 或实时数据库),受 Firebase 安全规则保护,以便只有最终用户可以读取和写入他们自己的数据. 您还可以使用 HTTP 类型的 Cloud Function 将数据传递到您的函数中以记录在数据库中。

  • 好的,Doug,我将使用 HTTP 触发器。谢谢 (2认同)