node.js - 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
};
任何帮助将非常感激。
解决方案
推荐阅读
- python - 使用 websockets 优雅关闭 uvicorn starlette 应用程序
- sql - 如何在视图中使用左连接在查询中添加 TOP 1?
- python - 如何将多行语句写入单行python字典
- c# - 如何在 asp.net core 中配置依赖项
- vba - 无法在项目打开时插入 MS 项目功能区
- javascript - 具有非动态输入字段的动态输入字段插入到两个 mysql 表中不起作用
- modelica - 模型中的混合气体
- c# - Elasticsearch Nest 客户端 MatchPhrasePrefix
- c++ - 从静态成员函数访问私有非静态类变量 - C++
- javascript - 在 gulp 中运行 ng build 使用旧版本的 node.js