2013-05-15 119 views
1

在我的應用程序中,我想要一個「可讀取」 - 和一個「可寫入」視圖。當應用程序在沒有現有參數的情況下啓動(「第一次用戶」)時,將創建2個隨機哈希,並將其與Firebase應用程序祕密一起發佈到PHP FirebaseTokenGenerator以接收我的令牌。在Firebase中實施「讀取」和「寫入」安全規則

然後,我想這樣做:

  • 第一哈希(「讀哈希」)表示「匿名用戶」項
  • 第二哈希(「寫哈希」)表示「鍵」這是用戶進入

它看起來像這樣的孩子進入:

<appname> 
    users 
     <read_hash> 
      key 
       <write_hash> 
      [other user related data] 
       ... 

散列es可以用作URL參數,例如, 「myapp.com/#read_hash/write_hash」

我想實現的是:

  • 當用戶只有他read_hash(調用只是「myapp.com/#read_hash」),他應該是能夠看到他第一次輸入的所有條目(讓應用程序爲他創建write_hash /「鍵」)。但他不允許修改它們。
  • 當他提供write_hash(調用「myapp.com/#read_hash/write_hash」)時,允許寫入Firebase。

我的安全規則:

{ 
    "rules": { 
     "users": { 
      "$user": { 
       ".read": "$user == auth.read_hash", 
       ".write": "$user == auth.read_hash && root.child('users').child($user).child('key').val() == auth.write_hash" 
      } 
     } 
    } 
} 

我的問題是:如何存放首次write_hash沒有我的安全規則「.WRITE」防止寫作?

任何其他的想法如何實現這一目標?任何架構/不一致?

我使用這些庫:

  • 骨幹JS與骨幹-firebase.js
  • FirebaseTokenGenerator PHP提前

感謝。

+0

謝謝你的提示。雖然我的Firebase問題是基於另一個問題;但是您的評論幫助我完全解決了「寫入問題」。 – netzartist

回答

2

首先,我要指出,你應該永遠把火力地堡的祕密在你的應用程序。它應該始終安全地存儲在安全的服務器上。您的原始問題表明您將令牌從客戶端發送到服務器。

我建議讓read_hash與用戶id相同,然後在用戶第一次創建時在// key處存儲「key」。

然後我會提出一個規則的結構如下:

{ 
    "rules": { 
    "$userid": { 
     ".read": "$userid == auth.read_hash", 
     ".write": "!data.exists() || ($userid == auth.read_hash && data.child("key") == auth.write_hash)", 
    } 
    } 
} 
1

假設你已經寫哈希的關鍵(因爲你已經按照你的例子驗證的話),這將工作:

{ 
    "rules": { 
     "users": { 
      "$user": { 
       ".read": "$user == auth.read_hash", 
       "$key": { 
        ".write": "$user == auth.read_hash && $key === auth.write_hash" 
       } 
      } 
     } 
    } 
} 

如果需要獲取鍵之前創建哈希,對於一些奇怪的使用情況(可能性不大,但是這會給你一些關鍵的見解,以安全規則),你可以做這樣的事情:

".write": "$user == auth.read_hash && (!data.exists() || $key === auth.write_hash)"