我需要在使用Firebase身份验证的Google登录期间传递自定义值(device_id)。稍后通过侦听身份验证事件触发器从云功能获取此值,然后将该值添加到Firestore
我了解您可以将值作为http触发器的查询参数传递。但是,在我的情况下,我只需要在身份验证期间和之后传递并获取值。因此,firebase身份验证中是否存在某种auth.addMetaData(metadata)函数?
我需要能够在auth触发后检索自定义数据,就像我们可以执行user.email一样。我需要类似user.custom_data
的东西答案 0 :(得分:4)
Firebase身份验证不支持客户端提供的任何形式的额外数据。 Firebase与每个用户存储的元数据最接近的是custom claims,但是,存储在其中的JSON blob只能由特权服务器端应用程序设置。
如果您需要存储由客户端应用程序编写的每个用户的数据,则可能应该使用该数据库(Cloud Firestore或实时数据库),该数据库受Firebase安全规则保护,以便只有最终用户才能读写自己的数据。您还可以使用HTTP类型的Cloud Function将数据传递到函数中以记录在数据库中。
答案 1 :(得分:3)
尽管Doug提到了Firebase Custom Claims,但我认为值得增加额外的文档,因为它确实允许您向Firebase User对象添加简单的元数据。
isAdministrator
声明要求用户在激活之前注销/登录。下面是一个如何在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安全规则中也提供自定义声明。这个(略微不切实际的)示例仅允许具有deviceId === 123
的用户查看数据:
{
"rules": {
"secureContent": {
".read": "auth.token.deviceId === 123"
}
}
}