我最近使用教程构建了一个基于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)


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

最佳答案

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

哈希值结合了四个值:


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


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

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

关于django - default_token_generator如何存储 token ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46234627/

10-12 00:14
查看更多