2015-07-04 3 views
0

Я смог так долго регистрировать пользователей в использовании Facebook. Однако, как только я восстанавливаю информацию из Facebook, я ее теряю.Экспресс 4 и паспорт не удается создать сеанс

Я не знаю, должен ли я быть тем, кто создает сеанс, или я что-то упускаю.

Это то, что я сделал: Конфигурация

var passport = require('passport'); 
passport.use(
    new FacebookStrategy(
    { 
     clientID: FACEBOOK_APP_ID, 
     clientSecret: FACEBOOK_APP_SECRET, 
     callbackURL: 'http://localhost:8080/auth/facebook/callback' 
    }, 
    function(accessToken, refreshToken, profile, done) { 
     process.nextTick(function() { 
     //Assuming user exists 
     console.log("CALLBACK passport.use", profile); 
     return done(null, profile); //SHOWS THE USER 
     }); 
    } 
) 
); 

сериализации и десериализации, как console.log правильно показать пользователю

passport.serializeUser(function(user, done) { 
    console.log("SERIALIZE USER", user) 
    done(null, user); //SHOWS USER 
}); 

passport.deserializeUser(function(obj, done) { 
    console.log("DESERIALIZE USER", obj) 
    done(null, obj); //SHOWS USER 
}); 

Внутри кластера (1 из 4), он правильно делает переадресацию до /success. Однако, console.log контроллера success отображается неопределенный. Я попытался без кластеров, и этот вопрос остается тем же самым ...

else if (!cluster.isMaster) { 
//... 
    app.use(passport.initialize()); 
    app.use(passport.session()); 

    app.get('/auth/facebook', passport.authenticate('facebook')); 
    app.get('/auth/facebook/callback', 
     passport.authenticate('facebook', { 
      successRedirect : '/success', 
      failureRedirect : '/' 
     })); 

    app.get('/success', function(req, res, next) { 
     console.log("\n\n\nSESSION", req.user); //SHOWS req.user as UNDEFINED ;(
     res.send('Successfully logged in.'); 
    }); 
+0

Результат профиля facebook только один раз возвращен, также вы уверены, что cookie был настроен правильно? Возникает ли проблема даже без использования модуля кластера? –

+0

Попробуйте положить app.use (passport.initialize()); перед выполнением пассива serializeUser и deserializeUser. –

+0

В каком хранилище вы используете? – robertklep

ответ

1

Passport использует сессионный промежуточное программное обеспечение, что экспресс настроен на использование, которое обычно является express-session.

По умолчанию это промежуточное программное обеспечение использует хранилище в памяти, чтобы сохранить данные сеанса, но помимо этого не повторяется перезапуск приложения и наличие известных утечек памяти, данные сеанса не распространяются на разных сотрудников процессов (область хранения в памяти - для каждого процесса).

Вместо этого следует использовать некий общий хранилище сеансов, который может использоваться во всех рабочих процессах. Есть various options, из которых я думаю, что магазины Redis и MongoDB пользуются наибольшей популярностью.

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