2015-12-06 155 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」向上移動一層,同時仍然觸發驗證。 –