【发布时间】:2020-03-06 08:13:27
【问题描述】:
我正在使用 Django、Django Channels 和 React 开发一个国际象棋网络应用程序。我正在使用 websockets 来进行在线玩家之间的游戏,以及更新哪些玩家现在在线并且可以玩。但是我被困在身份验证部分。我首先从令牌身份验证开始,但我发现无法将带有令牌的自定义标头作为 websocket 请求的一部分发送。然后我回到默认的 django.contrib.auth 会话身份验证。不幸的是,当客户端登录并连接到 websocket 时,我无法获取他们的用户信息,就好像用户正在使用与 websocket 的不同会话一样。当我在 websocket 消费者中打印 self.scope["user"] 时,我得到了值 AnonymousUser。请注意,我可以使用 websocket 交换消息,并且身份验证适用于正常的 http 请求,因为我可以阻止未登录的用户访问视图。
我猜这个问题与客户端的 websocket 请求没有像 http 请求一样访问或使用 cookie 进行身份验证有关。
有没有人遇到过类似的问题,他们是如何解决的?
这就是我在 react 中发送 websocket 消息的方式:
submitMessage = (evt) => {
//console.log("token in Messenger=",this.props.token);
evt.preventDefault();
const message = { message: this.state.message_to_send}
this.ws.send(JSON.stringify(message))
}
这是处理 websocket 请求的后端代码:
from channels.generic.websocket import WebsocketConsumer
import json
from asgiref.sync import async_to_sync
class LoggedUsersConsumer(WebsocketConsumer):
def connect(self):
self.user = self.scope["user"]
print(self.scope)
print(self.user,"+++++++++++++")
#Join group
async_to_sync(self.channel_layer.group_add)(
"logged_users",
self.channel_name
)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
"logged_users",
self.channel_name
)
def receive(self, text_data):
self.user = self.scope["user"]
print(self.user,"+++++++++++++")
text_data_json = json.loads(text_data)
print(text_data_json)
message = text_data_json['message']
# Send message to room group
async_to_sync(self.channel_layer.group_send)(
"logged_users",
{
'type': 'logged_user_message',
'message': message
}
)
def logged_user_message(self, event):
message = event['message']
# Send message to WebSocket
self.send(text_data=json.dumps({
'message': message
}))
【问题讨论】:
标签: django reactjs authentication websocket django-channels