Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 连接签名cookie解析falsy_Javascript_Node.js_Express_Socket.io_Connect - Fatal编程技术网

Javascript 连接签名cookie解析falsy

Javascript 连接签名cookie解析falsy,javascript,node.js,express,socket.io,connect,Javascript,Node.js,Express,Socket.io,Connect,我在尝试解析express/connect应用程序中的签名cookie时遇到问题 io.set('authorization', function (handshakeData, callback) { if(handshakeData.headers.cookie) { var signedCookies = cookie.parse(decodeURIComponent(handshakeData.headers.cookie)); handshake

我在尝试解析express/connect应用程序中的签名cookie时遇到问题

io.set('authorization', function (handshakeData, callback) {
    if(handshakeData.headers.cookie) {
        var signedCookies = cookie.parse(decodeURIComponent(handshakeData.headers.cookie));
        handshakeData.cookie = connect.utils.parseSignedCookies(signedCookies, secret);
    } else {
        return accept('No cookie transmitted', false);
    }
    callback(null, true); // error first callback style 
});
发生的是调用
connect.utils.parseSignedCookies
返回空对象。我查看了parse函数的源代码,发现它调用unsign方法,该方法获取编码值的子字符串,然后尝试使用相同的密码对其再次签名,并比较结果,以验证其是否与编码的值相同,并且由于某些原因它失败,并且值不匹配。我不知道我做错了什么,为什么这些值不同,为什么我无法获得正确的会话ID

我的应用程序初始化代码如下所示:

app.use(express.cookieParser(secret));
app.use(express.session({
    key: 'sessionID',
    secret: secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new RedisStore({
        client: redisClient
    })
}));

请帮我指出我做错了什么。谢谢

cookie解析器是一个中间件,所以我们必须像中间件一样使用它。它将实际填充您传递给它的对象。这是您希望使用解析器的方式:

// we need to use the same secret for Socket.IO and Express
var parseCookie = express.cookieParser(secret);

io.set('authorization', function(handshake, callback) {
  if (handshake.headers.cookie) {
    // pass a req, res, and next as if it were middleware
    parseCookie(handshake, null, function(err) {
      // use handshake.signedCookies, since the
      // cookie parser has populated it
    });
  } else {
    return accept('No session.', false);
  }
  callback(null, true);
});
cookie解析器API已更改,现在看起来是这样的:

module.exports = function cookieParser(secret) {
  return function cookieParser(req, res, next) {
    if (req.cookies) return next();
    var cookies = req.headers.cookie;

    req.secret = secret;
    req.cookies = {};
    req.signedCookies = {};

    if (cookies) {
      try {
        req.cookies = cookie.parse(cookies);
        if (secret) {
          req.signedCookies = utils.parseSignedCookies(req.cookies, secret);
          req.signedCookies = utils.parseJSONCookies(req.signedCookies);
        }
        req.cookies = utils.parseJSONCookies(req.cookies);
      } catch (err) {
        err.status = 400;
        return next(err);
      }
    }
    next();
  };
};

所以我们要做的是将
handshake
作为请求对象传递,解析器将读取
headers.cookie
属性。然后,cookies将被解析,并放入
req.signedCookies
。由于我们将
handshake
作为
req
传递,cookies现在处于
handshake.signedCookies
中。请注意,Cookie仅被签名,因为您将一个
秘密
传递给了解析器。

我在Cookie/sessions/socket.io等方面遇到了左右两方面的问题。最后是@vytautas注释帮助了我。如果有人看到这一点,请确保您连接到了正确的主机,无论您是否将其设置为本地主机或IP地址,或者您拥有什么。否则,您将无法解析传入的Cookie


(事后看来似乎有点明显。)

谢谢你的回答,这样做更有意义,但不幸的是,出于某些原因,它也不起作用。这里是签名和重新签名值的屏幕截图-它仍然不同:我真的不知道还要做什么…解析部分的代码与您的代码几乎相同。但我不确定我是否正确地将其添加为中间件。它先于会话中间件和路由器中间件。等我回家后,我会把所有的代码都发出去,也许会有什么想法……该死的,似乎一切都很好。问题是,在打开浏览器时,我在连接到socketio服务器时使用了IP地址。这导致在发送套接字握手请求时向服务器发送错误的cookie。。。愚蠢的我。。