首页 > 解决方案 > Connect-pg-simple 不将会话保存到数据库

问题描述

我正在尝试使用 Node、Express、Express-Session 和 Passport.js 实现简单的身份验证。作为存储中间件,我使用connect-pg-simple就像我在项目中使用 pg-promise 一样。

我设法将护照配置为与我的路由器一起使用,但由于某种原因,会话不会保存到我的数据库中。所有插件都没有返回任何错误,一切似乎都运行顺利,但我的会话表是空的。

我可能做错了什么?connect-pg-simple 连接到服务器,passport.js 正在保存会话,并且 express-session 将配置的 maxAge 分配给 cookie。

服务器.js

const express = require('express');
const db = require('./database.js');
const cors = require('cors');
const helmet = require('helmet');
const session = require('express-session');
const passport = require('passport');

const port = process.env.PORT || 3000;
const app = express();

const pgSession = require('connect-pg-simple')(session);
const pgStoreConfig = {
  pgPromise: db.conn
};

app.set('trust proxy', 1);

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.use(
  session({
    secret: REDACTED, // need to change it later to some proper hash
    store: new pgSession(pgStoreConfig),
    resave: true,
    cookie: {
      maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days ;)
      secure: app.get('env') === 'production'
    },
    saveUninitialized: false
  })
);

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

app.use(cors());
app.use(helmet());

app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
  } else {
    req.session.views = 1;
  }
  //res.send(`Views: ${req.session.views}`);
  res.json(req.session);
});

const userRouter = require('./routes/user.js');

app.use(userRouter);

配置/passport.js

const passport = require('passport');
const local = require('passport-local');
const db = require('../database.js');
const statements = require('../routes/statements/user.js');
const cryptoUtils = require('../utils/crypto.js');

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser(async (id, done) => {
  try {
    let result = await db.conn.one(statements.getUserByIdStatement, [id]);
    done(null, result);
  } catch (error) {
    console.log(`Error while deserializing user: ${error}`);
    return done(error);
  }
});

passport.use(
  new local.Strategy(
    { usernameField: 'email', passwordField: 'password' },
    async (username, password, done) => {
      try {
        let user = await db.conn.one(statements.loginUserStatement, [username]);

        if (user == null) {
          console.log(`Couldn't find user!`);
          return done(null, false);
        } else {
          let passwordCheck = cryptoUtils.comparePasswords(
            password,
            user.password,
            user.salt
          );

          if (passwordCheck) {
            delete user.password;
            delete user.salt;
            console.log(`Successfuly logged in!`);
            return done(null, user);
          } else {
            console.log(`Wrong password!`);
            return done(null, false);
          }
        }
      } catch (error) {
        console.log(`Error during local strategy authentication: ${error}`);
        return done(null, false);
      }
    }
  )
);

module.exports = passport;

路线/user.js

router.post('/user/login', (req, res, next) => {
  console.log('Authenticating');
  passport.authenticate('local', (err, user, info) => {
    if (err) {
      res.status(500).json({ status: err });
    }
    if (!user) {
      res.status(404).json({ status: 'User not found' });
    }
    if (user) {
      req.logIn(user, function(err) {
        if (err) {
          res.status(500).json({ status: 'Error while logging in' });
        }
        res.redirect('/');
      });
    }
  })(req, res, next);
});

router.get('/user/logout', userUtils.loginRequired, (req, res, next) => {
  req.logout();
  res.status(200).json({ status: 'Logged out' });
});

数据库.js

const pgp = require('pg-promise')(initOptions);
const conn = pgp(connectionConfig);

module.exports = {
  pgp,
  conn
};

任何帮助将非常感激。

标签: node.jspostgresqlexpresspassport.jsexpress-session

解决方案


推荐阅读