首页 > 解决方案 > 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);
    }
});

标签: node.jsexpresspassport.jspassport-google-oauth

解决方案


我通过设置解决了这个domain问题cookieOptions


推荐阅读