Passport.js не удалось выполнить сериализацию пользователя

Я использую pass.js только для входа в Google, Facebook и Twitter.

Node.js v0.8.19 с express.js 3.1.0 и паспортной версией 0.1.16. (паспорт-facebook - 0.1.5, твиттер - 0.1.4 паспорт-goolge-oauth - 0.1.5)

Все работает нормально какое-то время, через час или около того приложения, работающего с паспортом .js прекращает сериализацию пользователя в сеансе req.user.

Facebook и google получают значения полных данных из их соответствующих api

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

Консоль .log здесь успешно распечатает идентификатор пользователя и имя пользователя, однако после вызова

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

Сериализация и десериализация взяты из паспорта-facebook пример.

Пользователь не будет прикреплен к req.user.

Twitter никогда не заходит так далеко, после возврата к URL-адресу обратного вызова, твиттер дает ошибку:

Error: failed to find request token in session
[03/11 23:28:24 GMT]     at Strategy.OAuthStrategy.authenticate            

Примечание. эти сбои происходят только через определенный промежуток времени, работа выполняется некорректно. Вот почему я думаю, что это может быть проблема с памятью, например Im, сохраняющая сессию в памяти вместо cooke.

Это моя экспресс-конфигурация приложения

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

Я просмотрел список рассылки и т.д., но я не смог найти что-то подобное этой проблеме. Я проверил на своем localhost и на сервере nodejitsu. Все работает некоторое время, а затем терпит неудачу.

Ответ 1

Сначала вы должны понять, для чего предназначены сериализация и десериализация.

1) serializeUser возьмите объект пользователя и сохраните любую информацию, которую вы хотите в сеансе, при возврате done(null, user) в соответствии с вашим первым вопросом.

2) deserializeUser берет информацию, хранящуюся в сеансе (отправляется cookieSession в каждом запросе) и проверяет, действительно ли сеанс действителен для пользователя, а if(!err) done(null,user) - true, хранит пользователя в сеансе, где else done(err,null) удаляет его из сеанса, перенаправляя вас на то, что ваш app.get('/auth/:provider/callback') отправляет пользователю после проверки того, завершен ли сеанс или нет. Это должно прояснить ситуацию для вашего второго вопроса.

Ответ 2

Я до сих пор не понимаю, почему возникла проблема, но я решил это, выполнив следующее.

Изменение

  app.use(express.cookieSession({ secret: 'tobo!', cookie: { maxAge: new Date(Date.now() +     3600000), }}));

к

app.use(express.cookieSession({ secret: 'tobo!', maxAge: 360*5 }));

Я думаю, что сериализация всего пользовательского объекта должна работать, поскольку десериализатор будет просто передавать переданный файл cookie. Но не сериализуя весь пользовательский объект, он работает.

passport.serializeUser(function(user, done) {
    console.log('serializeUser: ' + user._id)
    done(null, user._id);
});

passport.deserializeUser(function(id, done) {
    db.users.findById(id, function(err, user){
        console.log(user)
        if(!err) done(null, user);
        else done(err, null)  
    })
});

У меня были проблемы с ноль, поскольку я сделал это.