2017-09-15 166 views
0

我最近使用教程構建了一個基於Django的認證系統。在這個系統中,我在forms.py中創建了一個令牌。然後這個令牌在激活激活郵件中發送(作爲鏈接)。default_token_generator如何存儲令牌?

from django.contrib.auth.tokens import default_token_generator  
token = default_token_generator.make_token(user) 

接收GET請求在這個環節上提供的令牌和用戶ID相匹配,並檢查使用令牌的觀點:

default_token_generator.check_token(user, token) 

這驗證令牌雖然我的網站發送。但我不明白這個過程。令牌是唯一的,但我似乎並沒有將令牌保存在某處?那麼check_token()如何驗證令牌?

回答

2

令牌由時間戳和HMAC值組成。 HMAC是一種鍵控散列函數:散列使用一個密鑰(默認爲settings.SECRET_KEY)來獲得唯一值,但是在使用或不使用密鑰的情況下「散亂」是不可能的。

散列結合四個值:

  • 用戶的主鍵。
  • 用戶的哈希密碼。
  • 用戶上次登錄的時間戳。
  • 當前時間戳。

令牌由當前時間戳和這四個值的散列組成。前三個值已經在數據庫中,第四個值是令牌的一部分,因此Django可以隨時驗證令牌。

通過在散列中包含用戶的散列密碼和上次登錄時間戳,當用戶登錄或更改其密碼時,令牌會自動失效。還會檢查當前時間戳以查看令牌是否已過期。請注意,即使當前時間戳包含在令牌中(作爲base36編碼的字符串),如果攻擊者更改該值,哈希也會更改,並且令牌被拒絕。

+0

其結果是,根本不需要存儲它們,因爲可以從令牌本身計算有效性。 –