2015-04-03 32 views
0

我瞭解Flask-login的方式是,一旦通過身份驗證,它就會設置一個cookie,其中包含隨每個請求一起發送的用戶ID,以便服務器可以將請求與(登錄)用戶。用戶ID幾乎被編碼爲用戶ID和一些瀏覽器設置(用戶代理,我認爲)的功能。使用flask-login確保單個用戶每個帳戶

由此產生了一些問題,也許有人可以對它們發表評論並提出解決方案。

  • 客戶端可以通過猜測用戶標識並使用相同的cookie編碼功能來請求內容(如果它僞裝成登錄用戶)。
  • 多個用戶可以在兩臺不同的計算機共享帳戶憑據時使用同一個用戶帳戶(我想限制這一點,但我想允許用戶在一臺計算機上打開同一會話的多個選項卡)。

我可以實現一個服務器端機制,該服務器端機制在身份驗證時生成一個隨機祕密令牌,並與用戶記錄一起存儲,併成爲會話cookie。我可以使用它來確保只有經過身份驗證的用戶纔可以在單臺機器上登錄(希望一臺機器上的多個選項卡仍在工作)。 flask-login是否已經包含這樣的方法,並且這通常是一個好方法來滿足我的需求?

+0

您可能想要將用戶限制在單個會話中,但我希望聽到我說:請不要。您應該將會話視爲基礎層(匿名用戶),然後用戶帳戶在登錄時鏈接到會話。臨時狀態應與會話關聯,而不是用戶帳戶。許多網上商店已經這樣做了:例如,每個會話中的購物車都是獨立的。要「轉移」購物車,許多網站都會讓您保存購物車並在任何會話中重新打開。 – sleblanc 2015-04-03 11:28:47

+0

除了在URL和認證會話中編碼的內容之外,我不必維護任何臨時狀態。這不適用於我的情況。 – orange 2015-04-03 13:56:18

回答

1

我最終做了我在我的問題中提出的建議。 (1)認證令牌將從會話cookie中提取,(2)該認證令牌的用戶是查詢,(3a)如果未發現訪問被禁止並且顯示登錄頁面,或者(3b) )返回請求的頁面。

當用戶登錄,而不是調用login_user,我叫

def login_user_with_secret_session(user, remember=False, force=False): 
    auth_session_token = random.getrandbits(128) 
    auth_session_token = '%032x' % auth_session_token 
    # store `auth_session_token` in user table 
    set_user_auth_session_token(user, auth_session_token) 
    return login_user(user, remember=remember, force=force) 

另一個修改是login_manager.id_attribute = 'get_auth_session_token'

class User(Base, UserMixin): 
    __table__ = user_table 

    ... 

    def get_auth_session_token(self): 
     return self.auth_session_token 

flask-login返回認證令牌訪問。

2

我還沒有經過Flask-login's source,但正如你所說它使用Flask會話對象,這意味着Flask登錄的這部分是安全的,因爲session cookie is cryptographically signed to protect against forgery。 Flask稱之爲「SecureCookie支持的會話」。數據沒有加密,但是由於它已被簽名,用戶可能不會對其進行修改。

這有一定的優勢:

  • 存儲實際會話的負擔轉移到客戶端。無需將會話存儲在數據庫中。如果你有許多匿名用戶並需要存儲非臨界狀態,那將是非常好的。
  • 它應該是安全的
  • 通過使用瀏覽器擴展,或手動的,用戶可以從一個設備轉移他們的會話到另一個

但也有一些缺點:

  • 其他數據來回傳送
  • 如果用戶清除緩存,則會丟失所有會話數據。如果他們的設備崩潰,則相同。
  • 給定足夠的時間,因爲攻擊者可以訪問多個消息及其簽名,所以理論上可以通過暴力猜測猜測您的密鑰。

確保您的SECRET_KEY足夠強大。

+0

哦,這是個好消息。所以安全的cookie支持的會話至少緩解了我的第一點(仍然可以複製編碼的cookie並在另一臺機器上使用它)。缺點不是問題; (1)足跡最小,(2)這是預期的行爲,並且用戶可以預期再次登錄,(3)這也適用於任何其他加密方法。 – orange 2015-04-03 14:01:59

相關問題