我已经能够使用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.');
});
答案 0 :(得分:1)
Passport使用Express配置使用的会话中间件,通常为express-session
。
默认情况下,此中间件使用内存存储来保存会话数据,但除了在应用程序重新启动时不持久且存在已知内存泄漏之外,会话数据不会在各种工作进程之间共享(内存存储区域是每个进程)。
应该使用某种可以在所有工作进程中使用的共享会话存储。有various options,其中我认为Redis和MongoDB商店最受欢迎。