0

我在使用身份驗證/安全規則onDisconnect()。remove()時遇到了一些麻煩。基本上我已經是這樣的:Firebase無法驗證/刪除onDisconnect()

首先,我記錄用戶與身份驗證():

var rootRef = new Firebase(FIREBASE_URL + 'sites/' + FIREBASE_ROOT); 
rootRef.auth(user.FIREBASE_TOKEN, loginCallback); 

然後,我loginCallback註冊以當前用戶爲活躍,並確保用戶參考上斷開刪除:

var activeUsers = $firebase(rootRef.child('pages/' + pageId + '/users')).$asArray(); 
var rawUser = { 
    id: user.id, 
    displayName: user.displayName 
}; 
activeUsers.$add(rawUser).then(function (userRef) { 

    userRef.onDisconnect().remove(); 

}); 

我的火力地堡的這個特殊部分我的安全規則是這樣的:

{ 
    "rules": { 
    "sites": { 
     "$siteName": { 
     "pages": { 
      "$pageId": { 
      "users": { 
       // only users with firebase access can use this 
       ".read": "auth.firebase_user === true" 
       "$arrayId": { 
       // users can only write their own data 
       ".write": "auth.firebase_user === true && auth.id === newData.child('id').val()", 
       ".validate": "newData.hasChildren(['id', 'displayName'])" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

使用此安全配置和JS,當用戶斷開他們的引用不會從Firebase中刪除。但是,如果我使用這些安全規則,請改爲:

{ 
    "rules": { 
    "sites": { 
     "$siteName": { 
     "pages": { 
      "$pageId": { 
      "users": { 
       // only users with firebase access can use this 
       ".read": "auth.firebase_user === true", 
       ".write": "true", 
       "$arrayId": { 
       // users can only write their own data 
       //".write": "auth.firebase_user === true && auth.id === newData.child('id').val()", 
       ".validate": "newData.hasChildren(['id', 'displayName'])" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

在斷開連接時正確刪除用戶引用。

我已經嘗試了許多不同的安全規則和JS實現,但他們都基本上結束了這個問題。

有誰知道這裏是否有潛在的認證問題?用戶的身份驗證變量是否及時將其移至Firebase以正確移除用戶?

一些附註:我使用的是AngularFire,這基本上是一個用於查看誰在查看當前頁面的存在實現。

+1

這裏有一個有用的調試工具是在你的onDisconnect()。remove(/ * callback here * /)方法中加入一個回調,以便捕獲安全錯誤。 – Kato 2014-09-12 19:54:01

回答

0

想通了,看起來像安全規則,在那裏搞亂了我如何訪問Firebase中的對象。修改我的安全規則,看起來像這個:

{ 
    "rules": { 
    "sites": { 
     "$siteName": { 
     "pages": { 
      "$pageId": { 
      "users": { 
       ".read": "auth.firebase_user === true", 
       ".write": "auth.firebase_user === true", 
       "$arrayId": { 
       ".validate": "newData.hasChildren(['id', 'displayName']) && newData.child('id').val() === auth.id" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

現在火力用戶可以讀寫,但任何事情他們寫必須驗證規則相匹配。