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