0

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

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

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

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

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

谢谢

4

1 回答 1

2

这似乎是一个经典的XY 问题(即试图解决尝试的解决方案而不是实际问题)。

如果我正确理解您的限制,则根本问题是您不希望直接连接到您的服务器。这是目前我们与 Firebase 一起使用的模型,我可以想出两种简单的模式来实现这一点。

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

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

这避免了对安全规则的需求,因为对于正常使用而言,URL 是不可猜测的,或者足够接近它,在 Firebase ID 的情况下。

客户端示例:

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');

从服务器上,只需 monitor 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 的内置 authSinglely(支持 Firebase)。这是两全其美的方法,也是我在大多数情况下使用的模型。

您的客户端可以直接使用这些服务之一进行身份验证,而无需接触您的服务器,然后使用令牌向 Firebase 进行身份验证,从而使安全规则生效。

于 2013-05-02T15:24:08.510 回答