使用jwt结构重置密码

时间:2018-06-18 19:56:37

标签: javascript node.js express authentication jwt

我正在尝试编写我的身份验证应用的密码重置部分。我选择使用JWT,node.js并表达我使用以下逻辑的地方:首先,用户输入他们的电子邮件并生成令牌并通过密码重置链接发送给用户的邮件。第二,当用户按下链接时,设置一个功能来检查令牌是否正确以及它是否仍然有效,第三个具有将新密码保存到数据库的功能。

我不确定的是应该检查令牌的第二步。有些教程说您应该将令牌保存到数据库中,然后将链接中的令牌与数据库中的令牌进行比较。但是,使用JWT不将任何内容保存到数据库作为参考不是重点吗?我不应该只使用jwt.verify来获取令牌中保存的信息,然后检查数据库中的用户是否仍然有效?

这是使用JWT的正确方法吗?或者你会建议我使用session而不是JWT吗?

2 个答案:

答案 0 :(得分:2)

使用 JWT 重置密码有一个简单的缺陷。 从您当前的实现来看,用户可以多次生成重置密码链接。因此,用户可以在给定时间内拥有多个有效的重置令牌。

是的,可以采用 JWT 无状态,但在这种情况下效率不高,因为您可以拥有多个令牌,即使在用户重置密码后(取决于你的方法)

我在一个将测试和安全性放在首位的组织工作。您的实施将不被允许。 规则是一次只能激活一个重置密码链接。

因此 JWT 令牌不是我们的最佳选择

所以我要做的是生成一个保存在数据库中的随机令牌(也是当前时间)。此令牌用于识别用户,时间用于验证用户是否在给定时间内重置。

当令牌处于活动状态时,如果用户决定再次生成令牌,则在生成新令牌之前,前一个令牌将变为非活动状态。

这种方法的优点是您一次只能拥有一个活动令牌。

最后,如果您不介意用户一次拥有多个活动令牌/链接,则应使用 JWT。

答案 1 :(得分:1)

this answer中有一个很好的建议。您可以将当前存储的密码值的一些哈希值用作密码重置JWT的一部分。

因此,有效负载可能包含var go = transform.Find("David").gameObject; 。此令牌只能成功使用一次。