【问题标题】:Django Channels - correct way to reject an unauthorized websocket request?Django Channels - 拒绝未经授权的 websocket 请求的正确方法?
【发布时间】: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


    【解决方案1】:

    我曾经遇到过同样的问题,解决方法如下:

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

    【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2012-08-17
    相关资源
    最近更新 更多