Passport serializeUser()不会使用此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对象?

由于您正在使用自定义身份validationcallback,因此您需要负责build立会话。

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

req.login()在login操作完成后,将user对象作为req.user分配给请求对象req

你可以看到例如在文档req.login()在自定义callback中显式调用:

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