node.js - ExpressJS + PassportJS + passport-google-oauth `req.isAuthenticated()` 登录后立即返回 false
问题描述
我的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);
}
});
解决方案
我通过设置解决了这个domain
问题cookieOptions
。
推荐阅读
- tensorflow - 无法理解 keras.datasets.imdb
- big-o - 为什么在计算大 O 时 O(n*n*n!) 会简化为 O((n+2)!)
- python - 从 Python 中的多个列表中仅选择一个唯一元素
- pine-script - 如何从 Pine Script 中函数中断的循环中获取值?
- python - 使用 pip 在 Windows 中安装 ZeroMQ / pyzmq 时遇到问题
- python - 已安装 CUDA 但未使用 GPU
- java - How to find the first three strings, which start with a lower-case `a` in a sorted order
- python - Python Scikit Image find contours return the contours all in the first location of the list
- unity3d - 如何防止我的 Unity 包中的预构建程序集被剥离?
- json - 如何使用 AWS CLI 获取 NAT 网关公共 IP?