首页 > 解决方案 > 将数据保存到 Firebase 用户对象

问题描述

使用这个:

firebase.auth().onAuthStateChanged(function(user){
    if (user){

Firebase正在返回用户,其中包括userID. 当网页获取此对象时,它会获取用户 ID,并且需要再次访问数据库记录以检查一些非常基本的内容(如果它是付费用户,或者其他简单的键)以选择 UI。

是否可以在此回调中返回用户,包括一些关于他的预定义基本信息?

标签: firebasefirebase-authentication

解决方案


如果要向用户帐户添加一些额外信息,则不能使用User具有固定属性列表的对象。

有两种经典方法:

1.创建特定的用户记录

您为每个用户创建一个 Firestore 文档(或一个实时数据库节点)。通常您使用用户的 uid 作为 Firestore 文档/RTDB 节点的 id。

这意味着您将需要获取数据库以获取此额外的用户信息,例如

firebase.auth().onAuthStateChanged(function(user){
    if (user) {
        firebase.firestore().collection('users').doc(user.uid).get()
        .then(...)
    }
    //...
}
 

2.使用自定义声明

如果您只需要存储有限数量的额外信息以提供访问控制,您可以使用自定义声明。这特别适用于存储用户角色,例如付费用户。

自定义用户声明可通过用户的身份验证令牌访问,因此您可以使用它们根据用户的角色或访问级别修改客户端 UI。文档中查看更多详细信息。


要在前端获取声明,您可以执行以下操作:

firebase.auth().onAuthStateChanged(function (user) {
    if (user) {
        user.getIdTokenResult()
            .then((idTokenResult) => {
                // Confirm the user is a paid user.
                if (!!idTokenResult.claims.paidUser) {
                    // Show admin UI.
                    showPaidUserUI();
                } else {
                    // Show regular user UI.
                    showRegularUI();
                }
            })
            .catch((error) => {
                console.log(error);
            });
    }
    //...
}

请务必注意文档中的以下部分:

自定义声明仅用于提供访问控制。它们并非旨在存储其他数据(例如配置文件和其他自定义数据)。虽然这似乎是一种方便的机制,但强烈建议不要这样做,因为这些声明存储在 ID 令牌中,并且可能导致性能问题,因为所有经过身份验证的请求始终包含与登录用户对应的 Firebase ID 令牌。

  • 使用自定义声明来存储数据,仅用于控制用户访问。所有其他数据应通过实时数据库或其他服务器端存储单独存储。
  • 自定义声明的大小有限。传递大于 1000 字节的自定义声明有效负载将引发错误。

推荐阅读