Node.js Express.js会话存储持久性问题

Node.js Express.js会话存储持久性问题,node.js,mongodb,express,session,passport.js,Node.js,Mongodb,Express,Session,Passport.js,我在使用mongoDB和passport进行会话存储时遇到了一个非常奇怪的问题 当用户登录时,将创建会话并按预期将其传递给mongo以及passport id { "_id" : "GEEFIDhiMehdjPvtxRmPy_Kuls2IdVsx", "expires" : ISODate("2020-06-10T03:09:30.396Z"), "session" : "{\"cookie\":{\"originalMaxAge\":28800000,\"expires

我在使用mongoDB和passport进行会话存储时遇到了一个非常奇怪的问题

当用户登录时,将创建会话并按预期将其传递给mongo以及passport 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\"}}"
}
但是,当express服务器重新启动时,当用户选择需要身份验证的路由时,passport会将用户从会话存储中清除(通过调用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\":{}}"
}
我的身份验证代码是相当标准的东西tbh,我在这里哪里出错了?我正在使用azure广告护照策略

const passport=require('passport');
const-OIDCStrategy=require('passport-azure-ad')。OIDCStrategy;
const session=require('express-session');
const mongostre=require('connect-mongo')(会话);
const config=require('../config');
const store=新蒙哥斯托尔({
url:config.databaseUri,
});
//通常的护照代码在这里找到身份证,确认身份验证等
功能设置Passport(应用程序){
应用程序使用(
会议({
秘密:“somepassword”,
雷萨夫:是的,
曲奇:{
最大值:8*60*60*1000,
},
saveUninitialized:true,
店:店,,
})
);
app.use(passport.initialize());
app.use(passport.session());
}

我实际上没有在会话中存储正确的用户信息,甚至没有在会话中查找用户信息。相反,我将用户存储在本地数组中,并使用反序列化用户函数查找他们的oid。解决方案是用下面的代码替换它

passport.serializeUser(function (user, done) {
  done(null, user);
});

passport.deserializeUser(async (user, done) => {
  done(null, user);
});

通过这种方式,用户对象存储在会话数据库中,然后在用户选中auth时重新收集。

我实际上没有在会话中存储正确的用户信息,甚至没有在会话中查找用户信息。相反,我将用户存储在本地数组中,并使用反序列化用户函数查找他们的oid。解决方案是用下面的代码替换它

passport.serializeUser(function (user, done) {
  done(null, user);
});

passport.deserializeUser(async (user, done) => {
  done(null, user);
});

通过这种方式,用户对象存储在会话数据库中,然后在用户检查auth时重新收集。

我要寻找的一些东西是确保会话在Mongo中-这意味着使用一些外部工具来确保数据在那里。然后,如果是,请在重新启动后再次检查。这可能有助于缩小问题的范围。如果您的秘密从未改变(即,它不是生成秘密的某种加密函数),那么我认为它没有理由不获取会话,除非它一开始从未到达那里。也可以用更长的最大年龄测试东西。我看到服务器时间不同的问题会导致奇怪的过期问题。@cyberwombat前2个代码段来自mongo数据库bud,会话被公然存储,似乎在重新启动后,会话从未被重新调用,而是在用户登录时被重写。我要寻找的一些东西是确保会话在Mongo中,这意味着使用一些外部工具来确保数据在那里。然后,如果是,请在重新启动后再次检查。这可能有助于缩小问题的范围。如果您的秘密从未改变(即,它不是生成秘密的某种加密函数),那么我认为它没有理由不获取会话,除非它一开始从未到达那里。也可以用更长的最大年龄测试东西。我看到服务器时间不同的问题会导致奇怪的过期问题。@cyberwombat前2个代码段来自mongo数据库bud,会话被公然存储,似乎在重新启动后会话从未被回忆,而在用户登录时被重写。