无法重置多个用户的密码。当多个用户尝试重置密码时,我被卡住了
我如何捕获发送给电子邮件中特定用户的确切重置令牌作为链接?假设当两个用户尝试重置密码时,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));
}
});
});
});
在用户点击链接并验证签名时获取令牌:
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);
}
});
}
});
}
答案 0 :(得分:1)
在这里使用全局变量并不是一个好习惯,而不适用于任何场景。
当您进行重定向时,您应该将req.query.token
传递给redirectResetPage
,如下所示,
if (result.length > 0) {
res.redirect(redirectResetPage + '?token=' + req.query.token);
} else {
res.redirect(redirectLoginPage);
}
让页面将相同的令牌传递回resetPassword
方法并在request.query
或request.body
中使用,但不从全局变量中使用。
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令牌中。