javascript - 身份验证后无法从 Firebase 读取数据

标签 javascript firebase firebase-security firebase-authentication

大家好,我是 Firebase 新手,我正在尝试开发一个简单的聊天应用。 到目前为止,我已经按照 Firebase 文档中的步骤完成了身份验证。

这是我的登录方法

loginUser: function(){
        console.log("Login button");
        var self = this;
        ref.authWithOAuthPopup("github", function(error, authData) {
            if (error) { console.log("Login Failed!", error);} 
            else {
                console.log(authData);
                ref.child("users").child(authData.uid).set({
                    auth : authData.auth,
                    provider : authData.provider,
                    name : authData.github.displayName,
                    imgUrl : authData.github.profileImageURL,
                    token: authData.token
                });
                self.user.name = authData.github.displayName;
                self.user.imgUrl = authData.github.profileImageURL;
                self.user.provider = authData.provider;
                setTimeout(function(){ self.authenticated = true; }, 2000);
                this.getContacts();
            }
        },{ 
            remember : "sessionOnly", 
            scope: "user"
        });

    }

这是 getContacts 方法(我尝试控制台快照,但什么也没得到)

    getContacts: function(){
        console.log('GET CONTACTS');
        var self = this;
        //retrieving all the user, but for somehow this request doesn't execute
        ref.child('users').once('value',function(snapshot){
            var contacts = snapshot.val();
            console.log(contacts);
            for(var contact  in contacts){
             self.contacts.push({
                id: contact,
                name: contacts[contact].name,
                imgUrl: contacts[contact].imgUrl,
                provider: contacts[contact].provider
             });
            }
        });
    }

这些是安全规则

{
  "rules": {
    "users": {
      "$uid": {
        // grants write access to the owner of this user account whose uid must exactly match the key ($uid)
         ".write": "auth !== null && auth.uid === $uid",
         // grants read access to any user who is logged in with GitHub
         ".read": "auth !== null && auth.provider === 'github'"
       }
     }
 }

我必须提到我正在使用 Vuejs

最佳答案

您正在向特定用户授予访问权限:/users/$uid。但为了能够对 Firebase 中的节点运行查询,您必须拥有该节点的读取权限。因此 Firebase 会拒绝您的查询,因为您无权访问 /users。该文档在 "rules are not filters" 部分对此进行了介绍。 。很多人都会遇到这个问题,因为这是关系数据库中非常常见的方法。事实是rules are not filterspermissions cascade down ,是 Firebase 安全模型的两个最常见的陷阱。

在这种情况下,您可能希望向所有用户授予对整个 /users 节点的访问权限,因此您只需将读取权限上移一级即可:

{
  "rules": {
   // grants read access to any user who is logged in with GitHub
   ".read": "auth !== null && auth.provider === 'github'"
    "users": {
      "$uid": {
        // grants write access to the owner of this user account whose uid must exactly match the key ($uid)
         ".write": "auth !== null && auth.uid === $uid",
       }
     }
 }

有了这个,每个经过 github 验证的用户都可以读取所有用户,因此查询不会被拒绝。

在其他情况下,您可能必须以不同的方式对数据进行建模才能满足您想要的安全约束。

关于javascript - 身份验证后无法从 Firebase 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34842287/

相关文章:

javascript - 自定义验证器,cb不是函数

javascript - 循环的文件预览可以很好地处理一个项目,两个或多个文件重复最后一个文件

android - 在 Firebase 模型中保存推送的 ID

ios - 错误 : `call FirebaseApp.configure() before using Firestore`

firebase - firestore rest api batchwrite 权限被拒绝

validation - Firebase 规则 : allow push but not allow update

javascript - 将 setInterval 与 requestAnimationFrame 一起使用

php - "error": "InvalidRegistration" while sending notification from PHP

firebase - 在 Firebase 中强制执行用户配额

javascript - css 规模上的 jQueryUI slider 问题