【发布时间】:2018-06-23 01:08:00
【问题描述】:
我设置了一个服务器来验证用户登录,到目前为止,我能够成功验证用户并将他们重定向到成功页面(如果失败,也将他们重定向回登录页面)。但是,如果用户未登录,我不能使用我自己的快速中间件来限制用户,由于某种原因,我在中间件中的req.isAuthenticate() 签入始终是false。我觉得登录时我的会话信息没有存储,但我不确定。
这是我的设置(请注意,我使用 express-flash-2 而不是 connect-flash,因此是 req.flash())
在 server.js 中
// ...
var flash = require('express-flash-2');
var session = require('express-session');
var passport = require('passport');
// ...
server.use(session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true
}));
server.use(flash());
server.use(passport.initialize());
server.use(passport.session());
passport.use(auth_controller.authStrategy);
passport.serializeUser(auth_controller.authSerializer);
passport.deserializeUser(auth_controller.authDeserializer);
server.get('/maintenance_login', (req, res) => {
res.render('login');
});
server.post('/maintenance_login', passport.authenticate('local', {
successRedirect: '/maintenance',
failureRedirect: '/maintenance_login',
failureFlash: true
}));
// This does basically the same as above
// server.post('/maintenance_login', (req, res, next) => {
// passport.authenticate('local', function(err, user, info) {
// if (err) { return next(err); }
// if (!user) { return res.redirect('/maintenance_login'); }
//
// req.logIn(user, function(err) {
// if (err) { return next(err); }
// console.log('is authenticated?: ' + req.user); // this returns true
// return res.redirect('/maintenance');
// });
// })(req, res, next);
// });
server.get('/maintenance:query?', auth_controller.restrict, maintenance_controller.maintenance_list);
在 auth_controller.js 中
var passport = require('passport');
var LocalStrategy = require('passport-local');
var User = require('../models/user');
exports.authStrategy = new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, function (email, password, done) {
User.authenticate(email, password, function(err, user) {
// success message
// error message
done(err, user, err ? { message: err.message } : null);
});
});
exports.authSerializer = function(user, done) {
done(null, user.id);
};
exports.authDeserializer = function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
};
exports.restrict = function (req, res, next) {
console.log('is authenticated?: ' + req.isAuthenticated()); // This always returns false
if (req.isUnauthenticated()) {
res.flash('error', 'Access denied, please log in.');
return res.redirect('/maintenance_login');
}
return next();
}
再次,我的问题是,每当我成功登录时,我都会被踢回/maintenance_login,并且闪光灯显示"Access denied, please log in."。这意味着限制中间件中的req.isUnauthenticated() 返回true。
有什么想法吗?
【问题讨论】:
标签: javascript node.js express authentication passport.js