node.js - Express.js 会话存储持久性问题
问题描述
我在使用 mongoDB 和护照的会话存储方面遇到了一个非常奇怪的问题。
当用户登录时,会创建会话并按预期传递给 mongo 以及护照 ID。
{
"_id" : "GEEFIDhiMehdjPvtxRmPy_Kuls2IdVsx",
"expires" : ISODate("2020-06-10T03:09:30.396Z"),
"session" : "{\"cookie\":{\"originalMaxAge\":28800000,\"expires\":\"2020-06-10T03:09:29.358Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"ebf7d73d-f3f2-4f96-8123-3f0f262ffff6\"}}"
}
但是,当快速服务器重新启动时,当用户选择需要身份验证的路由(通过调用 isAuth 函数)时,护照会将用户从会话存储中清除。这意味着用户需要在服务器重新启动后登录。
{
"_id" : "GEEFIDhiMehdjPvtxRmPy_Kuls2IdVsx",
"expires" : ISODate("2020-06-10T03:11:54.464Z"),
"session" : "{\"cookie\":{\"originalMaxAge\":28800000,\"expires\":\"2020-06-10T03:11:54.464Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}"
}
我的身份验证代码是非常标准的东西,我在哪里出错了?我正在使用 azure-ad 护照策略。
const passport = require('passport');
const OIDCStrategy = require('passport-azure-ad').OIDCStrategy;
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const config = require('../config');
const store = new MongoStore({
url: config.databaseUri,
});
// Usual passport code here findbyoid, ensureAuthenticated etc
function setupPassport(app) {
app.use(
session({
secret: 'somepassword',
resave: true,
cookie: {
maxAge: 8 * 60 * 60 * 1000,
},
saveUninitialized: true,
store: store,
})
);
app.use(passport.initialize());
app.use(passport.session());
}
解决方案
我实际上并没有在会话中存储正确的用户信息,甚至没有在会话中查找用户信息。相反,我将用户存储在本地数组中,并使用 deserializeUser 函数查找他们的 oid。解决方案是用下面的代码替换它。
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(async (user, done) => {
done(null, user);
});
这样,用户对象被存储在会话数据库中,然后在用户检查身份验证时重新收集。
推荐阅读
- java - 如何使用 java ListIterator 突然向前或向后移动几条记录
- java - gradle-maven-plugin 无法确定 java 11
- java - 循环中的联合火花数据集
- python - 检查 python 的 subprocess.Popen 中的异常
- excel - 如何在不打开的情况下检查关闭的工作簿的工作表中是否存在表格
- c# - LINQ 查询以组合两个字符串 [] 数组
- android - Admob 错误 - onAdFailedToLoad 错误代码 3
- react-native - React Native navigator,防止在 push() 后返回时卸载静态 navigationOptions 组件
- java - open api 3.0 是否可以使用 swagger 2.0 中的 ui?
- c# - 如何在不添加问号的情况下从应用配置中读取文件路径?