【问题标题】:How does default_token_generator store tokens?default_token_generator 如何存储令牌?
【发布时间】:2017-09-15 08:00:43
【问题描述】:

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

【问题讨论】:

    标签: django django-authentication


    【解决方案1】:

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

    哈希结合了四个值:

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

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

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

    【讨论】:

    • 这样的结果是,根本不需要存储它们,因为可以从令牌本身计算有效性。
    • 我意识到距离上一篇关于这个主题的帖子已经过去了 3 年,但也许@knbk(或任何人)可以解释在这种情况下如何准确地使用当前时间戳。例如,当创建初始哈希时,当发送重置密码电子邮件时,它将使用该时间点的当前时间戳。然后,当用户点击链接并检查令牌时,它将是不同的时间点,因此是不同的“当前时间戳”。还是我错过了什么?
    • 获取当前时间并从令牌中减去时间戳。然后它确保结果小于以秒为单位的过期值 PASSWORD_RESET_TIMEOUT。默认值为 60*60*24*3。
    猜你喜欢
    • 2019-04-29
    • 2018-06-24
    • 2013-07-11
    • 2019-02-01
    • 2016-02-18
    • 2021-01-14
    • 2019-08-02
    • 2019-02-20
    • 2013-08-05
    相关资源
    最近更新 更多