使用此authenticate()回调不会调用Passport serializeUser()

时间:2016-04-10 02:49:33

标签: node.js mongodb express passport.js

使用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存在clipRect并且我还可以访问mongoDb对象?

1 个答案:

答案 0 :(得分:18)

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

  

请注意,使用自定义回调时,它将成为应用程序的回调   建立会议的责任(通过呼叫req.login())和   发送回复。

登录操作完成后,

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