Permissions firebase once()给出权限错误,但ref()成功
目标:扫描firebase数据并删除超过给定时间的项目 问题是:尽管允许其他读取操作,但查询生成了权限错误。然而问题似乎在于。阅读规则,因为当它被取出时,一切都正常 我使用嵌入了“username”和“dataClass”的令牌进行身份验证。身份验证通常工作正常,订阅的客户端正在接收更新。调试日志和检查auth()负载表明“username”和“dataClass”正确嵌入到令牌中,并由Firebase正确提取 但是,尝试使用once()获取早于特定时间的数据子集会产生权限错误。但是,我可以使用ref()查看数据位置,没有错误。为什么ref()有效而查询无效?可能存在的基本误解:查询是否像在SQL数据库中一样返回数据的副本,还是返回指向数据的指针 下面是代码,后面是正在使用的规则。谢谢你Permissions firebase once()给出权限错误,但ref()成功,permissions,firebase,Permissions,Firebase,目标:扫描firebase数据并删除超过给定时间的项目 问题是:尽管允许其他读取操作,但查询生成了权限错误。然而问题似乎在于。阅读规则,因为当它被取出时,一切都正常 我使用嵌入了“username”和“dataClass”的令牌进行身份验证。身份验证通常工作正常,订阅的客户端正在接收更新。调试日志和检查auth()负载表明“username”和“dataClass”正确嵌入到令牌中,并由Firebase正确提取 但是,尝试使用once()获取早于特定时间的数据子集会产生权限错误。但是,我可以使用
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'"
}
}
var Firebase=require('Firebase');
Firebase.enableLogging(true,true);
//身份验证令牌作为参数传入
var代币;
process.argv.forEach(函数(val,index,array){if(index==2){token=val;}});
var oneHourAgo=(新日期).getTime()-(分钟*60000);
var fb=新的火基(“https://.firebaseio.com/changeMessages");
connect2Firebase(fb,令牌);
函数connect2Firebase(firebase、authToken){
firebase.auth(authToken,函数(错误,有效负载){
如果(错误){
log(“登录失败!”,错误);
}否则{
log(“登录成功!”);
控制台日志(有效载荷);
doSomething();
}
});
}
函数doSomething(){
//这会导致权限错误
once('value',函数(ss){console.log(ss.val());});
//这很有效
//log(fb.endAt(oneHourAgo.ref().toString());
}
//规则。更改为“.read”:true可使其正常工作。
{
“规则”:{
“更改消息”:{
“$dataClass”:{
“.read”:“auth.dataClass=$dataClass&&auth.username=='admin',
“.write”:“auth.username=”admin“
}
}
}
}.ref()是一个本地操作(它实际上不涉及到与服务器的任何连接),只需在服务器上创建一个新的路径“引用”,因此这永远不会导致权限错误。澄清一下,您是说如果更改传递到endAt()中的日期值,此查询将起作用吗?不完全正确。现在所有的数据都超过一个小时了,所以所有的数据都应该被选中。但没有一个是这样的,事实上,无论将什么日期值传递到endAt(),它都会给出一个权限错误。使用模拟器,规则按预期工作,并且在auth JSON中以给定值接受读取。对于实际的程序,debug显示在auth()中传递了相同的值,但是“once('value'…”返回“permission denied”。关于once()。这可能是异步的吗?另外,我不想只是下载一份数据到客户端,我最终想删除Firebase服务器上超过一小时的数据。@kato,另一种方法如何:不编写单独的服务器程序(我在Node.js中这样做)要删除旧的firebase数据,请在客户端连接时设置一个简单的事件:
firebaseRef.endAt(timestoneHourago).on(“child_added”,函数(snap){snap.ref().remove();}
添加这样的事件,甚至数千个,应该是有效的。但是,remove()会生成一个“child_added”事件,这是一个循环引用,可能会导致挂起。使用once()设置事件将无法保持清理。如何绕过循环引用?如果op在模拟器中工作,但在客户端上不工作,则验证令牌不能相同。.once()是异步的,但上面的示例作为异步事件运行良好。您的示例安全规则中缺少一个};它们是否准确?您可以将debug:true添加到令牌的“选项”部分(第二个参数),以查看类似于客户端模拟器的输出。