簡體   English   中英

將授權憑證發送到Django通道WebSocket(無需將令牌設置為cookie)

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

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