无法让`cookieSession`与`maxAge`一起使用

问题描述 投票:0回答:1

** 已解决 **

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

我正在使用带有 cookie 会话的 Express 和 Passport。当我仅将

secret
传递给 cookieSession 时,一切正常:

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

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

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()
并且它 确实 有效,但服务器重新启动时会话会丢失。

有什么帮助吗?

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

node.js express passport.js
1个回答
1
投票

这是用户错误。我不确定从哪里得到将

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;
    }
  }
}

因此,当您do

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

========

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

app.use(express.cookieParser('MySecret'));
app.use(express.cookieSession({
  cookie: {
    maxAge: 30 * 24 * 60 * 60 * 1000
  }
}));
© www.soinside.com 2019 - 2024. All rights reserved.