Chromium内核浏览器传递协议参数连接本地WebSocket失败怎么办
问题根因
这不是浏览器bug,是WebSocket RFC规范的强制要求,不同浏览器校验严格度不同导致的差异:
- WebSocket构造函数的第二个参数用于声明
Sec-WebSocket-Protocol协商协议,当你传入自定义的authtoken作为协议值时,服务端必须在握手响应头中返回完全匹配的Sec-WebSocket-Protocol: authtoken字段 - Chrome、Edge严格遵循RFC6455规范,服务端未返回对应协议头时会直接主动断开连接,抛出1006错误
- Firefox对该规则校验宽松,即使服务端未返回对应头也允许连接建立,所以才会出现火狐正常、Chromium内核浏览器失败的情况
Django Channels 修复方案
根据你认证逻辑的位置,选择对应的修改方式:
- 如果认证逻辑在Consumer内部:
修改connect方法,接受连接时指定和前端一致的subprotocol参数
# 你的Consumer代码 async def connect(self): # 原有身份校验逻辑 # ... # 接受连接时传入subprotocol,和前端传的authtoken完全一致 await self.accept(subprotocol="authtoken")
- 如果认证逻辑在Channels中间件中:
在中间件处理握手响应的逻辑中,手动添加Sec-WebSocket-Protocol响应头,值为前端传入的协议值即可。
验证方法
打开Chrome/Edge开发者工具的「网络」面板,筛选「WS」类型的请求,找到对应WebSocket握手请求,确认响应头中存在Sec-WebSocket-Protocol: authtoken即可。
内容的提问来源于stack exchange,提问作者Sumeth Sathnindu
相关产品推荐
相关产品推荐

