【问题标题】:Firebase unable to authenticate/remove onDisconnect()Firebase 无法验证/删除 onDisconnect()
【发布时间】:2014-09-12 16:17:55
【问题描述】:

我在使 onDisconnect().remove() 与身份验证/安全规则一起工作时遇到了一些麻烦。基本上我有的是这样的:

首先,我使用 auth() 登录用户:

var rootRef = new Firebase(FIREBASE_URL + 'sites/' + FIREBASE_ROOT);
rootRef.auth(user.FIREBASE_TOKEN, loginCallback);

然后,我的 loginCallback 将当前用户注册为活动用户,并确保在断开连接时删除用户引用:

var activeUsers = $firebase(rootRef.child('pages/' + pageId + '/users')).$asArray();
var rawUser = {
  id: user.id,
  displayName: user.displayName
};
activeUsers.$add(rawUser).then(function (userRef) {

  userRef.onDisconnect().remove();

});

我的 Firebase 特定部分的安全规则如下所示:

{
  "rules": {
    "sites": {
      "$siteName": {
        "pages": {
          "$pageId": {
            "users": {
              // only users with firebase access can use this
              ".read": "auth.firebase_user === true"
              "$arrayId": {
                // users can only write their own data
                ".write": "auth.firebase_user === true && auth.id === newData.child('id').val()",
                ".validate": "newData.hasChildren(['id', 'displayName'])"
              }
            }
          }
        }
      }
    }
  }
}

使用此安全配置和 JS,当用户断开连接时,他们的引用不会从 Firebase 中删除。但是,如果我改用这些安全规则:

{
  "rules": {
    "sites": {
      "$siteName": {
        "pages": {
          "$pageId": {
            "users": {
              // only users with firebase access can use this
              ".read": "auth.firebase_user === true",
              ".write": "true",
              "$arrayId": {
                // users can only write their own data
                //".write": "auth.firebase_user === true && auth.id === newData.child('id').val()",
                ".validate": "newData.hasChildren(['id', 'displayName'])"
              }
            }
          }
        }
      }
    }
  }
}

用户引用在断开连接时被正确删除。

我尝试了许多不同的安全规则和 JS 实现,但基本上都以这个问题告终。

有人知道这里是否可能存在身份验证问题吗?用户的身份验证变量是否及时进入 Firebase 以正确删除用户?

一些旁注:我正在使用 AngularFire,这基本上是一种用于查看其他人正在查看当前页面的状态实现。

【问题讨论】:

  • 一个有用的调试工具是在你的 onDisconnect().remove(/* callback here */) 方法中加入一个回调,这样你就可以捕获安全错误。

标签: javascript authentication firebase angularfire user-presence


【解决方案1】:

想通了,看起来安全规则弄乱了我在 Firebase 中访问对象的方式。将我的安全规则修改为如下所示:

{
  "rules": {
    "sites": {
      "$siteName": {
        "pages": {
          "$pageId": {
            "users": {
              ".read": "auth.firebase_user === true",
              ".write": "auth.firebase_user === true",
              "$arrayId": {
                ".validate": "newData.hasChildren(['id', 'displayName']) && newData.child('id').val() === auth.id"
              }
            }
          }
        }
      }
    }
  }
}

现在 firebase 用户可以读写,但他们写的任何内容都必须符合验证规则。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多