2015-06-17 5 views
1

Я использую Passport.js с Express - по какой-либо причине значение req.session.passport.user отсутствует, когда это должно быть, поскольку вы можно увидеть:Passport.js - req.session.passport.user не отображается

enter image description here

вот моя конфигурация паспорта:

passport.serializeUser(function (user, done) { 
     console.log(colors.bgRed('serialize user called, user:', user)); 
     done(null, user._id); 
    }); 

    passport.deserializeUser(function (id, done) { 
     console.log(colors.bgRed('deserialize user called, user_id:', id)); 
     UserModel.getNewUser().findById(id, function (err, user) { 
      console.log(colors.bgRed('deserialize find user called, user:', user)); 
      done(err, user); 
     }); 
    }); 

    passport.use('local', new LocalStrategy(function (username, password, done) { 
     UserModel.getNewUser().findOne({ 
      username: username 
     }, function (err, user) { 
      if (err) { 
       return done(err); 
      } 
      if (!user) { 
       return done(null, false, { 
        message: 'Incorrect username.' 
       }); 
      } 
      if (!user.validPassword(password)) { 
       return done(null, false, { 
        message: 'Incorrect password.' 
       }); 
      } 
      // req.user = user; 
      return done(null, user); 
     }); 
    })); 

кто-нибудь знает, что может быть неправильно? Мое единственное предположение заключается в том, что мне может потребоваться десериализация с использованием объекта Session вместо идентификатора пользователя, но я считаю неправильным. Я действительно знаю, что deserializeUser и serializeUser вообще не вызываются.

+0

Не следует ли хранить его в 'req.user._id'? (Или просто 'req.user)' – tymeJV

+0

проблема, кажется, какая-то проблема с настройкой - как я уже упоминал, - я действительно знаю, что десериализоватьUser и serializeUser вообще не вызываются. У меня есть другое приложение Express, которое работает, и эти два метода вызываются. –

ответ

2

Было сложно найти ответ для этого онлайн, поэтому я думаю, что нужно идти сюда.

Проблема заключалась в том, потому что вместо использования этого:

app.post('/login', passport.authenticate('local', { successRedirect: '/', 
failureRedirect: '/login' })); 

... Я решил использовать этот стиль разговора с паспортом:

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

Первоначально мой код был выглядеть примерно так:

passport.authenticate('local', function (err, user, info) { 
     if (err) { 
      return next(err); 
     } 
     if (!user) { 

      registerUser(req,res,next); 
     } 
     else{ 

       res.locals.loggedInUser = user._doc; 
       res.json({alreadyRegistered: !justRegistered,msg:user._doc}); 

     } 

    })(req, res, next); 

, но затем я обновил его с помощью req.logIn например:

passport.authenticate('local', function (err, user, info) { 
     if (err) { 
      return next(err); 
     } 
     if (!user) { 

      console.log('no account found, so we will register user as expected...'); 
      registerUser(req,res,next); 
     } 
     else{ 

      req.logIn(user, function (err) { //this is crucial 

       if(err){ 
        return next(err); 
       } 

       res.locals.loggedInUser = user._doc; 
       res.json({alreadyRegistered: !justRegistered,msg:user._doc}); 
      }); 
     } 

    })(req, res, next); 

и теперь это работает - следовало бы следовать документам лучше. Я рекомендую, чтобы Джаред Ханссон поставил «это очень важно» в документах, где я только что обозначил его выше. В противном случае, да, я должен был внимательно следить за документами.