2

我在 Express 3 http://notjustburritos.tumblr.com/post/22682186189/socket-io-and-express-3

这个想法是让我从 socket.io 连接回调中获取会话对象,connect-redis在这种情况下通过存储会话。

所以,在app.configure我们有

var db = require('connect-redis')(express)
....
app.configure(function(){
     ....
     app.use(express.cookieParser(SITE_SECRET));                                                                                                      
     app.use(express.session({ store: new db }));                                   

在应用程序代码中有

var redis_client = require('redis').createClient()

 io.set('authorization', function(data, accept) {
     if (!data.headers.cookie) {
         return accept('Sesssion cookie required.', false)
     }

     data.cookie = require('cookie').parse(data.headers.cookie);
     /* verify the signature of the session cookie. */
     //data.cookie = require('cookie').parse(data.cookie, SITE_SECRET);
     data.sessionID = data.cookie['connect.sid']

     redis_client.get(data.sessionID, function(err, session) {
         if (err) {
             return accept('Error in session store.', false)
         } else if (!session) {
             return accept('Session not found.', false)
         }
         // success! we're authenticated with a known session.
         data.session = session
         return accept(null, true)
     })
 })

会话正在保存到 redis,键如下所示:

redis 127.0.0.1:6379> KEYS *
1) "sess:lpeNPnHmQ2f442rE87Y6X28C"
2) "sess:qsWvzubzparNHNoPyNN/CdVw"

并且这些值是未加密的 JSON。到现在为止还挺好。

但是,cookie 标头包含类似

{ 'connect.sid': 's:lpeNPnHmQ2f442rE87Y6X28C.obCv2x2NT05ieqkmzHnE0VZKDNnqGkcxeQAEVoeoeiU' }

所以现在 SessionStore 和connect.sid不匹配,因为签名部分(在 之后.)从 SessionStore 版本中剥离。

问题是,仅截断 cookie 的 SID 部分(lpeNPnHmQ2f442rE87Y6X28C)并基于此进行匹配是否安全,或者是否应该验证签名部分?如果是这样,怎么做?

4

2 回答 2

2

而不是使用私有方法和 Connect 的内部结构,这不应该以这种方式使用,这个 NPM 很好地包装socket.on了一个拉入会话的方法,并解析和验证 https://github.com /functioncallback/session.socket.io

于 2012-11-08T18:38:27.643 回答
2

只需按照 Connect 的 utils.js 中的注释行的建议使用 cookie-signature 模块。

var cookie = require('cookie-signature');

//假设您已经将来自客户端的会话 ID 放在名为“sid”的 var 中

var sid = cookies['connect.sid'];
sid = cookie.unsign(sid.slice(2),yourSecret);
if (sid == "false") {
   //cookie validation failure
   //uh oh. Handle this error
} else {
   sid = "sess:" + sid;
    //proceed to retrieve from store
}
于 2013-01-08T08:31:16.463 回答