Passport.js: нет req.user хранится в сеансе

У меня проблема с Passport.js и экспресс-сессией. При попытке войти в систему запрос просто зависает. Я начал с cookie-сессии вместо экспресс-сессии, и у меня не было проблем с аутентификацией, как со стратегиями Google, так и с Facebook. По некоторым причинам функции serializeUser и deserializeUser не вызываются, и в результате ни один пользователь не сохраняется в объекте req.

Мой код ниже.

index.js

    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    app.use(cookieParser());
    app.use(session({
       secret: sessionSecret,
       resave: false,
       saveUninitialized: false
    }));
    app.use(passport.initialize());
    app.use(passport.session());

маршруты

    router.get('/google', passport.authenticate('google', {
       scope: ['profile', 'email']
    }));

    router.get('/google/callback', passport.authenticate('google', {
       successRedirect: '/',
       failureRedirect: '/login'
    }));

паспорт настроен

   passport.serializeUser((user, done) => {
     done(null, user.id);
   });

   passport.deserializeUser((id, done) => {
     User.findById(id, (e, user) => {        
     done(e, user);
   });
   });

   passport.use(new GoogleStrategy({
      clientID: googleClientID,
      clientSecret: googleClientSecret,
      callbackURL: '/auth/google/callback',
      proxy: true
   }, async (accessToken, refreshToken, profile, done) => {
   try {
        //Does email exist in DB?
        const existingUser = await User.findOne({ 
        email: profile.emails[0].value,
       });

    if(existingUser) {
        //If email exists, is the profile id same as one in db?
        if(existingUser.googleId === profile.id) return done(null, 
        existingUser);

        //If email exists but no google id, set one
        if(!existingUser.googleId) {
            const user = await User.findOneAndUpdate({ 
                email: profile.emails[0].value 
            }, {
                $set: {
                    googleId: profile.id
                }
            }, {
                new: true
            });
            return done(null, user);
        }            
    }

    const newUser = await new User({
        email: profile.emails[0].value,
        googleId: profile.id
    }).save();
    done(null, newUser);

} catch (e) {
    console.log(e);
}
}));

1 ответ

Решил проблему сейчас. Я требовал в начальном файле, который отключен от моей базы данных MongoDB. Это явно мешало поиску пользователя.

Другие вопросы по тегам