Django 默认令牌生成器如何存储令牌?

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

我最近使用教程构建了一个基于Django的身份验证系统。在这个系统中,我在forms.py中创建了一个令牌。然后在激活邮件中发送此令牌(作为链接)

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
)来获取唯一值,但无论是否使用该密钥,都不可能“取消哈希”

散列组合了四个值:

  • 用户的主键
  • 用户的哈希密码
  • 用户的上次登录时间戳
  • 当前时间戳
然后,令牌由当前时间戳和这四个值的散列组成。前三个值已经在数据库中,第四个值是令牌的一部分,因此Django可以随时验证令牌


通过将用户的哈希密码和上次登录时间戳包含在哈希中,当用户登录或更改其密码时,令牌将自动失效。还将检查当前时间戳以查看令牌是否已过期。请注意,即使当前时间戳包含在令牌中(作为base36编码字符串),如果攻击者更改值,哈希也会更改,令牌将被拒绝。

结果是,根本不需要存储它们,因为有效性可以从令牌本身计算出来。我意识到上一篇关于这个主题的文章已经发表了3年了,但是@knbk(或任何人)可以解释在这个场景中当前时间戳是如何使用的。例如,当创建初始哈希时,当发送重置密码电子邮件时,它将使用该时间点的当前时间戳。然后,当用户跟随链接并检查令牌时,它将是不同的时间点,因此,是不同的“当前时间戳”。或者我遗漏了什么?它会占用当前时间并从令牌中减去时间戳。然后,它确保结果小于过期值PASSWORD_RESET_TIMEOUT(以秒为单位)。默认值为60*60*24*3。