PassportJS节点:为什么即使不使用会话也需要serializeUser和deserializeUser?

时间:2016-11-18 10:40:26

标签: node.js session express passport.js

exports.initPassportLocalStrategy = function () {
  passport.use(new LocalStrategy(
    {
      session: false
    },
    function(username, password, done) {
      UserProxy.validateUserWithPassword(username, password)
        .then(function (user) {
          if(user) done(null, user);
          else done(null, false);
        })
        .catch(done);
    }
  ));

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

我正在实现一个基于令牌的身份验证中间件而没有看到。所以我想知道为什么我需要提供serialzeUser功能?我已经读过,原因是将用户或其某些属性放入会话中,然后desearlizeUser将从会话中检索整个对象并将其放入req.user

所以这是我的问题:

  1. 为什么不能完成(null,user);在LocalStrategy函数中将用户置于req.user?为什么甚至打扰序列化和deserailie?

  2. 如果删除searlizeUser函数,我会收到错误,但是我可以在没有deserilzeUser函数的情况下离开,为什么?在这种情况下,谁将用户对象放到req.user

  3. 非常感谢。

1 个答案:

答案 0 :(得分:2)

您不需要序列化/反序列化。您的设置略有错误。 您需要将session: false移出策略并进入passport.authenticate。这是因为策略无法做出决定,而是依赖于您的路由,您需要哪种身份验证。

passport.use(new LocalStrategy(
  function(username, password, done) {
    UserProxy.validateUserWithPassword(username, password)
      .then(function (user) {
        if(user) done(null, user);
        else done(null, false);
      })
      .catch(done);
  }
));
app.use(passport.initialize());  
app.post('/auth', passport.authenticate(  
  'local', {
     session: false // here goes the session false
  }), doWhateverYourSetupNeeds);