Django 默认令牌生成器如何存储令牌?
我最近使用教程构建了一个基于Django的身份验证系统。在这个系统中,我在forms.py中创建了一个令牌。然后在激活邮件中发送此令牌(作为链接)Django 默认令牌生成器如何存储令牌?,django,django-authentication,Django,Django Authentication,我最近使用教程构建了一个基于Django的身份验证系统。在这个系统中,我在forms.py中创建了一个令牌。然后在激活邮件中发送此令牌(作为链接) from django.contrib.auth.tokens import default_token_generator token = default_token_generator.make_token(user) 接收get请求的视图匹配此链接中提供的令牌和用户id,并使用以下方法检查令牌: default_token_gener
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)
这将验证令牌是否已通过我的站点发送。但我不明白这个过程。令牌是唯一的,但我似乎没有将令牌保存在某个地方?那么,如何检查令牌()验证令牌呢?令牌由时间戳和HMAC值组成。HMAC是一个键控哈希函数:哈希使用一个密钥(默认情况下
设置。secret_key
)来获取唯一值,但无论是否使用该密钥,都不可能“取消哈希”
散列组合了四个值:
- 用户的主键
- 用户的哈希密码
- 用户的上次登录时间戳
- 当前时间戳
通过将用户的哈希密码和上次登录时间戳包含在哈希中,当用户登录或更改其密码时,令牌将自动失效。还将检查当前时间戳以查看令牌是否已过期。请注意,即使当前时间戳包含在令牌中(作为base36编码字符串),如果攻击者更改值,哈希也会更改,令牌将被拒绝。结果是,根本不需要存储它们,因为有效性可以从令牌本身计算出来。我意识到上一篇关于这个主题的文章已经发表了3年了,但是@knbk(或任何人)可以解释在这个场景中当前时间戳是如何使用的。例如,当创建初始哈希时,当发送重置密码电子邮件时,它将使用该时间点的当前时间戳。然后,当用户跟随链接并检查令牌时,它将是不同的时间点,因此,是不同的“当前时间戳”。或者我遗漏了什么?它会占用当前时间并从令牌中减去时间戳。然后,它确保结果小于过期值PASSWORD_RESET_TIMEOUT(以秒为单位)。默认值为60*60*24*3。