【问题标题】:Permission Error on Firebase DatabaseFirebase 数据库权限错误
【发布时间】:2016-06-04 12:57:22
【问题描述】:

我正在创建一个注册 Web 表单来创建用户并使用 UID 存储信息。当我尝试创建用户数据时,我收到了FIREBASE WARNING: set at /User/4FzbgqXVX8NlbB0pBkDdJeZ9HHe2 failed: permission_denied

我的 firebase 数据库规则如下。希望确保这些数据并非对所有用户都可用,除了管理员和用户自己

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

创建用户和写入数据的函数如下

<script>
function createUser() {
var Result = "true";
var textUser = document.getElementById('userName').value;
var textPassword = document.getElementById('userPassword').value;
var textAccountID = document.getElementById('accountRef').value;
var textDateCreated = document.getElementById('dateCreated').value;
var textDisplayName = document.getElementById('displayName').value;
var UID;

firebase.auth().createUserWithEmailAndPassword(textUser, textPassword).then(function(user){
  console.log('uid',user.uid);//Here if you want you can sign in the user
  UID = user.uid;

  writeUserData(UID, textDisplayName, textAccountID, textDateCreated);

}).catch(function(error) {
    //Handle error
  var errorCode = error.code;
  var errorMessage = error.message;
  return Result = "false";
});

return Result;

}

function writeUserData(userId, displayName, accountID, dateCreated) {
  firebase.database().ref('User/' + userId).set({
  userId:{
    AccountID: accountID,
    Created: dateCreated,
    Name: displayName}
  });

    firebase.auth().signOut().then(function() {
      // Sign-out successful.
    }, function(error) {
      // An error happened.
    });
}


</script>

有没有人知道如何解决上述问题?

更新

我已将请求的节点更改为这样的用户

firebase.database().ref('users/' + userId).set({
firebase.database().ref('/users/' + userId).set({
firebase.database().ref('/users' + userId).set({

我的规则是这样的

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

但是我仍然收到以下与权限有关的错误消息

FIREBASE WARNING: set at /users/bgzolYFgEgY29WYsNEI0vyULXp13 failed: permission_denied 

我还尝试将规则更改回默认规则,如下所示 ,但是我仍然获得许可被拒绝

// These rules require authentication
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

【问题讨论】:

  • 在您的参考中,您使用的是路径“User/”,而在您的规则中,您使用的是“/users”,这些将被视为不同的路径
  • 请在标记时更加准确。您的问题使用 JavaScript 并且未提及 Android,因此应将其标记为此类。我现在将对其进行更改,但为了提高您获得答案的机会,最好立即正确标记。
  • 顺便说一句@Ymmanuel。我将投票关闭作为一个错字。
  • 对不起@FrankvanPuffelen,我的错。我当时正在编写 android 等价物,并错误地标记了它。我也更新了我的问题,因为我仍然收到权限错误

标签: javascript firebase firebase-authentication


【解决方案1】:

我花了一些时间来纠正上述问题,但我很高兴我已经解决了。对于那些也遇到类似问题的人,这里是答案

首先,我错误地将信息传递到数据库。我提供了以下内容:

  userId:{
    AccountID: accountID,
    Created: dateCreated,
    Name: displayName}

我现在提供这个:

AccountID: accountID,
Created: dateCreated,
Name: displayName

我相信以上是导致我的权限错误

这适用于一些电话,但不是全部...

其次,我认为 firebase 调用可能是异步任务,因此在 set 命令之后直接调用 signOut() 可能会导致我的一些间歇性结果。我正确地添加了所有的 Promise 并调用了 signOut() 并从这里写入数据函数。

现在看来一切顺利

<script>
function createUser() {
var Result = "true";
var textUser = document.getElementById('userName').value;
var textPassword = document.getElementById('userPassword').value;
var textAccountID = document.getElementById('accountRef').value;
var textDateCreated = document.getElementById('dateCreated').value;
var textDisplayName = document.getElementById('displayName').value;


firebase.auth().createUserWithEmailAndPassword(textUser, textPassword).then(function(user){
  console.log('uid',user.uid);//Here if you want you can sign in the user
  console.log('success','user added in createUser');  
  writeUserData(user.uid, textDisplayName, textAccountID, textDateCreated);

}).catch(function(error) {
    console.log('error','Error when creating user');
    //Handle error
  var errorCode = error.code;
  var errorMessage = error.message;
  return Result = "false";
});

return Result;

}

function writeUserData(userId, displayName, accountID, dateCreated) {
  firebase.database().ref('users/' + userId).set({
    AccountID: accountID,
    Created: dateCreated,
    Name: displayName
  }).then(function() {
  console.log('success','Added record in writeUserData');
        signUserOut();

  })
  .catch(function(error) {
  console.log('error','Error in writeUserData');
    //Handle error
  var errorCode = error.code;
  var errorMessage = error.message;
  return Result = "false";

    signUserOut();

});


}

function signUserOut(){
        firebase.auth().signOut().then(function() {
        console.log('success','signed user out');
      // Sign-out successful.
    }, function(error) {
    console.log('error','error signing out user');
        var errorCode = error.code;
        var errorMessage = error.message;
      // An error happened.
    });

}


</script>

我的数据库规则如下所示

{
  "rules": {
    "users": {
      "$user_id": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($user_id)
        ".read": "$user_id === auth.uid",
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

感谢所有帮助

【讨论】: