登录路由重定向到索引路由,但未在任何地方指定,只有单个中间件

时间:2018-08-09 01:45:01

标签: node.js express passport.js passport-local

我有一个登录路线,该路线使用本地护照和名为login的自定义护照策略。当我向/login发送发布请求时,它收到了请求,然后重定向到/索引路由。这只能由我的isUnauthenticated中间件引起。

我的护照策略出了些问题,但我不确定它出了什么问题。我知道它不是在登录用户,但不确定原因。没有堆栈跟踪或任何内容,此时我的基本日志记录仅显示了被命中的路由及其状态代码。

如果删除身份验证中间件,我只会得到登录路由,并且不会超时,不会返回任何错误。

是未经身份验证的中间件

exports.isUnauthenticated = function(req, res, next) {
  if (!req.isAuthenticated()){
    return next();
  }

  res.redirect('/');
};

登录路线

app.post('/login', isUnauthenticated, sessions.postLogin);

sessions.postLogin

exports.postLogin = (req, res, next) => {
    passport.authenticate('login', {
        successRedirect : '/profile',
        failureRedirect : '/login', 
        failureFlash : true 
    })
};

护照策略

passport.use('login', new LocalStrategy({
      usernameField: 'email',
      passReqToCallback : true
    },
    function(req, email, password, done) {

      User.findOne({ 'email' :  email },
        function(err, user) {
          if (err) return done(err);
          if (!user){
            return done(null, false, req.flash('error', 'User not found'));
          }
          user.comparePassword(password, function(err, isMatch) {
            if(err){
              console.log(err);
            }
            if (isMatch) {
              // Make sure the user has been verified
              if (!user.isVerified) return done (null, false, req.flash('error', 'Your account has not been verified.' ));
              var time = 14 * 24 * 3600000;
              req.session.cookie.maxAge = time; //2 weeks
              req.session.cookie.expires = new Date(Date.now() + time);
              req.session.touch();
              return done(null, user, req.flash('success', 'Successfully logged in.'));
            } else {
              return done(null, false, req.flash('error', 'Invalid Password'));
            }

          });
        }
      );
    })
  );

1 个答案:

答案 0 :(得分:0)

我通过在(req, res, next);控制器的末尾添加session.postLogin来解决此问题。新的session.postLogin看起来像这样:

exports.postLogin = (req, res, next) => {
    passport.authenticate('login', {
        successRedirect : '/profile',
        failureRedirect : '/login', 
        failureFlash : true 
    })(req, res, next);  <-- this was what I needed to add. Not sure why though. 
};