【问题标题】:Firebase: How do I implement secure session tracking?Firebase:如何实现安全会话跟踪?
【发布时间】:2014-08-08 00:35:21
【问题描述】:

编辑尝试简化这个问题......在一个非常基本的层面上,我相信这必须是会话系统的一个相当基本的需求......如何做我们有一个安全的会话跟踪器而不破坏 onDisconnect 功能?如果您添加安全规则,onDisconnect 将不起作用,如果您不添加安全规则,任何人都可以通过写入未受保护的表或删除其他人的状态来“欺骗”登录会话。

我正在尝试解决未调用“onDisconnect”的问题,因为我的安全规则只允许登录用户在 /sessions/$userid/"true" 中写入他们的状态数据 ... onDisconnect 工作如此只要该用户已登录,但如果该用户在注销后关闭浏览器,或由于超时而注销,则 onDisconnect 将被安全规则阻止。

起初我想......“哦,我可以追溯到发生注销的地方,并在那里再次清理会话存在。”但是我是否认为通过更多我会意识到 auth = newFirebaseSimpleLogin 回调“else”块似乎是检测注销的唯一方法。最重要的是,在注销发生后返回回调,以便将我返回到我需要登录的地方,以便 onDisconnect 调用可以删除我的会话,但此时,我已经注销了。

我错过了什么吗?是否有我不知道的注销前呼叫?我可以在安全规则文件中做些什么特别的事情来允许 onDisconnect 删除注销后的会话吗?

这是我为有问题的“表”设置的安全规则块:

"sessions":{
    "$user":{
      ".write": "$user == auth.uid"
    }
},

在 JS 中它很简单:

var con = ref.sessions[user].push(true);
con.onDisconnect().remove();

正如预期的那样,由于我没有登录 onDisconnect 我得到:

FIREBASE WARNING: set at /sessions/simplelogin:16 failed: permission_denied  

编辑:反对票是怎么回事? =/

【问题讨论】:

    标签: firebase firebase-security firebasesimplelogin


    【解决方案1】:

    我建议在调用 logout() 之前删除存在位。

    如果您想跟踪已注销用户的“存在”,您可以将新的存在位设置为未经身份验证的用户,或者您可以匿名登录: https://www.firebase.com/docs/security/simple-login-anonymous.html

    【讨论】:

    • 正如@andrew-lee 提到的,您需要在调用.logout() 之前删除存在位,因为您的安全规则需要经过身份验证的用户,在写入时会检查(在这种情况下 - 在客户端断开连接时)不仅仅是在您致电 ref.onDisconnect().set() 时。
    猜你喜欢
    • 2013-06-27
    • 2011-04-26
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2020-06-25
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多