NodeJS和ExpressJS中的多用户密码重置并发问题

无法为多个用户重置密码。 当多个用户尝试重置密码时,我卡住了

我如何捕获发送给电子邮件中特定用户的确切重置令牌链接? 比方说,当两个用户试图重置密码, resetQueryParameter将被覆盖。 我该如何处理?

当用户点击电子邮件中的重置链接时,从查询参数中获取令牌:

 // global variable var resetQueryParameters = ''; //CAPTURE TOKEN (QUERY PARAMS) FROM LINK app.get('/resetQuery/', function (req, res) { //SET THE TOKEN TO VARIABLE resetQueryParameters = req.query.token; r.db('myDB').table('Reset_Password').filter(r.row('auth_key').eq(req.query.token)). run(myConnection, function (err, cursor) { if (err) { return next(err); } cursor.toArray(function (err, result) { if (err) { throw err; } else { if (result.length > 0) { res.redirect(redirectResetPage); } else { res.redirect(redirectLoginPage); } return result; console.log("printing reset link from db.....", JSON.stringify(result, null, 2)); } }); }); }); 

当用户点击链接并validation签名时获取令牌:

 function resetPassword(req, res, next) { console.log('reset password called from external link.....'); nJwt.verify(resetQueryParameters, secretKey, function (err, verifiedJwt) { if (err) { console.log('reset token not valid...', err); } else { var params = { 'username': verifiedJwt.body.details, 'newPassword': req.params.newPassword }; getApiResponse(resetURL, params, function (res1) { console.log('sending reset params to server...', params); if (res1.error) { console.log('Could not reset password......', res1.error); } else { console.log('reset password success.....'); resetQueryParameters = ''; res.json(res1); } }); } }); } 

在这里使用全局variables并不是一个好习惯,不适用于任何场景。

当你做redirect的时候,你应该把req.query.token传递给下面的redirectResetPage

 if (result.length > 0) { res.redirect(redirectResetPage + '?token=' + req.query.token); } else { res.redirect(redirectLoginPage); } 

并让页面传递给resetPassword方法,并从request.queryrequest.body使用它,而不是从全局variables中使用它。

 function resetPassword(req, res, next) { console.log('reset password called from external link.....'); nJwt.verify(req.query.token, secretKey, function (err, verifiedJwt) { if (err) { console.log('reset token not valid...', err); } else { var params = { 'username': verifiedJwt.body.details, 'newPassword': req.params.newPassword }; getApiResponse(resetURL, params, function (res1) { console.log('sending reset params to server...', params); if (res1.error) { console.log('Could not reset password......', res1.error); } else { console.log('reset password success.....'); resetQueryParameters = ''; res.json(res1); } }); } }); } 

注意:最好的做法是将这个令牌存储在数据库中,如果可能的话,或者将它存储在cookie / jwt令牌中。