Javascript 使用jwt结构重置密码

Javascript 使用jwt结构重置密码,javascript,node.js,express,authentication,jwt,Javascript,Node.js,Express,Authentication,Jwt,我正在尝试编写身份验证应用程序的密码重置部分。我选择使用JWT、node.js和express,其中我使用以下逻辑:首先,用户输入他们的电子邮件,生成一个令牌,并通过密码重置链接发送到用户的邮件。第二,当用户按下链接时,会设置一个函数来检查令牌是否正确以及它是否仍然有效;第三,我有一个函数来将新密码保存到数据库中 我不确定的是应该检查代币的第二步。一些教程说,您应该将令牌保存到数据库中,然后将链接中的令牌与数据库中的令牌进行比较。但是,使用JWT不将任何内容保存到数据库作为引用,这难道不是重点吗

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

我不确定的是应该检查代币的第二步。一些教程说,您应该将令牌保存到数据库中,然后将链接中的令牌与数据库中的令牌进行比较。但是,使用JWT不将任何内容保存到数据库作为引用,这难道不是重点吗?我是否应该只使用jwt.verify来获取保存在令牌中的信息,然后检查数据库中的用户以及它是否仍然处于活动状态


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

有一个很好的建议。您可以使用当前存储的密码值的一些散列作为密码重置JWT的一部分

因此,有效负载可能包含
{sub:user\u id,exp:“now+10分钟”,purpose:“password\u reset”,key:hash(hash\u password\u from\u db).substr(0,6)}
。此令牌只能成功使用一次。

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

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

我在一家以测试和安全为重的公司工作。您的实现将不被允许。 规则是一次只能激活一个重置密码链接。

因此JWT代币不是我们的最佳选择

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

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

此方法的优点是一次只能有一个活动令牌


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

创建令牌时,您只需设置过期时间,然后在验证令牌是否有效时,无需将其保存到db。但是您需要保存生成和验证令牌所需的机密。是的,机密将保存在数据库中。但是,令牌不需要保存到数据库,只需要保存到标头?不,除非您需要添加黑名单以防止此令牌被多次使用,否则您不需要它。否则,当您验证它时,它将在过期或不正确时给出错误。客户端发送请求时,需要在标头中添加令牌,以便后端进行验证。可能存在重复,我希望您没有在数据库中存储密码。引用的文章建议使用已经散列的密码(在数据库中)作为密钥。让我修改一下。我的意思是散列用于签署JWT。我不确定您将
属性用于什么。我重命名了该字段以使其更清晰。
字段的要点是确保每个密码重置令牌只能精确重置密码一次。在任何成功重置之后,令牌都应该无效。