这似乎是一个经典的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 的内置 auth或Singlely(支持 Firebase)。这是两全其美的方法,也是我在大多数情况下使用的模型。
您的客户端可以直接使用这些服务之一进行身份验证,而无需接触您的服务器,然后使用令牌向 Firebase 进行身份验证,从而使安全规则生效。