Django 在哪里存储生成的令牌。令牌链接?

Where does Django store generated tokens resp. token links?

我目前正在编写 Django 应用程序并且现在还包括电子邮件验证。 在这样做的过程中,我无耻地使用了 Djangos 的令牌生成器并将其滥用于我自己的目的。这是有效的,因为电子邮件验证的工作方式与密码重置非常相似:

但现在我问自己 Django 将这些标记或 link 存储在哪里? settings里面有一个过期值(PASSWORD_RESET_TIMEOUT) but as I look up the generator(PasswordResetTokenGenerator),只是用来比较的

这让我想到了一个问题:Django 将这些 link 存储在哪里?它们会过期吗?如果我生成一个帐户并且从不点击电子邮件会怎样 link?

PasswordResetTokenGenerator 生成的令牌不会存储在任何地方。令牌 本身 中有一个时间戳。如果我们查看制作token的source code [GitHub]方法,它的实现是:

def _make_token_with_timestamp(self, user, timestamp):
    # timestamp is number of seconds since 2001-1-1. Converted to base 36,
    # this gives us a 6 digit string until about 2069.
    ts_b36 = int_to_base36(timestamp)
    hash_string = salted_hmac(
        self.key_salt,
        self._make_hash_value(user, timestamp),
        secret=self.secret,
        algorithm=self.algorithm,
    ).hexdigest()[::2]  # Limit to shorten the URL.
    return "%s-%s" % (ts_b36, hash_string)

此处传递给方法的值 timestamp 是当前时间戳,您可以看到它使用此时间戳和一些用户数据本身(用户 pk、散列密码)生成 hash_string ,上次登录时间戳,电子邮件),如果这些值中的任何一个发生更改,我们的令牌将变为无效。最后你可以看到它 returns "%s-%s" % (ts_b36, hash_string) 这只是一个 <timestamp>-<hash_string> 形式的字符串。所以当我们从用户那里收到令牌时,检查它就像检查时间戳是否不太旧一样简单,取时间戳,用户对象(我们从 other 参数中获取我们收到 uidb64) 并重新计算 hash_string 并检查它们是否匹配。

所以这些 link 不会存储在任何地方,是的,它们会过期,如果您生成一个帐户并且从不使用 link,它将过期并且您无法使用它,如果您愿意,可以允许用户通过编写更多代码来生成新的 link。