[英]Django Channels - correct way to reject an unauthorized websocket request?
我有一个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
class AuthWebSocketConsumer(AsyncWebSocketConsumer):
async def connect(self):
await self.accept()
if not(await self.authorized(self.scope)):
await self.close(code=4004)
我看到有人对 stackoverflow 的评论。 它说您需要先接受连接才能发送关闭代码。 不幸的是,我无法找到原始评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.