2015-01-27 3 views
0

Я пытаюсь выяснить, почему паспорт не удается инициализировать сеанс пользователя (после входа в систему, req.isAuthenticated() всегда терпит неудачу):паспорт никогда не связывает пользователя к сеансу

1) паспорт никогда не попадает в 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()); 

После выполнения запроса POST к /login, req.isAuthenticated() всегда сообщает отрицательны. При проверке консоли создается только куки-файл Express session (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

Вы уверены, что не находитесь в производственной среде, понимаемой вашим конфигурационным модулем? – Paul

+0

Да, я дважды проверил его, но он настроен на разработку. – jroeleveld

ответ

-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); 
    }); 
}); 
+0

Эй, Эмиль, это именно тот код, который я написал в верхней части моего сообщения; не можете найти ошибку в этом? – jroeleveld

-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)) 
+0

Вышеприведенный код уже проверяет среду; безопасные файлы cookie разрешены только на производстве – jroeleveld

Смежные вопросы