我最近使用教程构建了一个基于Django的身份验证系统。在这个系统中,我在forms.py中创建了一个令牌。然后,该令牌在激活激活邮件中发送(作为链接)。
from django.contrib.auth.tokens import default_token_generator
token = default_token_generator.make_token(user)
接收get请求的视图与此链接中提供的token和user-id匹配,并使用以下命令检查令牌:
default_token_generator.check_token(user, token)
此操作验证令牌是否通过我的网站发送。但我不明白这个过程。令牌是唯一的,但我似乎没有在某处保存令牌?那么check_token()
如何验证令牌?
答案 0 :(得分:7)
令牌由时间戳和HMAC值组成。 HMAC是一种键控散列函数:散列使用密钥(默认为settings.SECRET_KEY
)来获取唯一值,但无论是否使用密钥,“unhashing”都是不可能的。
哈希结合了四个值:
然后令牌由当前时间戳和这四个值的散列组成。前三个值已经在数据库中,第四个值是令牌的一部分,因此Django可以随时验证令牌。
通过在哈希中包含用户的哈希密码和上次登录时间戳,当用户登录或更改密码时,令牌会自动失效。还会检查当前时间戳以查看令牌是否已过期。请注意,即使当前时间戳包含在令牌中(作为base36编码的字符串),如果攻击者更改了值,散列也会更改,并且令牌将被拒绝。