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