问题描述
我有一个AsyncWebSocketConsumer
,它在接受用户的连接之前首先对其进行授权,如下所示:
// 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
事件,随后是带有Websocket代码onclose
而不是1006
的{{1}}事件发回。
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);
};
似乎Django渠道未转发websocket关闭代码,或者浏览器由于未接受连接而掩盖了错误代码。在哪种情况下,中继未通过Websocket连接认证的客户端的正确方法是什么(或其他拒绝原因)?目前看来,我需要先接受连接再立即关闭它-这似乎有点像安全漏洞?
解决方法
我曾经遇到过同样的问题,并按如下方式解决了它:
// consumer.py
class AuthWebSocketConsumer(AsyncWebSocketConsumer):
async def connect(self):
await self.accept()
if not(await self.authorized(self.scope)):
await self.close(code=4004)
我看到某人对stackoverflow的评论。它说您需要先接受连接才能发送关闭代码。不幸的是,我找不到原始评论。