default_token_generator如何存储令牌?

Xen*_*mar 4 django django-authentication

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

from django.contrib.auth.tokens import default_token_generator    
token = default_token_generator.make_token(user)
Run Code Online (Sandbox Code Playgroud)

接收get请求的视图与此链接中提供的标记和用户标识匹配,并使用以下命令检查标记:

default_token_generator.check_token(user, token)
Run Code Online (Sandbox Code Playgroud)

这将验证令牌是否通过我的网站发送.但我不明白这个过程.令牌是唯一的,但我似乎没有在某处保存令牌?那么如何check_token()验证令牌呢?

knb*_*nbk 8

令牌由时间戳和HMAC值组成.HMAC是一种键控散列函数:散列使用密钥(默认情况下settings.SECRET_KEY)来获取唯一值,但无论是否使用密钥,"unhashing"都是不可能的.

哈希结合了四个值:

  • 用户的主键.
  • 用户的哈希密码.
  • 用户的上次登录时间戳.
  • 当前时间戳.

然后令牌由当前时间戳和这四个值的散列组成.前三个值已经在数据库中,第四个值是令牌的一部分,因此Django可以随时验证令牌.

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

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