帐户验证或密码重置令牌真的是独一无二的吗?

Has a account validation or password reset token really to be unique?

我必须创建一个电子邮件验证和密码重置系统,因此我需要一个令牌生成器。起初我认为这些令牌必须是严格唯一的但是当我检查数据库中的哈希(令牌)和电子邮件时我不明白为什么我不应该只使用足够长度的随机字符串而不附加 uniqid() 例如(这也很明显)。

我的这个假设是否正确?

不一定,它只需要对那个用户来说是独一无二的。

例如,作为密码重置的一部分,您可以要求提供用户名或电子邮件地址。在这方面,您的重置令牌只需要对该用户是唯一的。

此外,由于您不必在所有用户的已知良好令牌列表中查找令牌,因此速度要快得多。

例如,对于全球唯一的密码重置令牌,我要么必须使用一些额外的详细信息(例如用户信息)来将该令牌与其他令牌区分开来,要么我必须以某种方式搜索所有已知令牌。

使用唯一的 user/hash 代码,我只需验证为该用户提供的代码是否有效。相比之下,您通常会发现数组搜索,甚至哈希表查找也会花费更多时间。

例如,如果用户没有启动密码重置,则与启动密码重置相比,他们的内部用户可能看起来像这样。请注意,在此示例中,我们只允许一个最近的密码重置请求(不是多个):

User.getName() = "Bob"
User.getUserName() = "Bob5412"

User.resetPasswordRequestedTime() = null
User.resetPasswordToken() = null
or
User.resetPasswordRequestedTime() = 1482628217
User.resetPasswordToken() = "f7de43859d244439b101df4e02cc4e17"

现在我只需要检查令牌对请求的用户是否有效。再也不用担心"Globally unique"了。

在我的代码中,我可能会要求用户在 4 小时内完成任何密码重置请求,因此如果他们在此之后提出请求,我将忽略他们的请求而不检查任何内容。