2015-12-06 113 views
1

首次使用Firebase处理新项目,并在包含验证规则时写入活动事件时收到权限被拒绝消息。Firebase数据验证失败

验证规则如下:

"activity": { 
".read": "auth != null", 
".write": "auth != null", 
".validate": "newData.hasChildren(['user'])", 
".indexOn": ["when"] 
} 

在一个新的活动事件,我推新的项目,抢令牌ID,并使其(现在)的推数据部分。当在调试中看到这个(使用自定义令牌认证系统)时,这就是我所看到的。被推送的json有一个“user”条目,它是auth用户的GUID,所以我不确定它为什么失败。我分开了json文本。

utility.js (line 1675) 
FIREBASE: Attempt to write { 
"id":"-K4oomuOpaY4K2aGUYZA", 
"imp":false, 
"text":"xxx.", 
**"user":"0648480c-xxx"**, 
"when":1449363973059 
} to /activity/## with auth={"uid":"0648480c-xxx","name":"Greg Merideth"} 

/activity:.write: "auth != null" => true 
/activity:.validate: "newData.hasChildren(['user'])" => false 

FIREBASE: Validation failed. firebase.js (line 195) 
FIREBASE: Write was denied firebase.js (line 195) 

我甚至试图将规则更改为“.validate”:“newData.hasChild('user')”具有相同的最终结果。

是新数据看入站数据包还是我的“auth”数据包?

更新(从注释)

增加一个新项目的调用一个函数传入fbActivity处理程序,然后调用:

var message = fbActivity.push({ 
    id: user.fn(), 
    text: t.val(), 
    imp: false, 
    user: user.uid(), 
    when: new Date().getTime()} 

推新条目。我们没有使用fb.timestamp,因为我们的服务器在fb之后运行3秒,所以我们的时间戳出奇怪的。

+0

交叉帖子:https://groups.google.com/forum/#!topic/firebase-talk/a53ya-tVf80 –

+0

我在下面添加了最可能的答案。如果不是这样,请添加您用于写入数据的代码。没有这一点,就不可能确定什么是错的。 –

+0

添加一个新项目调用传入fbActivity处理函数的函数,然后调用: var message = fbActivity.push({id:user.fn(),text:t.val(),imp:false,user :user.uid(),when:new Date()。getTime()} 要推新条目,我们没有使用fb.timestamp,因为我们的服务器在fb之后运行3秒,所以我们的时间戳出奇怪的 –

回答

2

我想你打电话push()增加一个新的孩子在activity下。在这种情况下,你的规则是缺少由push()产生额外的级别:

"activity": { 
    "$activityid": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
    ".validate": "newData.hasChildren(['user'])", 
    ".indexOn": ["when"] 
    } 
} 

如果是这样的话,请花时间阅读Firebase security guide,这也解释了这一点,关于语言的其他许多有用位。

+0

用这种格式我得到了读取拒绝消息,我想我传递活动feed消息的方式可能需要调整。将“.read”和“.indexon”向上移动一层,同时仍然触发验证。 –