我有一个登录路线,该路线使用本地护照和名为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'));
}
});
}
);
})
);
答案 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.
};