В течение последнего дня я прочитал много ответов на подобные вопросы, но мне не повезло с решениями. Я пытаюсь реализовать стратегию Facebook с помощью Passport Js в моем приложении express.
Если вы хотите увидеть полный исходный код, он находится здесь: https://github.com/Rynebenson/MERN-authentication-api
Я понял, что моя функция passport.deserializeUser никогда не вызывается, что наводит меня на мысль, что это проблема моего сеанса? Express -сессия объекта кажется простой, и я внес несколько изменений, но ни одна из них не работает. Вот некоторый код вокруг проблемы.
// index.js
... some imports
var session = require('express-session');
var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;
var mongoose = require('mongoose');
var config = require('./config');
var User = require('./models/users');
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.set('trust proxy', 1);
app.use(session({
secret: 'turtledoves',
resave: true,
saveUninitialized: true,
// leaving out cookies: { secure: true } for now because dev server is unsecure
}));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
console.log(`from serialize`, user); // I see output from this. Tried user._id and saw in console, but deserializeUser still wasn't called after.
done(null, user);
});
passport.deserializeUser(function(user, done) {
console.log(`from deserialize`, user); // Seeing no output from this.
done(null, user);
});
/*
* Passport Facebook Strategy
*
* @param clientID - Facebook client id.
* @param clientSecret - Facebook client secret.
* @param profileFields - Array containing what information to receive from facebook.
* @param profile - Object containing information from Facebook user (id, name, email,
picture).
* @param User - Mongoose User Model
*
* @return user - Object containing user information.
*/
passport.use(
new FacebookStrategy(
{
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: 'http://localhost:3001/auth/facebook/callback',
profileFields: ['id', 'name', 'email', 'photos']
},
function(accessToken, refreshToken, profile, cb) {
let { id, first_name, last_name, email, picture } = profile._json;
let photo = picture.data.url;
let name = first_name + ' ' + last_name;
User.findOne({ "facebook.id": id }, function(err, user) {
if(user) {
return cb(null, user);
}
var newUser = new User({ name: name, email: email, photo: photo, facebook: { id: id, token: accessToken } });
newUser.save(function(err, newUserObj) {
if(err) { return console.log(err); }
return cb(null, newUserObj);
});
});
}
)
);
mongoose.connect(config.database, { useNewUrlParser: true, useUnifiedTopology: true }, () => console.log('connected to database...'));
require('./routes')(app, passport);
app.listen(process.env.PORT || 3001);
Теперь в моем файле маршрутов. js, у меня есть эти маршруты для обработки входа в Facebook.
app.get('/user', (req, res) => {
console.log(req.user);
});
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/', successRedirect: 'http://localhost:3000/' }));
Когда я go в http://localhost: 3001 / auth / facebook с моего клиента все работает. Я перенаправлен на страницу входа в Facebook, а затем возвращаюсь к своему successRedirect, равному http://localhost: 3000 с подключением connect.sid cook ie. У меня есть HO C в моем клиенте, который делает запрос / user, что консоль регистрирует req.user. Это всегда не определено.