簡體   English   中英

Django Channels - 拒絕未經授權的 websocket 請求的正確方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM