You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chromium内核浏览器传递协议参数连接本地WebSocket失败怎么办

问题根因

这不是浏览器bug,是WebSocket RFC规范的强制要求,不同浏览器校验严格度不同导致的差异:

  • WebSocket构造函数的第二个参数用于声明Sec-WebSocket-Protocol协商协议,当你传入自定义的authtoken作为协议值时,服务端必须在握手响应头中返回完全匹配的Sec-WebSocket-Protocol: authtoken字段
  • Chrome、Edge严格遵循RFC6455规范,服务端未返回对应协议头时会直接主动断开连接,抛出1006错误
  • Firefox对该规则校验宽松,即使服务端未返回对应头也允许连接建立,所以才会出现火狐正常、Chromium内核浏览器失败的情况
Django Channels 修复方案

根据你认证逻辑的位置,选择对应的修改方式:

  1. 如果认证逻辑在Consumer内部:
    修改connect方法,接受连接时指定和前端一致的subprotocol参数
# 你的Consumer代码
async def connect(self):
    # 原有身份校验逻辑
    # ...
    # 接受连接时传入subprotocol,和前端传的authtoken完全一致
    await self.accept(subprotocol="authtoken")
  1. 如果认证逻辑在Channels中间件中:
    在中间件处理握手响应的逻辑中,手动添加Sec-WebSocket-Protocol响应头,值为前端传入的协议值即可。
验证方法

打开Chrome/Edge开发者工具的「网络」面板,筛选「WS」类型的请求,找到对应WebSocket握手请求,确认响应头中存在Sec-WebSocket-Protocol: authtoken即可。

内容的提问来源于stack exchange,提问作者Sumeth Sathnindu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:45:02