Javascript 向Django Channel WebSocket发送授权凭据(不将令牌设置为cookie)

Javascript 向Django Channel WebSocket发送授权凭据(不将令牌设置为cookie),javascript,websocket,django-rest-framework,authorization,django-channels,Javascript,Websocket,Django Rest Framework,Authorization,Django Channels,我有一个websocket,我想在opennig上通过握手时的令牌授权进行身份验证。我在寻找这个问题的答案,几乎所有人都建议先用javascript存储授权cookie,然后连接到web套接字(因此标题将从存储在web页面中的cookie发送) 但我不希望将令牌存储在浏览器cookie中,而只是将其发送到我的websocket请求范围中 下面是一个连接到websocket的简单javascript代码。如果有人能在这方面帮助我,我真的很感激: <script> const socke

我有一个websocket,我想在opennig上通过握手时的令牌授权进行身份验证。我在寻找这个问题的答案,几乎所有人都建议先用javascript存储授权cookie,然后连接到web套接字(因此标题将从存储在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>

constsocket=newwebsocket('ws://localhost:8001/announcement');
socket.onopen=函数打开(){
log('WebSockets连接已创建');
};
//听消息
socket.addEventListener('announcement',函数(事件){
console.log('来自服务器的消息',event.data);
});

我找到了一个解决方案。如果我错了,请纠正我

建立web套接字连接后,立即将令牌发送到服务器。在receive方法中的Server(在我的例子中是django通道)中,我获取该令牌,如果令牌有效,我更新连接信息,如果令牌无效,则断开连接

大概是这样的:

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));

};
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()