2017-07-06 132 views
1

看起來像Firebase,當他們從v2遷移到v3.x SDK(現在變成v4)時,決定刪除自動會話過期選項,以支持始終通過身份驗證的模型。Firebase會話過期

這是一個很好的功能提供,但是從網絡安全的角度來看,我看到了一些問題,因爲這是唯一的選項的火力地堡的SDK與Firebase-生成的令牌,如email and password authentication(其中一些在鏈接的谷歌小組討論中有很好的解釋)。

在頁面退出時通常提供的調用user.signOut()的建議有一些漏洞。也就是說,如果客戶端崩潰,那麼這個代碼就不會執行,因此這個策略就會崩潰。在「上登出頁面加載」的建議也有孔在它:

  1. 強制所有用戶每次登錄的時候頁面加載/重載(不是目標)
  2. 作爲火力地堡推動大多數都到客戶端有什麼能夠阻止某人創建試圖訪問一個有針對性的火力地堡一個腳本,而不具有user.signOut()

我正在尋找一個戰略,做一個更好的工作,從網絡安全的角度,允許用戶如果願意的話可以選擇「永久認證」策略選擇,而不是默認(即用「記住我」按鈕)。我想出了

一種策略是如下:

    1. 用戶登錄獲取生成JWT該會議,並把它寫到火力
    2. 如果用戶沒有選擇「記住我「在登錄時設置了一個onDisconnect處理程序,該處理程序從該用戶令牌的列表中清除令牌
    3. 在Firebase安全規則中,確保發出請求的用戶的JWT位於該用戶的令牌列表中

    這樣感覺更安全,因爲即使瀏覽器崩潰,onDisconnect方法仍會執行。 但是,JWT不可用作Firebase規則變量(only the contents of the token)!

    鑑於這些問題/有缺陷的方法,如何在瀏覽器使用Firebase生成的令牌關閉/崩潰(甚至在預定的時間段後)後使會話失效?

  • 回答

    2

    這是一個建議: ID令牌有一個auth_time字段。這是用戶認證的時間,你可以強制你想要的任何會話長度。如果您使用https://firebase.google.com/docs/reference/security/database/#now和auth.token.auth_time驗證服務器上的令牌或通過數據庫規則執行此操作。檢查https://firebase.google.com/docs/reference/security/database/#authtoken

    您需要用戶重新認證才能訪問數據。重新認證將更新令牌中的auth_time。

    這是一種更好的方法,因爲跟蹤所有ID令牌不會很好地擴展,ID令牌會在一小時後過期,並且新用戶在用戶返回應用後將刷新,但會保持相同的auth_time。

    不知道這是否會減輕你的問題,但火力地堡正在考慮以下特點:

    1. 到Web認證指定持久性的能力。這與在Firebase 3.x中sessionOnly auth的工作方式類似。這將使「記住我」功能易於實現。
    2. 撤銷會話的能力。
    +0

    嘿@bojeil,謝謝你的建議。我認爲在多租戶方案中存在一些邊緣案例(用戶可能會通過更新'auth_time'在不知不覺中「擴展」登錄到同一帳戶的其他用戶的會話),但這是一個體面的解決方案。這些其他功能的任何時間表? :) – MandM

    +0

    您是指「用戶可能無意中」通過更新auth_time擴展「登錄到同一帳戶的其他用戶的會話」。 auth_time僅在重新認證或登錄時更新。目前沒有針對這些功能的可靠時間表。 – bojeil

    +0

    我寫了關於用戶A和用戶B從不同機器登錄的完整解釋,一個基本上更新另一個機器的'auth_time',但後來意識到我很愚蠢,因爲'auth_time'不是共享的,因爲它是一個部分的個人智威湯遜。謝謝!要考慮的另一個功能是允許通過電子郵件和密碼身份驗證來定製JWT聲明定義,而不是要求單獨的服務器。 – MandM