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

时间:2019-08-30 16:41:24

标签: firebase firebase-authentication google-cloud-functions

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

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

我需要能够在auth触发后检索自定义数据,就像我们可以执行user.email一样。我需要类似user.custom_data

的东西

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

重要提示

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

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

下面是一个如何在Firebase用户对象上(在服务器上使用device_id设置firebase-admin的示例:

await admin.auth().setCustomUserClaims(uid, { deviceId })

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

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

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

const userRecord = await admin.auth().getUser(uid)
console.log(userRecord.customClaims.deviceId)

…以及在客户端上:

const idTokenResult = await firebase.auth().currentUser.getIdTokenResult()
console.log(idTokenResult.claims.deviceId)

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

整洁的是,Firebase安全规则中也提供自定义声明。这个(略微不切实际的)示例仅允许具有deviceId === 123的用户查看数据:

{
  "rules": {
    "secureContent": {
      ".read": "auth.token.deviceId === 123"
    }
  }
}

更多信息