Объект доступа Passport-facebook доступа из функции обратного вызова
При обратном вызове Facebook для проверки подлинности паспорта nodejs, как вы получаете объект req
в обратном вызове?
passport.use(new FacebookStrategy({
clientID: 123456789,
clientSecret: 'SECRET',
callbackURL: "http://example.com/login/facebook/callback"
},
function(accessToken, refreshToken, profile, done){
// Is there any way to get the req object in here?
}
));
Ответы
Ответ 1
Установка параметра passReqToCallback
, так:
passport.use(new LocalStrategy({ passReqToCallback: true },
function(req, username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) {
req.flash('error', 'Your password is too long');
req.flash('error', 'Also, it is too short!!!');
return done(null, false);
}
return done(null, user);
});
}
));
req
становится первым аргументом для проверки обратного вызова
По https://github.com/jaredhanson/passport/issues/39
Ответ 2
Я отвечаю на него слишком поздно, но я думаю, что мое решение лучше и более условно.
В официальной документации здесь. Существует раздел " Ассоциация в проверке обратного вызова", в котором упоминается, что если мы установим опцию 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 предоставляет информацию пользователя, хранящуюся в паспортной сессии.