【发布时间】: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