前因
项目中不是常规的用户认证模式,是license认证模式,故不能采用jwt模式需要写自己的token认证方式,django的中间件对websocket不起作用。
实现
解决方案为使用websocket的Sec-WebSocket-Protocol子协议:
- 前端侧修改 ,在前端新建websocket客户端,将token值加入Sec-WebSocket-Protocol:
var websocket = new WebSocket('ws://url/wsserver/', [token]);
- django侧采用的channels 在继承WebsocketConsumer后的websocket实现类中,通过复写websocket_connect方法实现:
def websocket_connect(self, message):
self.base_send({"type": "websocket.accept", "subprotocol": "token"})