使用Passport在Express中传递POST中的参数

时间:2017-11-04 02:18:36

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

我使用Express和Passport制作了一个小型登录应用程序。但似乎我无法将用户引导到特定的用户配置文件中。必须发生的是,用户填写HTML表单,并且必须将其重定向到他自己的个人资料页面(为简单起见,假设该页面仅在标题方面与其他用户页面不同)。我在我的用户路线中有这个。 (即routes / users.js)

router.get('/userprofile', authenticationMiddleware(), function (req, 
res, next) {
    res.render('userprofile');
});


router.post('/login', passport.authenticate('local-login', {
        successRedirect: '/users/userprofile',
        failureRedirect: '/users/login',
        failureFlash: true
}));

在我的passport.js配置文件中,我有这个。

passport.use('local-login', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallback: true
}, function (req, username, password, done) {
    db.pool.getConnection(function (err, connection) {
       if(err) throw err;
       var query = connection.query('SELECT * from users WHERE username = ?', username, function (err, rows) {
          if(err) return done(err);
          if(!rows.length) {
              return done(null, false, req.flash('loginMessage', 'No User Found'));
          }
          //Comparing passwords using bcrypt
           bcrypt.compare(password, rows[0].password, function(error, res){
               if(res){
                   return done(null, rows[0]);
               } else {
                   return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
               }
           });
       });
    });
}));

我需要做的是从表单中获取用户名,并将其传递给passport.authenticate中的successRedirect属性,然后我可以修改get方法,添加一个路由参数,如' / users /:username& #39;并呈现'用户名'图。

我该怎么做?

修改

我做了类似的事。

router.get('/userprofile/:username', authenticationMiddleware(), function (req, res, next) {
    res.render('userprofile', {
        username: req.params.username,
        title: 'Welcome, '+ req.params.username
    });
});


router.post('/login', function (req, res, next) { //Testing callback.
    console.log("Username is: " + req.body.username);
    passport.authenticate('local-login', {
        successRedirect: '/users/userprofile/' + req.body.username, 
        failureRedirect: '/users/login',
        failureFlash: true
    })(req, res);    
    next();
});

这适用于某些尝试。但是,它有时会返回此错误。

POST /users/login 404 43.741 ms - 5226 /home/dasun/WebstormProjects/schoolentry/node_modules/passport/lib/middleware/authenticate.js:249
      if (err) { return next(err)}; 

如何摆脱这个错误?

感谢。

1 个答案:

答案 0 :(得分:1)

找到答案。我在next路由中的POST方法中错过了/login

即。我应该写

router.post('/login', function (req, res, next) { //Testing callback.
console.log("Username is: " + req.body.username);
passport.authenticate('local-login', {
    successRedirect: '/users/userprofile/' + req.body.username, 
    failureRedirect: '/users/login',
    failureFlash: true
})(req, res, next);
});