[英]Send Authorization Credentials to Django-channels WebSocket (without setting token as cookie)
我有一個websocket,我想通過opennig 上的握手通過令牌授權進行身份驗證。 我尋找了這個問題的答案,幾乎所有建議都建議先使用javascript存儲授權cookie,然后再連接到Web套接字(因此標頭將從存儲在網頁中的cookie發送出去)。
但是我更喜歡不將令牌存儲在瀏覽器cookie中,而只是將其發送到我的websocket請求范圍中。
這是連接到websocket的簡單javascript代碼。 如果有人在這種情況下對我有幫助,我真的很感激:
<script>
const socket = new WebSocket('ws://localhost:8001/announcement');
socket.onopen = function open() {
console.log('WebSockets connection created.');
};
// Listen for messages
socket.addEventListener('announcement', function (event) {
console.log('Message from server ', event.data);
});
</script>
我找到了解決方案。 如果我錯了糾正我。
建立Web套接字連接后,立即將令牌發送到服務器。 然后在Server(在我的情況下為django通道)的receive方法中,獲取該令牌,如果令牌有效,則更新連接信息,如果令牌無效,則斷開連接。
像這樣的東西:
js文件:
const socket = new WebSocket('ws://localhost:8001/announcement');
socket.onopen = function open() {
console.log('WebSockets connection created.');
let authData = {'token': '<valid-token-here>'}
socket.send(JSON.stringify(authData));
};
在服務器端(例如django):
def receive(self, text_data=None, bytes_data=None):
if self.scope['user'].id:
pass
else:
try:
# It means user is not authenticated yet.
data = json.loads(text_data)
if 'token' in data.keys():
token = data['token']
user = fetch_user_from_token(token)
self.scope['user'] = user
except Exception as e:
# Data is not valid, so close it.
print(e)
pass
if not self.scope['user'].id:
self.close()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.