Получить объект запроса в обратном вызове стратегии Passport
Итак, вот моя конфигурация для стратегии паспорт-facebook:
passport.use(new FacebookStrategy({
clientID: ".....",
clientSecret: ".....",
callbackURL: "http://localhost:1337/register/facebook/callback",
},
facebookVerificationHandler
));
И вот facebookVerificationHandler:
var facebookVerificationHandler = function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
.......
});
};
Есть ли способ доступа к объекту запроса в facebookVerificationHandler?
Пользователи регистрируются на моем сайте с помощью LocalStrategy, но тогда они смогут добавлять свои социальные учетные записи и связывать их с их локальными учетными записями. Когда вызывается обратный вызов выше, пользователь, который в настоящее время входит в систему, уже доступен в req.user, поэтому мне нужно получить доступ к req, чтобы связать пользователя с учетной записью facebook.
Правильно ли это это реализовать или я должен рассмотреть другой способ сделать это?
Спасибо.
Ответы
Ответ 1
По этой причине вместо настройки стратегии при запуске приложения я обычно настраиваю стратегию, когда есть запрос. например:
app.get(
'/facebook/login'
,passport_setup_strategy()
,passport.authenticate()
,redirect_home()
);
var isStrategySetup = false;
var passport_setup_strategy = function(){
return function(req, res, next){
if(!isStrategySetup){
passport.use(new FacebookStrategy({
clientID: ".....",
clientSecret: ".....",
callbackURL: "http://localhost:1337/register/facebook/callback",
},
function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
// here you can access 'req'
.......
});
}
));
isStrategySetup = true;
}
next();
};
}
Используя это, у вас будет доступ к запросу в вашем обработчике проверки.
Ответ 2
Здесь есть опция passReqToCallback
, см. нижнюю часть этой страницы: http://passportjs.org/guide/authorize/
Ответ 3
Попробуйте это.
exports.facebookStrategy = new FacebookStrategy({
clientID: '.....',
clientSecret: '...',
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);
});
});
}
});
}
);
Пользователь - модель мангуста, я сохраняю пользователя в БД.