只有当前连接(未经过身份验证)和管理员用户在特定位置读取和写入的可能性

时间:2013-05-02 14:51:57

标签: firebase firebase-security

有没有办法编写安全规则,或者是否有任何其他方法只能使当前连接(未经过身份验证)的用户写入/读取某个位置 - 管理员也应该能够写/读? 是否可以编写一条规则,禁止用户读取完整的条目列表,并让它们只读取与客户端传递的标识符匹配的条目?

我正在尝试通过Firebase在用户和Node.js应用程序之间交换一些数据,并且该数据不应该由除用户和/或管理员以外的任何人读取或写入。

我知道一个解决方案是用户在我的服务器上请求身份验证令牌并使用它在Firebase上进行身份验证,这样就可以编写阻止读取和写入的规则。但是,我试图避免用户连接到我的服务器,所以这个解决方案不是第一个选择。

这是基于会话的方式,在Firebase中不可用,但我有 一些可以解决这类问题的想法 - 如果在会话管理之前实施的话:

  • 也许让管理员写入/.info/位置,客户端会针对每次更改进行查看,并且只能通过活动连接读取 - 如果我正确理解.info的工作原理
  • 可能为此目的创建.temp位置
  • 也许让管理员和连接的客户端可以拥有更多访问连接信息的权限,其中包含一些连接唯一ID,可用于创建具有该名称的位置并在规则内使用它以防止读取和列出给其他用户

由于

1 个答案:

答案 0 :(得分:2)

这看起来像是经典XY problem(即尝试解决尝试的解决方案而不是实际问题)。

如果我正确理解您的约束,那么潜在的问题是您不希望与服务器建立直接连接。这是我们与Firebase一起使用的模型,我可以想到两个简单的模式来实现这一目标。

1)将数据存储在不可猜测的路径中

创建一个UUID或GID,或者假设我们在这里没有讨论银行级安全性,只需一个简单的Firebase ID(firebaseRef.push()。name())。然后让服务器和客户端通过此路径进行通信。

这样可以避免对安全规则的需求,因为对于正常使用,如果是Firebase ID,则URL是不可取的,或者足够接近它。

客户端示例:

var fb = new Firebase(MY_INSTANCE_URL+'/connect');
var uniquePath = fb.push();
var myId = uniquePath.name();

// send a message to the server
uniquePath.push('hello world');

在服务器上,只需监控connect,每个连接的都是新客户端:

var fb = new Firebase(MY_INSTANCE_URL+'/connect');
fb.on('child_added', newClientConnected);

function newClientConnected(snapshot) {
   snapshot.ref().on('child_added', function(ss) {
       // when the client sends me a message, log it and then return "goodbye"
       console.log('new message', ss.val());
       ss.ref().set('goodbye');
   });
};

在您的安全规则中:

{
   "rules": {
       // read/write are false by default

       "connect": {
          // contents cannot be listed, no way to find out ids other than guessing

          "$client": {
             ".read": true,
             ".write": true
          }
       }
   }
}

2)使用Firebase身份验证

不要花费太多精力来避免身份验证,只需使用第三方服务,例如Firebase's built-in authSingly(支持Firebase)。这是两个世界中最好的,以及我在大多数情况下使用的模型。

您的客户可以直接使用其中一项服务进行身份验证,从不接触您的服务器,然后使用令牌向Firebase进行身份验证,从而使安全规则生效。