【问题标题】:firebase permission error when creating a new user创建新用户时firebase权限错误
【发布时间】:2018-08-19 05:25:54
【问题描述】:

我正在努力确保我的 firebase 数据库的安全性。我的问题是限制用户配置文件,以便只有用户可以编辑他/她自己的节点。当用户注册时,我创建了一个 firebase auth 用户,并立即通过电子邮件将此用户添加到我的数据库中;但是,我在尝试向数据库添加新用户时收到权限被拒绝错误。

我很困惑,因为我在 firebase 模拟器中的模拟运行顺畅;但是,我的代码没有按预期工作。在调试中,我尝试在写入数据库时​​打印当前的 uid,并将其与用户的 authID 进行比较,它们匹配。在另一个步骤中,我将规则简化为:auth != null,但它也失败了。这让我相信用户没有及时得到身份验证,但如果是这种情况,当前 uid 的打印将无法正常工作。

这是我的规则:

"users" : {
    "$user_id": {
        ".read":"true",
        ".write":"auth != null",
        ".validate": "newData.exists()",
        "isAdmin": {
          ".validate":"false"
        },
        "email": {
          ".validate":"newData.val().matches(/^.+@.+\\..+$/)"
        }
     }
}

这是我的 chrome 检查器控制台的图片,用于显示错误和错误前 uid 的打印:

这是我用来编写的代码:

    var firstName =         $(".signUpForm #firstName").val();
    var lastName =          $(".signUpForm #lastName").val();
    var emailInput =        $("#emailInput").val();
    var password =          $("#passwordInput").val();
    var passwordConfirm =   $(".signUpForm #passwordConfirmInput").val();

    const promise = firebase.auth().createUserWithEmailAndPassword(emailInput, password).then(function(user) {
        console.log(user.uid);

        console.log(firebase.auth().currentUser.uid);

       // user signed in
        var usersRef = firebase.database().ref('users');
        var uid = firebase.auth().currentUser.uid;
        usersRef.child(uid).set({
            email: emailInput
        }).catch(function(error) {
            displayErrorMessage(error.code);
        }).then(function() {
            //window.location.reload(true);         
        })   
        // $(".logInMessage").html('SignedUp!');
        // $(".logInMessage").css("color", "green");

    }).catch(function(error) {
        var errorCode = error.code;
        var errorMessage = error.message;

        if (errorCode === 'auth/wrong-password') {
            $(".logInMessage").html('Wrong password.');
            $(".logInMessage").css("color", "red");

        } else {
            $(".logInMessage").css("color", "red");                                 
            $(".logInMessage").html(errorMessage);  
        }
        console.log(error);
    });

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

    限制用户只能编辑自己的节点可以通过以下方式完成:

    ".write": "auth != null && auth.uid == $user_id"
    

    对于写访问的其余问题,您可能需要在模拟器中进行试验或尝试删除一些规则并缩小范围,直到您可以隔离违规行。

    【讨论】:

    • 感谢您的回复,但我是一步一步来的。我将写入规则更改为仅限制经过身份验证的用户,因为甚至没有通过该规则。在没有首先通过身份验证规则的情况下跳到第二部分似乎是额外的工作。另外,就像我说的,不幸的是(或幸运地),模拟器工作得很好,我可以随心所欲地写作。我认为问题出在客户端代码中。
    最近更新 更多