Socket.io-client: 错误的握手方法(仅当使用额外的标头时!)

创建于 2017-06-23  ·  13评论  ·  资料来源: socketio/socket.io-client

你想要:

  • [x] 报告错误
  • [ ] 请求一个功能

当前行为

当我尝试使用额外的标头连接我的服务器时,我收到一个带有消息{"code":2,"message":"Bad handshake method"}的 400(如果我不尝试添加它就可以正常工作)。

重现步骤(如果当前行为是错误)

我尝试使用以下配置连接我的服务器:

  const options = {
    transportOptions: {
      polling: {
        extraHeaders: {
          Authorization: "Bearer test"
        }
      }
    }
  };

我还注意到,当我添加这个额外的标头时会发出一个 OPTIONS 请求(而不是当我不添加它时的 GET)

预期行为

带有不会破坏握手的额外标头的 get GET 请求(以保留 cookie)。

设置

  • 操作系统:Mac
  • 浏览器:Chrome 58
  • socket.io 版本:2.0.3

最有用的评论

你好! 我认为您必须在服务器端添加正确的标头(似乎您处于 CORS 情况):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

我在那里添加了一个例子: https :

所有13条评论

同样的问题,在这里 .. 完全适用于 nodejs 版本的 socket.io-client 虽然不是浏览器

  • 操作系统:赢
  • 浏览器:Chrome 59
  • socket.io 版本:2.0.3

你好! 我认为您必须在服务器端添加正确的标头(似乎您处于 CORS 情况):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

我在那里添加了一个例子: https :

@darrachequesne如何为源指定多个域,以下方法不起作用:

  1. 'Access-Control-Allow-Origin': ' http://localhost :3001, http://localhost :3002'
  2. 'Access-Control-Allow-Origin': [' http://localhost :3001, http://localhost :3002']
  3. '访问控制-允许-来源':' http://localhost :3001 http://localhost :3002'

@DaVincii您不能使用多个域,您需要读取客户端标头来源并再次检查您的白名单。

在stackoveflow上看到这个这个

@DaVincii我定义为空,但被释放到任何域。

常量头 = {
'Access-Control-Allow-Headers':'内容类型,授权',
'Access-Control-Allow-Origin':空,
“访问控制允许凭据”:true
};

供 CORS 使用
{
处理预检请求:函数(req,res){
变量头 = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': req.headers.origin ,
“访问控制允许凭据”:true
};
res.writeHead(200, 标题);
重发();
}
}

供 CORS 使用
{
处理预检请求:函数(req,res){
变量头 = {
'Access-Control-Allow-Headers':'内容类型,授权',
'Access-Control-Allow-Origin': req.headers.origin ,
“访问控制允许凭据”:true
};
res.writeHead(200, 标题);
重发();
}
}

“访问控制允许来源”:req.headers.origin
这只是拯救了我的一天! 当我使用:
'Access-Control-Allow-Origin': ' ',它会给我以下错误:"当请求的凭证模式为'include'时

这似乎不再适用于最新的 socket.io。 打字稿不喜欢它。 无论如何要解决?
image

这似乎不再适用于最新的 socket.io。 打字稿不喜欢它。 无论如何要解决?

@supertiger1234 handlePreflightRequest在最新版本有不同的界面

Screenshot 2020-07-20 at 20 16 00

所以在你的情况下它应该是:

...
handlePreflightRequest: function(server, req, res) {
  var headers = {
    "Access-Control-Allow-Headers": "Content-Type, Authorization",
    "Access-Control-Allow-Origin": config.allowedOrigins,
    "Access-Control-Allow-Credentials": true,
  };

  res.writeHead(200, headers);
  res.end();
...

@supertiger1234 handlePreflightRequest 最新版本有不同的接口

⚠️ 如果您现在从 npm 安装 socket.io,您将拥有旧版本,但是如果您安装typings(通过@types),它将拥有新的typings! 这可能是超级误导。

如何安装最新的socket io?

供将来参考:当使用 3.0 后的服务器和 3.0 之前的客户端时,也会出现此问题。 这可能是由于缓存配置错误导致客户端使用旧版本的socket.io.js

对于未来的读者,请参阅:

  • v2 的 CORS 文档: https :
  • v3 的 CORS 文档: https :
此页面是否有帮助?
0 / 5 - 0 等级