2015-06-26 2 views
1

Я пытаюсь использовать старую библиотеку balloons.io в качестве базы для приложения для чата, но это совершенно устарело, в этом конкретном коде я пытаюсь выяснить, как использовать экспресс-4x для разбора файла cookie, чтобы получить sid не получая его от req.sessionexpress.js разбор куки?

Поскольку express 4x больше не использует connect, как я могу сделать что-то похожее на приведенное ниже, но в новой экспресс-версии?

/* 
* Module dependencies 
*/ 

var sio = require('socket.io') 
    , parseCookies = require('connect').utils.parseSignedCookies 
    , cookie = require('cookie') 
    , fs = require('fs'); 

/** 
* Expose Sockets initialization 
*/ 

module.exports = Sockets; 

/** 
* Socket.io 
* 
* @param {Express} app `Express` instance. 
* @param {HTTPServer} server `http` server instance. 
* @api public 
*/ 

function Sockets (app, server) { 
    var config = app.get('config'); 
    var client = app.get('redisClient'); 
    var sessionStore = app.get('sessionStore'); 

    var io = sio.listen(server); 
    io.set('authorization', function (hsData, accept) { 
    if(hsData.headers.cookie) { 
     var cookies = parseCookies(cookie.parse(hsData.headers.cookie), config.session.secret) 
     , sid = cookies['balloons']; 

     sessionStore.load(sid, function(err, session) { 
     if(err || !session) { 
      return accept('Error retrieving session!', false); 
     } 

     hsData.balloons = { 
      user: session.passport.user, 
      room: /\/(?:([^\/]+?))\/?$/g.exec(hsData.headers.referer)[1] 
     }; 

     return accept(null, true); 

     }); 
    } else { 
     return accept('No cookie transmitted.', false); 
    } 
    }); 

    }); 

}; 

ответ

0

Не уверены, если это поможет, но Cookie разбора в экспрессе 4.x была добыта в cookie-parser пакета. Я не уверен, но вы можете обменять connect.util.parseSignedCookies на cookieParser.parseSignedCookies`.

Это все, что я могу вам помочь, поскольку я еще не использовал socket.io.

+0

Да, я видел это, вы правы. Однако я не могу понять, как получить sid без объекта req. –

+1

Я не уверен, что такое hsData, но если значение sid хранится в подписанных «воздушных шарах» cookie, и у вас есть секретный доступ, то вы должны как-то получить его значение. Возможно, попробуйте взглянуть на источник cookie-parser и посмотреть, какая функция делает что. –

+0

ОК, спасибо, ты прав! –

0
function Sockets (app, server, pub, sub, sessionStore) { 
    var config = app.get('config'); 
    var secrets = require('./config/secrets'); 
    var client = pub; 

    var io = sio.listen(server); 
    io.set('authorization', function (handshake, callback) { 

    if(handshake.headers.cookie) { 

     // pay attention here, this is how you parse, make sure you use 
     // cookie-parser and cookie 
     var cookies = cookie.parse(handshake.headers.cookie); 
     var sid = cookieParser.signedCookie(cookies['balloons'], secrets.sessionSecret); 

     // get the session data from the session store 
     sessionStore.load(sid, function(err, session) { 
     if(err || !session) { 
      return callback('Error retrieving session!', false); 
     } 

     // this is not storing the data into the handshake object 
     handshake.headers.xygaming = { 
      user: session.passport.user, 
      room: /\/(?:([^\/]+?))\/?$/g.exec(handshake.headers.referer)[1] 
     }; 

     return callback(null, true); 

     }); 

    } else { 
     return callback('No cookie transmitted.', false); 
    } 
    }); 

}