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. Это явно мешало поиску пользователя.