【问题标题】:PassportJS Node: why need serializeUser and deserializeUser even when not using session?PassportJS 节点:为什么即使不使用会话也需要 serializeUser 和 deserializeUser?
【发布时间】:2016-11-18 18:48:05
【问题描述】:
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. 为什么不能done(null, user);在LocalStrategy 函数中将用户放入req.user ?为什么还要费心连载和解散呢?

  2. 如果删除searlizeUser 函数我会得到一个错误,但我可以在没有deserilzeUser 函数的情况下逃脱,为什么?而在这种情况下,谁把用户对象放到req.user

非常感谢。

【问题讨论】:

    标签: node.js session express passport.js


    【解决方案1】:

    您不需要序列化/反序列化。您的设置略有错误。 您需要将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);
    

    【讨论】:

    • 当我们不使用会话时为什么需要passport.initialize()
    猜你喜欢
    • 2015-05-17
    • 2016-03-24
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2020-09-10
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多