Express 4 和 Passport 无法创建会话
Express 4 & Passport Unable to Create Session
到目前为止,我已经能够使用 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
});
在集群内部(4 个中的 1 个),它正确地重定向到 /success
。 但是,success
控制器的console.log
显示未定义。我试过没有集群,问题还是一样...
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.');
});
Passport 使用Express 配置使用的会话中间件,通常是express-session
。
默认情况下,此中间件使用内存存储来保存会话数据,但除了在您的应用程序重新启动时不会持久存在并且已知内存泄漏之外,会话数据不会在您的各种应用程序之间共享工作进程(内存存储区域是每个进程)。
应该改用某种可以跨所有工作进程使用的共享会话存储。有various options,其中我认为Redis和MongoDB商店最受欢迎。
到目前为止,我已经能够使用 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
});
在集群内部(4 个中的 1 个),它正确地重定向到 /success
。 但是,success
控制器的console.log
显示未定义。我试过没有集群,问题还是一样...
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.');
});
Passport 使用Express 配置使用的会话中间件,通常是express-session
。
默认情况下,此中间件使用内存存储来保存会话数据,但除了在您的应用程序重新启动时不会持久存在并且已知内存泄漏之外,会话数据不会在您的各种应用程序之间共享工作进程(内存存储区域是每个进程)。
应该改用某种可以跨所有工作进程使用的共享会话存储。有various options,其中我认为Redis和MongoDB商店最受欢迎。