将授权凭据发送到 Django-channels WebSocket(不将令牌设置为 cookie)
Send Authorization Credentials to Django-channels WebSocket (without setting token as cookie)
我有一个 websocket,我想在 opennig 上使用握手令牌授权 进行身份验证。我在寻找这个问题的答案,几乎所有人都建议先用 javascript 存储授权 cookie,然后连接到网络套接字(这样 header 将从存储在网页中的 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 套接字连接建立后,立即将令牌发送到服务器。在服务器(在我的例子中是 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()
我有一个 websocket,我想在 opennig 上使用握手令牌授权 进行身份验证。我在寻找这个问题的答案,几乎所有人都建议先用 javascript 存储授权 cookie,然后连接到网络套接字(这样 header 将从存储在网页中的 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 套接字连接建立后,立即将令牌发送到服务器。在服务器(在我的例子中是 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()