一起使用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.cookies
find原始( req.cookies
)的cookie。
但是,由于cookieParser
已经拿起了签名的cookie(并且它正在cookieSession
之前cookieSession
),它已经parsing了cookie本身(因为签名密钥是相同的,所以成功了),将其存储在req.signedCookies
从req.cookies
删除它 。 所以就cookieSession
而言,cookie只是没有设置。
您看到的对象是默认的会话内容(这是cookieSession
configuration中的cookie
属性):
app.use(express.cookieSession({ cookie : { // <-- this object ... } });
至于解决scheme:或者为每个中间件使用不同的密钥,或者只传递其中的一个密钥,但不能同时传递两个密钥(理解如果将它传递给cookieParser
,则所有的cookie都将被签名)。
FWIW:我不完全确定这是否是一个真正的bug。 这是对cookieParser
和cookieSession
使用相同的签名机制的cookieSession
,不区分由其中一个或另一个签名的Cookie。 尽pipe可以通过始终检查cookie是否位于req.signedCookies
中来req.signedCookies
。