【问题标题】:express.js parsing cookies?express.js 解析 cookie?
【发布时间】:2023-03-03 17:10:02
【问题描述】:

我正在尝试使用旧库 balloons.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);
    }
  });

  });

};

【问题讨论】:

    标签: javascript node.js cookies express


    【解决方案1】:

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

    这就是我能帮到你的全部了,因为我还没有经常使用 socket.io。

    【讨论】:

    • 是的,我看到了,你是对的。但是我不知道如何在没有 req 对象的情况下获取 sid。
    • 我不确定 hsData 是什么,但如果 sid 的值存储在签名的 cookie 'balloons' 中,并且你有可用的秘密,那么你应该能够得到它的值不知何故。也许尝试查看 cookie-parser 源并查看哪个函数做了什么。
    • 你最后做了什么?
    • 我回答了,基本上var cookies = cookie.parse(handshake.headers.cookie); var sid = cookieParser.signedCookie(cookies['balloons'], secrets.sessionSecret);
    【解决方案2】:
    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);
        }
      });
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2020-01-06
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 2013-03-07
      相关资源
      最近更新 更多