我试图弄清楚为什么Passport无法初始化用户会话(登录后,req.isAuthenticated()
总是失败):
1) Passport永远不会进入passport.serializeUser
或passport.deserializeUser
:
passport.serializeUser(function(user, callback) {
callback(null, user._id);
});
passport.deserializeUser(function(id, callback) {
User.findById(id, function(err, user) {
if (!err) callback(null, user);
else callback(err, null);
});
});
2)我创建的本地策略有效:passport.authenticate
可以访问用户对象,并且不会抛出任何错误:
app.post('/login', function (req, res, next) {
passport.authenticate('local-login', function(err, user, message) {
// No errors here, always access to the correct user object
})(req, res, next);
});
3)我的配置:
var express = require('express');
var router = express.Router();
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
router.use(cookieParser('secret'));
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: true }));
var session = require('express-session');
var passport = require('passport');
router.use(session({
secret: config.secrets.session,
saveUninitialized: true,
resave: true,
cookie: {
maxAge: 3600000,
secure: (config.env === 'production')
}
}));
router.use(passport.initialize());
router.use(passport.session());
在向/login
发出POST请求后,req.isAuthenticated()
始终报告为否定。检查控制台时,仅创建Express会话cookie(connect.sid)。将req.session
记录到控制台(直接在app.post('/login'....) {
之后)给出:
{ cookie:
{ path: '/',
_expires: Tue Jan 27 2015 22:30:18 GMT+0100 (CET),
originalMaxAge: 3600000,
httpOnly: true,
secure: false },
passport: {}
}
我重新检查了我的配置一百次,但我无法弄清楚我做错了什么。
答案 0 :(得分:-1)
我在搜索解决方案时遇到了完全相同的问题。 你的cookie没有被设置我在开发中将session.cookie.secure改为false并且工作正常。
var sess = {
secret: 'keyboard cat',
resave: false,
saveUninitialized: false,
cookie: { secure: false}
}
if (app.get('env') === 'production') {
sess.cookie.secure = true // serve secure cookies
}
app.use(session(sess))
答案 1 :(得分:-3)
@jroeleveld,我建议您查看以下代码,并在http://passportjs.org/guide/configure/上提供更多配置代码
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});