default_token_generator如何存储令牌?

时间:2017-09-15 08:00:43

标签: django django-authentication

我最近使用教程构建了一个基于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()如何验证令牌?

1 个答案:

答案 0 :(得分:7)

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

哈希结合了四个值:

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

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

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