快递4& Passport无法创建会话

时间:2015-07-04 19:13:09

标签: node.js express passport.js

我已经能够使用Facebook登录用户了。但是,一旦我从Facebook恢复信息,我就会失去它。

我不知道我是不是应该创建会话的人,或者我错过了什么。

这就是我所做的:配置

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显示为undefined。我试过没有集群,问题仍然是一样的......

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.');
    });

1 个答案:

答案 0 :(得分:1)

Passport使用Express配置使用的会话中间件,通常为express-session

默认情况下,此中间件使用内存存储来保存会话数据,但除了在应用程序重新启动时不持久且存在已知内存泄漏之外,会话数据不会在各种工作进程之间共享(内存存储区域是每个进程)。

应该使用某种可以在所有工作进程中使用的共享会话存储。有various options,其中我认为Redis和MongoDB商店最受欢迎。