Passport.js 在 Express 4.11.1 中,它不会写入 session.passport

Passport.js in Express 4.11.1, it does not write into the session.passport

我在使用 passport.js 和 express 4.11.1

时遇到了一个小问题

下面是我的app.js

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
function(username, password, done) {

    if(username == '1' && password == '1') {
        var user = {username: 'test',id: 123,firstName: 'test'};
        return done(null, user);
    } else {
        return done(null, false, {message: 'Incorrect username or password'});
    }
}
));

passport.serializeUser(function(user, done) {
    done(null, user);
});

passport.deserializeUser(function(username, done) {
    var user = {
        username: 'test',
        id: 123,
        firstName: 'test'
    };
   done(null, user);
});

module.exports = passport;

然后我修改了我的 app.js,添加了中间件

var passport = require('./auth');
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true,
    cookie: { secure: true }
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());

最后我在router中定义:

var passport = require('../auth');

router.get('/login', function (req, res, next) {
    res.render('login', {title: 'Login', message: ''});
});
router.post('/login',
    passport.authenticate('local',
        {
            successRedirect: '/user2',
            failureRedirect: '/login'
        }));
router.get('/user2', function(req, res) {
    console.log(req.session.passport);
    if(req.session.passport.user === undefined) {
        res.redirect('/login');
    } else {
        res.render('user2', {title: 'Welcome!', user: req.user});
    }
});

现在我发现的问题是我可以成功登录,但是当我尝试打印出来时req.session.passport,我发现会话中的护照对象是{}。我想可能是因为 passport.serializeUser 函数没有真正起作用,但是当我尝试打印出传递给 passport.serializeUser 函数的用户对象时,它有值。有人可以帮我调查这个问题吗?提前致谢。

你的代码看起来不错,除了这部分:

app.use(session({
   secret: 'secret',
   resave: true,
   saveUninitialized: true,
   cookie: { secure: true }   <<<<<<<<<<
}));

docs 说您在使用 https 时应该使用安全 cookie,因此排除该字段应该可以解决您的问题。

secure boolean marks the cookie to be used with HTTPS only.