首页 > 解决方案 > 生产中的 Express session、passport 和 connect-pg-simple 问题

问题描述

这是我第一次在这里发布问题。我希望你们能帮助我解决这个问题。我对 node.js 相当陌生,表达,对于我的缺乏经验,我很抱歉。

我目前在我的 node.js 快速应用程序中的身份验证会话有问题。我使用 Passport.js 来处理我的身份验证,我使用 connect-pg-simple(一个 PostgreSQL 会话存储)存储登录会话。单击登录按钮后,会话存储在我的 PostgreSQL 数据库中,但不知何故快递找不到它。事实上,它在数据库中存储了两次会话,但其中只有一个获得了护照 cookie。

当服务器仍在本地主机上时,此问题不存在。当我在 Heroku 上托管我的服务器时,它会出现。

此外,每当我推送到 heroku repo 时,它都会显示以下警告:

“connect.session() MemoryStore 不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程。”

我的猜测是我没有将 express session 正确连接到 PostgreSQL express store。下面是我的代码:

这就是我设置 PostgreSQL 数据库的方式:

const Pool = require("pg").Pool;

const pool = new Pool({
    user: process.env.PGUSER,
    password: process.env.PGPASSWORD,
    host: process.env.PGHOST,
    port: process.env.PGPORT,
    database: process.env.PGDATABASE
});


module.exports = pool

这就是我设置会话的方式:

const poolSession = new (require('connect-pg-simple')(session))({
    pool : pool    
  })

app.set('trust proxy', 1);
app.use(session({
    store: poolSession, 
    secret: process.env.SESSION_SECRET,
    saveUninitialized: true,
    resave: false,
    cookie: { 
        secure: true,
        maxAge: 30 * 24 * 60 * 60 * 1000
    } // 30 days
}));

app.use(passport.initialize());
app.use(passport.session());

这是单击登录按钮时存储在数据库中的 2 个会话的图像 https://i.stack.imgur.com/lzAby.png

这是我的登录路线(单击登录按钮时):

router
    .route("/signin")
    .post((req, res, next) => {
        console.log("Signing in...")
        passport.authenticate('local', function(err, user, info) {
            //code....

            req.logIn(user, function(err) {[enter image description here][1]
                console.log(user);
                if (err) { 
                    console.log(err);
                    res.send(apiResponse(500, err.message, false, null))
                    return next(err); 
                }
                console.log(req.sessionID); //The id of the 1st session store in db
                console.log(req.isAuthenticated()) //True
                res.redirect('/auth');
            });
        })(req, res, next);
    })

这是登录成功时重定向到的路由:

router.get("/", (req, res) => {
        console.log("/ ", req.isAuthenticated()); //False
        console.log("/ ", req.sessionID); //The Id of the 2nd session store in db 
        if(req.isAuthenticated()){
           //Notify user login success
        } 
    });

我已经被困在这里几天了。如果您需要更多代码,请告诉我!

标签: postgresqlexpressherokupassport.jsexpress-session

解决方案


推荐阅读