passportjs 登录不会将护照对象附加到会话存储中的会话对象

passportjs login doesn't attach passport object to session object in session store

我 运行 遇到了 passportjs 的登录问题,这让我困惑了一天,所以我可以寻求帮助。我在我的 nodejs 项目中使用这些版本的快递和护照:

"express": "~4.16.1",
"express-session": "^1.17.2",
"passport": "^0.4.1",
"passport-local": "^1.0.0",

会话存储是一个会话文件存储。

app.use(session({
  store: sessionStore,
  secret: process.env.SESSION_SECRET,
  resave: true,
  saveUninitialized: true,
  name: sessionCookieName,
  cookie: {
    secure: true,
    maxAge: Number(process.env.SESSION_MAX_AGE),
    sameSite: 'None'
  }
}));

该应用程序目前 运行 在我的笔记本电脑 (macOS) 上,我可以毫无问题地从我的 iPhone/iPad 登录。如果我尝试从笔记本电脑本身登录,那么问题就会出现,而 Safari、Firefox 和 Chrome 都没有改变。我注意到 req.session 在 passport.authenticate() 内的 req.login() 函数内正确设置,即,如果我在 req.login() 内打印出 req.session当我登录时,它有附加到 req.session 的 passport.user.username 对象。但是,存储为 .json 文件的会话对象不会使用 {passport: {user: username}} 对象更新,因此,后续请求不会被确认为来自已登录会话。如果登录请求来自笔记本电脑外部,这不是问题。

router.post('/account/login', function(req, res, next) {
  passport.authenticate('local', async function(err, user, info) {
    if (err) { return next(err); }
    if (!user) {
      logger.debug(`[users] login: info = ${util.inspect(info)}`);

      let message = { success: false, title: "Login was unsuccessful!", body: info };
      return res.render('login', { title: 'App', subtitle: '', message: message });
    }

    req.login(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/');
    });

  })(req, res, next);
});

一切都很好,直到昨天我复制了项目目录,并重新安装了软件包。 [一些包版本有微小的变化]。代码没有改变。也许我的代码中存在一个错误,该错误被我无法跟踪的某些更改暴露了!如果我从以前的项目目录启动应用程序,登录工作正常。

如果我将项目放在笔记本电脑上的小型多通道 ubuntu 服务器上,然后从那里启动它(现在它有不同的 IP),从笔记本电脑浏览器登录就可以正常工作。

我一直在想,当登录尝试来自与服务器相同的 IP 时,发生了一些变化,导致 passport 不使用 {passport: {user: username}} 更新会话文件对象。

在此先感谢您的帮助和见解!

调查的下一步得到了回报。我检查了所有可能已通过 npm install 安装了较新版本的软件包,并找到了两个相关的软件包:express-session 从 1.17.1 更改为 1.17.2,session-file-store 从 1.4.0 更改为 1.5。 0。将 express-session 恢复到 1.17.1 没有帮助,但是将 session-file-store 恢复到 1.4.0 解决了这个问题。呸! [PS:此文本之前作为评论发布于 7 月 30 日 17:57]