簡體   English   中英

ExpressJS + PassportJS + passport-google-oauth `req.isAuthenticated()` 登錄后立即返回 false

[英]ExpressJS + PassportJS + passport-google-oauth `req.isAuthenticated()` returning false immediately after login

我的PassportJS設置做了一些奇怪的事情,在deserialize化 function 中登錄后我可以看到req.user但畢竟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解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM