Я занимаюсь разработкой шахматного веб-приложения с использованием Django, Django Channels и React. Я использую веб-розетки для игры между онлайн-игроками и для получения информации о том, какие игроки теперь онлайн и доступны для игры. Однако я застрял на части аутентификации. Сначала я начал с аутентификации токена, но обнаружил, что невозможно отправлять пользовательские заголовки с токеном в них как часть запроса websocket. Затем я вернулся к стандартной аутентификации сеанса django.contrib.auth. К сожалению, когда клиент входит в систему и подключается к веб-сокету, я не могу получить информацию о его пользователе, как будто пользователь использует другой сеанс с веб-сокетом. Я получаю значение AnonymousUser , когда печатаю self.scope ["user"] в пользователях веб-сокетов. Обратите внимание, что я могу обмениваться сообщениями с помощью веб-сокета, и аутентификация хорошо работает с обычными http-запросами, поскольку я могу предотвратить доступ к представлениям пользователей, которые не вошли в систему.
Я предполагаю, что проблема связана с тем фактом, что запросы веб-сокетов на стороне клиента не обращаются к cookie-файлам и не используют их для аутентификации, как запросы http.
Кто-нибудь сталкивался с подобнымпроблема и как они это исправили?
Вот как я отправляю сообщение 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
}))