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

时间:2020-06-09 19:22:21

标签: node.js mongodb express session passport.js

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

当用户登录时,将创建会话并将其按预期以及护照ID传递给mongo。

{
    "_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());
}

1 个答案:

答案 0 :(得分:0)

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

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

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

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