向 Django-channels WebSocket 发送授权凭证(不将令牌设置为 cookie)

Posted

技术标签:

【中文标题】向 Django-channels WebSocket 发送授权凭证(不将令牌设置为 cookie)【英文标题】:Send Authorization Credentials to Django-channels WebSocket (without setting token as cookie) 【发布时间】:2018-12-06 12:00:32 【问题描述】:

我有一个 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>

【问题讨论】:

【参考方案1】:

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

在网络套接字连接建立后,立即将令牌发送到服务器。在接收方法中的服务器(在我的情况下为 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));

;

在服务器端(例如 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()

【讨论】:

以上是关于向 Django-channels WebSocket 发送授权凭证(不将令牌设置为 cookie)的主要内容,如果未能解决你的问题,请参考以下文章

向 Django-channels WebSocket 发送授权凭证(不将令牌设置为 cookie)

django-channels/websockets: WebSocketBadStatusException: 握手状态 200

在真实服务器中部署 django-channels 的最佳方式

在负载均衡器后面运行多个 daphne 实例:django-channels

使用 Apache2 和 Daphne 部署 django-channels

Django-Channels 中的类型错误