I am using passport.js for Google, Facebook and Twitter logins only.
Node.js v0.8.19 with express.js 3.1.0, and passportjs version 0.1.16. (passport-facebook - 0.1.5, twitter - 0.1.4 passport-goolge-oauth - 0.1.5 )
Everything works fine for a while, after an hour or so of the app running passport.js stops serializing the user into the req.user session.
Facebook and google are receiving meaning full data from their respective api's
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "http://localhost:3000/auth/facebook/callback"
},
function(accessToken, refreshToken, profile, done) {
var temp = {}
temp.name = profile.displayName
temp.id = profile.id
console.log(temp)
return done(null, temp);
}));
The console.log here will successfully print user id and name, however after calling
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
Serialize and deserialize are taken from the passport-facebook example.
The user will not be attached to req.user.
Twitter never gets that far, after returning to the callback url, twitter gives the error:
Error: failed to find request token in session
[03/11 23:28:24 GMT] at Strategy.OAuthStrategy.authenticate
Note: these failures only happen after a period of time, the work properly for a while. Thats why I think it may be a memory issue, like Im saving the session in memory instead of a cooke.
This is my express app configuration
app.configure(function(){
app.set('port', process.env.PORT || 8080);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieSession({ secret: 'tobo!', cookie: { maxAge: new Date(Date.now() + 3600000), }}));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
I have looked at the mailing list etc, but I could not find something matching this problem. I have checked on my localhost and on a nodejitsu server. Everything works for a while then fails.
done(null, user.id)
. deserializeUser is supposed to take the same id (from a cookie) and find the correct set of data in a database. With mongodb you could doUser.findById(id, function(err, user) { done(err, user); });
– Andreas Hultgren Mar 12 '13 at 9:03maxAge
as if it wasexpires
, which might be the problem.maxAge
should be passed the number of milliseconds after which the session expires (whereasexpires
takes a timestamp, as in your code) – robertklep Mar 12 '13 at 11:05