#node.js #express #passport.js #passport-google-oauth
#node.js #экспресс #passport.js #паспорт-google-oauth
Вопрос:
Моя настройка PassportJS делает что-то странное, я вижу req.user
после входа в систему в deserialize
функции, но, в конце концов req.isAuthenticated()
false
, так и не req.user
найдена. Я уже передал кучу вопросов по этой проблеме в StackOverflow, почти каждый вопрос в StackOverflow. У меня ничего не работает, не уверен, в чем здесь дело. Я создаю свой код, может кто-нибудь, пожалуйста, скажите мне, что здесь не так и почему это происходит. По крайней мере, исправление! 🙁
Я использую passport-google-oauth в качестве своей стратегии. Кроме того, клиент является приложением Angular.
Я также попробовал использовать passport-google-oauth20, получив прямой доступ.
То, что я нашел,
social_logins.google_callback
req.user
можно найти и такжеreq.isAuthenticated()
возвращаетtrue
. После того, как произойдет перенаправление, оно не будет работать.
Заранее спасибо!
// app.js
const pgSession = require('connect-pg-simple')(session);
app.set('trust proxy', 1);
/** @type {session.CookieOptions} */
const cookieOptions = {
path: '/',
secure: false,
httpOnly: false,
maxAge: 30 * 24 * 60 * 60 * 1000 // 30 days
};
app.use(session({
secret: require('./config').session.secret, // session secret
cookie: cookieOptions,
proxy: true,
name: config.session.name,
resave: false,
saveUninitialized: true,
store: new pgSession({
pool: db.pool,
tableName: 'sess'
}),
}));
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());
// passport.js
passport.serializeUser((user, done) => {
done(null, user);
});
passport.deserializeUser(async (user, done) => {
done(null, user);
});
// passport login.js
app.get('/social-logins/connect/google', passport.authenticate('google-login', {
successRedirect: '/social-logins/google',
failureRedirect: '/social-logins/google',
scope: ['profile', 'email'],
failureFlash: true,
}));
// routes/index.js
router.get('/social-logins/google', social_logins.google_callback);
// callback funtion
social_logins.google_callback = async (req, res) => {
try {
const { user } = req;
if (!user) return res.redirect('https://localhost:3000/auth/login?message=Login Failed');
const url = `https://localhost:3000/auth/dashboard`;
req.session.save(() => {
return res.redirect(url);
});
} catch (error) {
log_error(error);
res.redirect(`https://localhost:3000/auth/login?error=true`);
}
};
// passport strategy
const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
module.exports = new GoogleStrategy({
clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: 'https://localhost:3000/social-logins/connect/google',
passReqToCallback: true
}, async (req, accessToken, refreshToken, profile, done) => {
try {
const acc = {}; // find from db and assign db.query('select * from users where id = $1', [profile.id]);
return done(false, acc, { message: 'User successfully logged in' });
} catch (error) {
return done(error);
}
});
Ответ №1:
Я решил это, установив значение domain
cookieOptions
.