2017-09-15 165 views
0

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

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) 

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

回答

2

令牌由时间戳和HMAC值组成。 HMAC是一种键控散列函数:散列使用一个密钥(默认为settings.SECRET_KEY)来获得唯一值,但是在使用或不使用密钥的情况下“散乱”是不可能的。

散列结合四个值:

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

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

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

+0

其结果是,根本不需要存储它们,因为可以从令牌本身计算有效性。 –