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”)
所以...
  • 我的分析正确吗?
  • 您知道密语匹配时,为什么将 session 设置为该奇怪的{ 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:我不确定这是否是一个真正的错误。这是对cookieParsercookieSession使用相同的签名机制的结果,而在彼此签名的cookie之间没有区别。尽管可以通过始终检查cookie是否位于req.signedCookies中来解决此问题。

    关于node.js - 一起使用cookieParser()和cookieSession()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16475284/

    10-09 20:08