Javascript Django通道-拒绝未经授权的websocket请求的正确方法?

Javascript Django通道-拒绝未经授权的websocket请求的正确方法?,javascript,python-3.7,django-channels,Javascript,Python 3.7,Django Channels,我有一个AsyncWebSocketConsumer,它在接受用户的连接之前首先授权用户的凭据cookie,因此: // consumer.py class AuthWebSocketConsumer(AsyncWebSocketConsumer): async def connect(self): if not(await self.authorized(self.scope)): await self.close(code

我有一个
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连接的身份验证(或其他拒绝原因)?目前看来,我需要在立即关闭连接之前接受连接-这似乎有点像一个安全漏洞?

我曾经遇到过同样的问题,并解决了它,如下所示:

//consumer.py
类AuthWebSocketConsumer(AsyncWebSocketConsumer):
异步def连接(自):
等待自我接受
如果没有(等待自我授权(自我范围)):
等待自我关闭(代码=4004)
我看到有人对stackoverflow的评论。它说你需要先接受连接才能发送关闭代码。不幸的是,我找不到最初的评论