目标:扫描firebase数据并删除超过给定时间的项目。
问题:查询生成权限错误,但允许其他读取操作。然而问题似乎是.read规则,因为当它被取出时,一切正常。
我使用嵌入了“username”和“dataClass”的令牌进行身份验证。身份验证通常正常,订阅的客户端正在接收更新。调试日志并检查auth()有效负载表明“username”和“dataClass”正确嵌入到令牌中并由Firebase正确提取。
但是,尝试使用once()来获取早于特定年龄的数据子集会产生权限错误。我可以使用ref()查看数据位置,但没有错误。为什么ref()工作而查询不起作用?可能的基本误解:查询是返回数据的副本,就像在SQL数据库中一样,还是返回指向数据的指针?
这是代码,后面是使用的规则。非常感谢。
var Firebase = require('firebase');
Firebase.enableLogging(true, true);
// auth token is passed in as an argument
var token;
process.argv.forEach(function(val, index, array) {if (index==2) {token=val;} });
var oneHourAgo=(new Date).getTime() - (minutes*60000);
var fb=new Firebase("https://<mysite>.firebaseio.com/changeMessages");
connect2Firebase(fb,token);
function connect2Firebase(firebase,authToken) {
firebase.auth(authToken, function(error,payload) {
if(error) {
console.log("Login Failed!", error);
} else {
console.log("Login Succeeded!");
console.log(payload);
doSomething();
}
});
}
function doSomething() {
// THIS GIVES PERMISSION ERROR
fb.endAt(oneHourAgo).once('value', function(ss) { console.log(ss.val()); });
// THIS WORKS
//console.log(fb.endAt(oneHourAgo).ref().toString());
}
// THE RULES. Changing to ".read":true makes it work.
{
"rules": {
"changeMessages": {
"$dataClass": {
".read": "auth.dataClass == $dataClass && auth.username == 'admin'",
".write": "auth.username == 'admin'"
}
}
} }