我回答得太晚了,但我认为我的解决方案更好,更传统。在这里的官方文档中。有一节“验证回调中的关联”,其中提到如果我们将策略的passReqToCallback选项设置为true,这将启用req并将其作为第一个参数传递给验证回调。
所以我的FacebookStrategy现在看起来像:
var User = require('../models/UserModel.js');
var FacebookStrategy = require('passport-facebook').Strategy;
exports.facebookStrategy = new FacebookStrategy({
clientID: 'REPLACE_IT_WITH_CLIENT_ID',
clientSecret: 'REPLACE_IT_WITH_CLIENT_SECRET',
callbackURL: 'http://localhost:3000/auth/facebook/callback',
passReqToCallback: true
},function(req,accessToken,refreshToken,profile,done){
User.findOne({
'facebook.id' : profile.id
},function(err,user){
if(err){
done(err);
}
if(user){
req.login(user,function(err){
if(err){
return next(err);
}
return done(null,user);
});
}else{
var newUser = new User();
newUser.facebook.id = profile.id;
newUser.facebook.name = profile.displayName;
newUser.facebook.token = profile.token;
newUser.save(function(err){
if(err){
throw(err);
}
req.login(newUser,function(err){
if(err){
return next(err);
}
return done(null,newUser);
});
});
}
});
}
);
在我的代码示例中,我添加了一些逻辑来将用户信息保存在数据库中并在会话中保存用户详细信息。我认为这可能对人们有帮助。
req.user给出存储在护照会话中的用户信息。