Как использовать сеансовую аутентификацию Django с каналами Django? - PullRequest
0 голосов
/ 10 ноября 2019

Я занимаюсь разработкой шахматного веб-приложения с использованием 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
        }))
...