【发布时间】:2020-12-30 21:41:34
【问题描述】:
我有一个AsyncWebSocketConsumer,它在接受用户连接之前首先授权用户的凭据 cookie,如下所示:
// consumer.py
class AuthWebSocketConsumer(AsyncWebSocketConsumer):
async def connect(self):
if not(await self.authorized(self.scope)):
await self.close(code=4004)
else:
await self.accept()
但是,在客户端,我将此视为onerror 事件,然后是onclose 事件,Websocket 代码为1006,而不是我发回的4004。
// socket.js
this.log_socket = new WebSocket(url.href);
this.log_socket.onerror = (event) => {
// Happens on Websocket REJECTs
console.log("Socket error", event);
};
this.log_socket.onclose = (event) => {
console.log("Socket closed: ", event);
};
记录的关闭事件是这样的
CloseEvent {isTrusted: true, wasClean: false, code: 1006, reason: "", type: "close", …}
bubbles: false
cancelBubble: false
cancelable: false
code: 1006
似乎 Django 通道没有转发 websocket 关闭代码,或者浏览器屏蔽了错误代码,因为连接从未被接受。在这种情况下,向客户端中继他们未对 Websocket 连接进行身份验证(或其他一些拒绝原因)的正确方法是什么?目前看来,我需要在立即关闭连接之前接受连接 - 这似乎有点像安全漏洞?
【问题讨论】:
标签: javascript python-3.7 django-channels