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

dma*_*man 8 mongodb node.js 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);
  });
Run Code Online (Sandbox Code Playgroud)

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

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

如何将其passport.serializeUser调用到调用和user存在的位置,req并且还可以访问mongoDb对象?

rof*_*ggo 20

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

请注意,使用自定义回调时,应用程序负责建立会话(通过调用req.login())并发送响应.

req.login()一旦登录操作完成,就将user对象分配给请求对象.reqreq.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);
});
Run Code Online (Sandbox Code Playgroud)

  • 哇!据我了解,Passport.js 网站上没有记录这一点。他们说passport.authenticate() 调用req.login() 但我不知道如果提供自定义回调必须手动调用它。文档太含糊了! (3认同)
  • 我同意,这根本没有在网站上记录@OzzyTheGiant (2认同)