node.js - 无法让 `cookieSession` 与 `maxAge` 一起使用

标签 node.js express connect passport.js

** 已解决 **

我已经为这个问题苦苦挣扎了一段时间。那里有很多类似的帖子,但所提出的解决方案都不适合我。

我正在使用带有 cookie session 的 Express 和 Passport。当我仅将 secret 传递给 cookieSession 时,一切正常:

app.use(express.cookieParser('MySecret'));
app.use(express.cookieSession('MySecret'));
app.use(passport.initialize());
app.use(passport.session());

但默认 cookie 是基于 session 的,因此当您关闭浏览器时它会被清除。我需要一 block 限时 cookies 。所以我尝试使用据称支持的选项:

app.use(express.cookieParser('MySecret'));
app.use(express.cookieSession({
  secret: 'MySecret',
  cookie: {
    maxAge: 365 * 24 * 60 * 60 * 1000
  }
}));
app.use(passport.initialize());
app.use(passport.session());

它停止工作了。看起来 cookie 在我的浏览器中设置并且看起来不错,但是没有 req.user,并且后续请求未经过身份验证。

我尝试使用 maxage 而不是 maxAge 但无济于事。我可以切换到相同的配置,但使用 express.session() 而不是 express.cookieSession() 并且它确实工作,但是当服务器重新启动时 session 会丢失。

有什么帮助吗?

编辑:顺便说一句,我使用的是 Express 3.20.2

最佳答案

这是用户错误。我不确定从哪里获得将 secret 作为字符串传递给 cookieSession() 的语法,但这是无效的。它被忽略,实际上回退到使用 req.secret ,它是由 cookieParser('MySecret') 调用首先定义的。

这就是它使用原始代码的原因。我仍然认为这是一个糟糕的时刻,因为第二种语法应该仍然有效,但事实并非如此。它归结为 cookieSession 模块中的这段代码:

if (!options.secret && req.secret) {
  req.session = req.signedCookies[key] || {};
  req.session.cookie = cookie;
} else {
  // TODO: refactor
  var rawCookie = req.cookies[key];
  if (rawCookie) {
    var unsigned = cookieParser.signedCookie(rawCookie, secret);
    if (unsigned) {
      var original = unsigned;
      req.session = cookieParser.JSONCookie(unsigned) || {};
      req.session.cookie = cookie;
    }
  }
}

因此,当您在 cookieSession 的选项中传递 secret 时,它会落入 else block 中,最终设置了一个不同的cookie?我不知道,但这似乎是一个错误。如果我对 cookieParser 和 cookieSession 使用相同的 secret ,那应该很好。但无论如何...

========

tl;博士,它需要​​是这样的:

app.use(express.cookieParser('MySecret'));
app.use(express.cookieSession({
  cookie: {
    maxAge: 30 * 24 * 60 * 60 * 1000
  }
}));

关于node.js - 无法让 `cookieSession` 与 `maxAge` 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30109331/

相关文章:

node.js - 如何高效地将 Postgres 数据从 Query 传输到 S3

javascript - 使用继承时的 BabelJS 类排序

javascript - 将图像上传到 Cloudinary Express.js React Axios post 请求

javascript - 在 API 帖子中注册用户时设置电子邮件和用户名的多重验证

node.js - 如何在 NodeJs 中扩展 express js res 对象

node.js - express-session 和 cookie-session 有什么区别?

node.js - Nodejs单元测试策略: check if a table exists and contains the data you expect

ios - 使用 Azure 和 Node.js 向 iOS 发送 APNS 推送不起作用

mysql - 连接到远程 MySQL 主机解析为我的 IP 地址?

c - 传输端点未连接,连接失败()