【问题标题】:Passport.js in Express 4.11.1, it does not write into the session.passportExpress 4.11.1 中的 Passport.js,它不会写入 session.passport
【发布时间】:2015-02-09 11:57:45
【问题描述】:

在 express 4.11.1 中使用 passport.js 时遇到了一个小问题

下面是我的 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());

最后,我在路由器中定义了:

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 时,我发现 session 中的护照对象是 {}。我想可能是因为 passport.serializeUser 函数并没有真正起作用,但是当我尝试打印出传递给 passport.serializeUser 函数的用户对象时,它具有值。有人可以帮我研究这个问题吗?提前致谢。

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

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

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

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

    安全布尔值将 cookie 标记为仅与 HTTPS 一起使用。

    【讨论】:

    • 您好,我尝试了您的建议。好像还是不行……我在想,当函数passport.serializeUser运行时,它应该把用户对象写入session.passport,对吗?
    • 对不起伙计,我认为你是对的!我在我的办公室电脑上试过,它可以工作。我今天晚些时候再试试我的家用电脑。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    相关资源
    最近更新 更多