一起使用cookieParser()和cookieSession()?

cookieParser()使我们可以select使用秘密语句来签名cookie,这对防止篡改很有帮助。 我知道cookie是用特殊值签名的,以防篡改。

我刚刚发现cookieSession(),我发现它是一个很好的替代服务器存储的cookie(我只存储{ loggedIn = true, userId=763487246824632} ,它永远不会增长)。

但是…我发现为cookieParser()设置一个“秘密”会破坏事物, 如果秘密语句匹配 ,cookieSession()将停止工作。 原因似乎是,如果cookie使用相同的秘密进行签名,那么cookieParser()实际上会将其parsing。 奇怪的是,一旦cookieParser()完成了工作,并且具有相同的签名秘密 ,则会话被设置为:

 { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true } } 

而不是:

 { testing: 'OOO' } 

(每次重新加载一个'o')所以…

  • 我的分析是否正确?
  • 你知道为什么会话设置为奇怪的{ cookie对象,如果秘密句子匹配?

芝加哥商业交易所。

你的分析是正确的,我可以重现它。

这个问题是由cookieSession中间件中的这一行引起的(一些上下文: options.secret是传递给cookieSession的密钥, req.secret是传递给cookieParser的密钥):如果你传递了两个中间件密钥, cookieSession假设它在req.cookiesfind原始( req.cookies )的cookie。

但是,由于cookieParser已经拿起了签名的cookie(并且它正在cookieSession之前cookieSession ),它已经parsing了cookie本身(因为签名密钥是相同的,所以成功了),将其存储在req.signedCookies req.cookies删除它 。 所以就cookieSession而言,cookie只是没有设置。

您看到的对象是默认的会话内容(这是cookieSessionconfiguration中的cookie属性):

 app.use(express.cookieSession({ cookie : { // <-- this object ... } }); 

至于解决scheme:或者为每个中间件使用不同的密钥,或者只传递其中的一个密钥,但不能同时传递两个密钥(理解如果将它传递给cookieParser ,则所有的cookie都将被签名)。

FWIW:我不完全确定这是否是一个真正的bug。 这是对cookieParsercookieSession使用相同的签名机制的cookieSession ,不区分由其中一个或另一个签名的Cookie。 尽pipe可以通过始终检查cookie是否位于req.signedCookies中来req.signedCookies