express.js parsing cookies?

express.js parsing cookies?

本文关键字:cookies parsing js express      更新时间:2023-09-26

我正试图使用一个旧的库ballows.io作为聊天应用程序的基础,但它已经过时了,在这个特定的代码中,我正试图找出如何使用express 4x解析cookie以获得sid,而无需从req.session 获得它

既然express 4x不再使用connect,我怎么能在新的express版本中做类似于下面的事情呢?

/*
 * 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);
    }
  });
  });
};

不确定这是否有帮助,但express 4.x中的Cookie解析已提取到cookie-parser包中。我不确定,但你可以用cookieParser.parseSignedCookies`.替换connect.util.parseSignedCookies

这就是我能帮你的全部,因为我还没怎么用socket.io。

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);
    }
  });
}