【问题标题】:Multi user password reset concurrency issue in NodeJS and ExpressJSNodeJS 和 ExpressJS 中的多用户密码重置并发问题
【发布时间】:2016-12-04 08:14:32
【问题描述】:

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

如何捕获通过电子邮件发送给特定用户的确切重置令牌作为链接?假设当两个用户尝试重置密码时,resetQueryParameter 将被覆盖。我该如何处理?

当用户点击邮件中的reset链接时,从查询参数中获取token:

// 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);
                }
            });
        }
    });
}

【问题讨论】:

  • 为什么不将req.query.token 传递给resetPassword 方法?
  • @Aruna req.query.token 仍然会以这种方式被覆盖
  • 在下面查看我的答案,您可以使用与其他名称相同的名称,例如 req.query.resetToken 等

标签: javascript node.js express


【解决方案1】:

在此处使用全局变量而不是在任何情况下都不是一个好习惯。

当您进行重定向时,您应该将req.query.token 传递给redirectResetPage,如下所示,

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

并让页面将相同的令牌传递回resetPassword 方法,并从request.queryrequest.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 令牌中。

【讨论】:

  • 我只是在想res.redirect(redirectResetPage + '?token=' + req.query.token);,但是可以在重定向中传递数据吗?我已经看到使用req.flash('token') 在重定向中传递数据的示例。我会试试你提到的,让你知道谢谢
  • 令牌本身是我正在使用的 jwt 令牌,并且在通过电子邮件将其发送给用户之前将其保存 rethinkdb
  • 您可以尝试上述重定向,在您的html中,您必须从客户端的查询字符串中获取它并将其传递给resetPassword方法
  • 它在重定向中正确传递了查询字符串,但无法在客户端将其取回。我在客户端使用 riotjs。无论如何,我会发布另一个问题。谢谢
  • 好的,发个链接给我,我看看
猜你喜欢
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2020-06-01
  • 2020-05-29
  • 1970-01-01
  • 2017-07-29
  • 2016-06-09
  • 2016-10-04
相关资源
最近更新 更多