Django 在哪里存储生成的令牌。令牌链接?
Where does Django store generated tokens resp. token links?
我目前正在编写 Django 应用程序并且现在还包括电子邮件验证。
在这样做的过程中,我无耻地使用了 Djangos 的令牌生成器并将其滥用于我自己的目的。这是有效的,因为电子邮件验证的工作方式与密码重置非常相似:
- 用户在表单中输入他的数据
- 一封电子邮件已发送
- 用户点击散列link
- link验证用户的输入
但现在我问自己 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。
我目前正在编写 Django 应用程序并且现在还包括电子邮件验证。 在这样做的过程中,我无耻地使用了 Djangos 的令牌生成器并将其滥用于我自己的目的。这是有效的,因为电子邮件验证的工作方式与密码重置非常相似:
- 用户在表单中输入他的数据
- 一封电子邮件已发送
- 用户点击散列link
- link验证用户的输入
但现在我问自己 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。