【问题标题】:AWS API Gateway Websocket - Chrome: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was receivedAWS API Gateway Websocket - Chrome:WebSocket 握手期间出错:发送非空“Sec-WebSocket-Protocol”标头但未收到响应
【发布时间】:2020-06-17 16:37:32
【问题描述】:

我正在尝试使用 AWS API Gateway 的 WebSocket 功能与我的 Angular 应用程序进行通信。根据企业要求,我需要使用 OAuth 令牌保护我的 WebSocket 端点。

我编写了一个自定义 OAuth 授权器来验证 OAuth 令牌。

此自定义授权方可以正常使用我的 REST 端点。

据我了解,浏览器不支持 WebSocket 的自定义标头 (HTTP headers in Websockets client API)。

为了绕过这个限制,我使用 Sec-WebSocket-Protocol 标头来传递我的 OAuth 令牌以进行身份​​验证。

(基于查询字符串的身份验证可能对我不起作用,因为我会超出 URL 字符串限制)

我已将 API 网关的配置配置为接受 Sec-WebSocket-Protocol 作为身份验证标头,并且使用 WSCAT 实用程序似乎一切正常。

当我使用 RxJS (https://rxjs-dev.firebaseapp.com/api/webSocket/webSocket) 将此端点与我的 Angular 客户端集成时,整个解决方案在 FireFox 和 Edge 浏览器中运行良好,但 Chrome 会引发握手异常,即

WebSocket connection to 'wss://xxxx.com/' failed: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received

请求标头:

GET wss://xxxx.com/ HTTP/1.1
Host: xxxx.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost:4200
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Sec-WebSocket-Key: asdf
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Protocol: asdf

响应标头:

HTTP/1.1 101 Switching Protocols
Connection: upgrade
Date: Tue, 11 Jun 2019 06:15:43 GMT
upgrade: websocket
sec-websocket-accept: asdf
sec-websocket-extensions: permessage-deflate
X-Cache: Miss from cloudfront
Via: 1.1 asdf
X-Amz-Cf-Pop: BOM51
X-Amz-Cf-Id: asdf

【问题讨论】:

  • 这似乎很奇怪,切换协议应该是 HTTP 请求的响应而不是 wss 请求。 HTTP 请求升级到 ws。
  • 是的,我也有同样的感觉。但是,奇怪的是,感觉 AWS Websocket 对于生产就绪部署来说仍然不够可靠。
  • 我没见过aws websocket有问题,我觉得是测试有问题。
  • 我想这肯定是一个错误,在 AWS WebSocket forums.aws.amazon.com/thread.jspa?messageID=883536&tstart=0

标签: node.js amazon-web-services google-chrome websocket aws-api-gateway


【解决方案1】:

这是 AWS WebSocket API 中长期存在的错误

https://forums.aws.amazon.com/thread.jspa?messageID=883536&tstart=0

【讨论】:

    【解决方案2】:

    很高兴地报告此问题现已添加到 API-Gateway,因此现在您需要更新您的 Lambda 函数以返回正确的 Sec-WebSocket-Protocol 标头: https://docs.aws.amazon.com/apigateway/latest/developerguide/websocket-connect-route-subprotocol.html

    【讨论】:

    • 是否可以在 $connect 上加上这种 return 和 authorizer 方法?
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 2019-04-05
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多