cookieParser()
为我们提供了使用 secret 句子对cookie进行签名的选项,这对于防止篡改非常有用。我了解Cookie会以特殊值签名,以防止篡改。
我刚刚发现cookieSession(),发现它可以很好地替代服务器存储的cookie(我只存储{ loggedIn = true, userId=763487246824632}
,它永远不会增长)。
但是...我发现为cookieParser()设置“ secret ”会破坏事情,如果 secret 句子匹配,则cookieSession()会停止工作。
原因似乎是,如果使用相同的 secret 对cookie进行签名,则cookieParser()实际上会对其进行解析。奇怪的是,一旦cookieParser()完成工作并使用相同的签名 secret ,该 session 将被设置为:
{ cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true } }
而不是:
{ testing: 'OOO' }
(每次重新加载都会添加一个“o”)
所以...
{ cookie
对象吗? Merc。
最佳答案
您的分析是正确的,我可以重现。
此问题是由cookieSession
中间件中的this line引起的(某些上下文:options.secret
是传递给cookieSession
的 key ,req.secret
是传递给cookieParser
的 key ):如果您同时传递了这两个中间件一个 secret key ,cookieSession
假定它将找到原始文件(未解析) )req.cookies
中的cookie。
但是因为cookieParser
也已经拾取了签名的cookie(并且正在cookieSession
之前运行),所以它已经解析了cookie本身(并且由于签名 key 相同,因此成功完成了此操作),将其存储在req.signedCookies
中并删除了它。来自req.cookies
。因此就cookieSession
而言,cookie尚未设置。
您看到的对象是默认 session 内容(这是cookie
配置中的cookieSession
属性):
app.use(express.cookieSession({
cookie : { // <-- this object
...
}
});
作为一种解决方案:对每个中间件使用不同的 key ,或者仅将其中一个作为您的 secret key 传递给中间件(但不要同时使用两者)(要理解的是,如果将其传递给
cookieParser
,则会对您的所有cookie进行签名)。FWIW:我不确定这是否是一个真正的错误。这是对
cookieParser
和cookieSession
使用相同的签名机制的结果,而在彼此签名的cookie之间没有区别。尽管可以通过始终检查cookie是否位于req.signedCookies
中来解决此问题。关于node.js - 一起使用cookieParser()和cookieSession()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16475284/