【问题标题】:PassportJS / Forgot password : req.user undefined only oncePassportJS / 忘记密码:req.user 仅未定义一次
【发布时间】:2016-05-12 07:15:04
【问题描述】:

经过两天的谷歌搜索,我终于发布了我的第一个问题:

我尝试在我的 NodeJSExpress、以下网站中实现忘记密码功能:http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/

问题是,在 app.post('reset/:token') 路由中,req.user 是未定义的,但它是我的代码中唯一未定义的地方!

我认为它可能来自“唯一链接”类型的路线,但不确定也不知道如何解决这个问题。

.ejs 操作中的表单也为“reset/:token”。

这样resetPasswordToken输入新密码后就找不到了..

app.get('/reset/:token', function(req, res) {
    user.findOne({
        resetPasswordToken: req.params.token,
        resetPasswordExpires: {
            $gt: Date.now()
        }
    }, function(err, user) {
        if (!user) {
            req.flash('error', 'Password reset token is invalid or has expired.');
            return res.redirect('/forgot');
        }
        res.render('./pages/reset.ejs', {
            username: req.user
        });
    });
});

app.post('/reset/:token', function(req, res) {
    async.waterfall([
        function(done) {
            console.log('user: ' + req.user);
            user.findOne({
                resetPasswordToken: req.params.token,
                resetPasswordExpires: {
                    $gt: Date.now()
                }
            }, function(err, user) {
                if (!user) {
                    req.flash('error', 'Password reset token is invalid or has   expired.');
                    return res.redirect('back');
                }

                user.password = req.body.password;
                user.resetPasswordToken = undefined;
                user.resetPasswordExpires = undefined;

                user.save(function(err) {
                    req.logIn(user, function(err) {
                        done(err, user);
                    });
                });
            });
        },
        function(user, done) {
            var mailOptions = {
                to: user.email,
                from: 'passwordreset@demo.com',
                subject: 'Your password has been changed',
                text: 'Hello,\n\n' +
                    'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n'
            };
            smtpTransport.sendMail(mailOptions, function(err) {
                req.flash('success', 'Success! Your password has been changed.');
                done(err);
            });
        }
        `enter code here`
    ], function(err) {
        res.redirect('/');
    });
});

这实际上是我在这里的第一篇文章,抱歉缩进不好..

【问题讨论】:

    标签: javascript node.js mongodb express passport.js


    【解决方案1】:

    实际上,此页面上的 req.user 应该为空,因为您未通过身份验证(您正在修改密码以登录),并且 req.user(护照文档)包含他通过身份验证时的用户。

    【讨论】:

    • 非常感谢安东尼的回答,问题是 user.findOne 不起作用。它可能来自 req.params.token 当我 console.log 时返回“ :token ”。如何获得令牌?
    • 你能给我更多的信息吗?在帖子或您的获取链接上?因为应该生成您的令牌并将其发送到电子邮件中给用户。因此,当用户单击电子邮件时,它将具有如下链接: localhost:8000/reset/wrotesomething -> 这里我的 req.params.token 将被写入。看看我做的样板,它可能会帮助你理解非常相似的系统:github.com/haukka/sequelize-express-passport也许你会在上面找到你的答案(在剧目路线,文件索引中)对不起,你会发现一些法语文本。
    【解决方案2】:

    终于成功了,是来自reset.ejs表单动作,

    一切都在这里解释:NodeJS not able to get token value from req.params.token

    【讨论】:

      猜你喜欢
      • 2021-08-16
      • 2015-11-02
      • 2017-05-31
      • 2012-07-25
      • 2018-11-13
      • 2015-12-21
      • 1970-01-01
      • 2018-02-23
      • 2021-09-08
      相关资源
      最近更新 更多