Passport从不将用户链接到会话

时间:2015-01-27 20:33:19

标签: node.js express passport.js

我试图弄清楚为什么Passport无法初始化用户会话(登录后,req.isAuthenticated()总是失败):

1) Passport永远不会进入passport.serializeUserpassport.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: {} 
}

我重新检查了我的配置一百次,但我无法弄清楚我做错了什么。

2 个答案:

答案 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);
  });
});