Django Channels-拒绝未经授权的Websocket请求的正确方法吗?

问题描述

我有一个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);
};

enter image description here

似乎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的评论。它说您需要先接受连接才能发送关闭代码。不幸的是,我找不到原始评论。