【问题标题】:Where does express.session store hashed session key on server side?express.session 在服务器端在哪里存储散列会话密钥?
【发布时间】:2013-12-27 18:53:10
【问题描述】:

我正在使用 mongoStore 来管理 express.js 框架上的会话。

...
var MongoStore = require('connect-mongo')(express);
...
...
app.use(express.session({
    secret:settings.cookieSecret,
    store: new MongoStore({db:settings.db})
}));
...

但这是 mongoDB 上的会话集合中的记录

> db.session
s.find()
{ "_id" : "gLQe0NwaSmk9nPu6vOWKuSy0", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{},\"user\":null}", "expires" : ISODate("2013-12-24T05:02:33.308Z") }
{ "_id" : "SoqYLZnEzlVCdj4A1606fDPg", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{},\"user\":\"vvv\"}", "expires" : ISODate("2013-12-24T09:43:55.098Z") }
{ "_id" : "pBtoFt6sR2EvNCuPJVqAFVpR", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{}}", "expires" : ISODate("2013-12-24T09:24:27.846Z") }
{ "_id" : "MEkFGzd190YeJAGDH3nzLT14", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{}}", "expires" : ISODate("2013-12-24T09:44:10.585Z") }
> 

我的理解是他们应该在客户端 cookie 和服务器数据库或内存的某个地方存储 connect.id 的值。由于我使用的是 connect-mongo,因此 connect.id 应该存储在 db.sessions 中。

但我在服务器端找不到 connect.id。他们在哪里存储这个值?如果我的理解有误,请指正。谢谢!

【问题讨论】:

    标签: node.js mongodb cookies express


    【解决方案1】:

    express.js的session cookie功能其实是connect提供的

    您设置的密钥用于将数据库中的会话 ID 签名为您看到的值

    查看source code

    【讨论】:

    • 请注意,您链接的源已弃用:console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature')
    【解决方案2】:

    如果你阅读connect-mongosource code,Mongo的文档的object id就是session id:

    var s = {_id: sid, session: this._serialize_session(session)};
    

    session middleware:

    // get the sessionID from the cookie
    req.sessionID = unsignedCookie;
    

    但是,您不会只在屏幕截图中看到 cookie ID,因为cookie-signature module 将哈希附加到 cookie 值(请参阅this relevant answer),因此您看到的是 sid.hash cookie 值。

    这里是relevant source code,其中存储了散列值:

      // set-cookie
      val = 's:' + signature.sign(val, secret);
      val = cookie.serialize(key, val);
    

    您也可以阅读unit tests 以获得更全面的了解。

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 2016-06-07
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2013-02-19
      相关资源
      最近更新 更多