使用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对象?
答案 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);
});