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

PassportJS Node: why need serializeUser and deserializeUser even when not using session?

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

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

所以这是我的问题:

  1. 为什么不能完成(null, user);在 LocalStrategy 函数中将用户放入 req.user ?为什么还要麻烦序列化和反序列化?

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

非常感谢。

您不需要 serialize/deserialize。你的设置有点错误。 您需要将 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);