5

我使用的是Firebase 3. 編寫Firebase規則時,auth對象只包含uid和提供者。有沒有什麼方法可以增強這個功能來提供電子郵件地址?訪問Firebase規則中的電子郵件地址

我試圖解決的問題是,我正在處理的網站的所有者想根據他們的電子郵件地址來授予用戶權限,因爲他不會預先知道他們的firebase。

我已經看到了解決方案,建議將用戶對象保存在firebase(使用電子郵件),然後將其用作規則中的參考點。 我可以看到的問題是,如果有人知道具有完全權限的用戶的電子郵件地址,那麼在保存到Firebase之前調試代碼並操作電子郵件地址會相當容易,這意味着它將保存它們Firebase ID與其他人的電子郵件地址一起。

爲了安全起見,我唯一能看到的方法是在firebase規則中的auth對象中提供電子郵件地址,這些地址不能被黑客入侵。

我錯過了什麼嗎?


更多信息


的想法是,我們可以通過添加位置名用戶的電子郵件地址,控制訪問某個具體位置的數據:

  1. 用戶是由網站管理員手動提前創建,提供對數據子集的訪問。 e.g
-users 
    -user1Email 
    -locations 
     -someLocation:true 
     -someOtherLocation:true 
  • 用戶通過谷歌認證。在客戶端,我們可以看到在auth.user.email

  • 他們的電子郵件地址,在規則,我要像做

  • locations : { 
        "$location": { 
         ".read": "root.hasChild('users/' + auth.email + '/locations/' + $location)", 
        } 
    } 
    

    我知道我需要逃避的電子郵件地址,只是爲了保持現在簡單。

    我已經在模擬器中測試過了,如果我使用自定義提供程序並在其中提供電子郵件,但它在規則中僅使用uid和提供程序屬性,而不使用電子郵件,但它完美地工作。

    替代方案(除使用自定義提供者之外)是允許用戶先創建自己的帳戶,然後將位置添加到每個用戶使用他們的uid作爲關鍵字而不是他們的電子郵件地址,但所有者想要以便能夠提前設置它,以便他們第一次馬上登錄它的話。

    +0

    你能描述一下你正在處理的確切用例嗎?你是什​​麼意思,「他不會預先知道他們的火爐基地」?用戶在嘗試做任何你期望的事情時會被認證嗎? – adolfosrs

    +0

    抱歉花了我一秒來很好地格式化代碼,但現在應該可讀。 – John

    +0

    電子郵件地址現在在安全規則中的'auth'變量中經常可用。查看http://stackoverflow.com/questions/37986097/how-can-we-guarantee-that-the-email-saved-by-the-firebase-user-is-indeed-his-own –

    回答

    1

    火力地堡隊仍在努力提供給auth對象的電子郵件,你可以在你的規則使用auth.token.email一定的侷限性找到它。請參閱this post以獲取更多詳細信息。

    如果當前的Firebase解決方案無法滿足您的所有需求,則可以選擇一些解決方法。

    既然你要保持你的當前/users結構你可以,只要註冊一個新用戶,連接用戶的UID相應的電子郵件在一個新的分支/user_emails將簡單地存儲$uid: email。那麼你的規則將如下所示。

    "user_emails": { 
        "$uid": { 
         ".write": "auth.uid == $uid", 
         ".validate": "!root.child('Users').hasChild(newData.val())" 
        } 
        }, 
        "locations": { 
        "$location": {  
         ".read": "root.hasChild('users/' + root.child('user_emails').child(auth.uid).val() + '/locations/' + $location)" 
        } 
        } 
    

    請記住,你將需要提高他們確保只有正確的用戶將能夠編輯這個新user_emails分支。

    +0

    當你說鏈接用戶uid到相應的電子郵件,你的意思是手動做。或在用戶登錄後以編程方式? 如果以編程方式,我認爲這不會解決安全問題,因爲該代碼可能會被惡意調用,從而提供已知具有完全訪問權限的用戶的電子郵件地址。然後,新的Firebase ID將鏈接到具有完全訪問權限的用戶。 如果手動,那麼它仍然意味着我們必須讓用戶無需登錄才能登錄,然後手動添加它們,這正是我試圖避免的。 – John

    +0

    @John使用firebase規則,您將確保用戶能夠編輯的唯一分支是其uid作爲關鍵字的分支。剛剛添加了一個可以添加到'/ user_emails'分支的示例規則。 – adolfosrs

    +0

    @John是的。我的意思是編程式。無論何時你向'/ users'註冊一個新用戶,調用'createUser'或者任何你應該確保在回調中調用類似'ref.child(uid).set(email)'的東西。 – adolfosrs