Passport serializeUser() 未使用此 authenticate() 回调调用

Passport serializeUser() is not called with this authenticate() callback

使用passport.js,我这样写路由所以我可以访问MongoDb文档userDoc。但是,当这样做时...... passport.serializeUser() 将永远不会被调用并且 req 对象将丢失 user.

auth.route('/auth/facebook/callback')
  .get(function(req, res, next) {
    passport.authenticate('facebook', function(err, userDoc, info) {
      if (err) { return next(err); }
      // I don't think !userDoc will ever happen because of mongo upsert
      if (!userDoc) { return res.redirect('/login'); }
      res.cookie('facebookPicUrl', userDoc.value.facebook.picture, {maxAge : 9999999,
        httpOnly: false,
        secure: false,
        signed: false
      });

      res.redirect('http://localhost:9000/users')
    })(req, res, next);
  });

但如果我这样写,req.user 应该是:

auth.route('/auth/facebook/callback')
  .get(passport.authenticate('facebook', { failureRedirect: '/login' }),
       function(req, res) {
      res.redirect('http://localhost:9000/users')
    });

我怎样才能做到这一点 passport.serializeUser 被调用并且 user 存在于 req 上并且我还可以访问 mongoDb 对象?

由于您使用的是自定义身份验证回调,因此您负责建立会话。

Note that when using a custom callback, it becomes the application's responsibility to establish a session (by calling req.login()) and send a response.

一旦登录操作完成,

req.login()user 对象分配给请求对象 req 作为 req.user

例如,您可以在文档中看到 req.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);
});