Почему Passport Js не десериализует моего пользователя? - PullRequest
0 голосов
/ 09 марта 2020

В течение последнего дня я прочитал много ответов на подобные вопросы, но мне не повезло с решениями. Я пытаюсь реализовать стратегию 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. Это всегда не определено.

...