Отправить учетные данные для авторизации на Django-каналы WebSocket (без установки токена в качестве cookie) - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть веб-сокет, который я хочу аутентифицировать с помощью Token Authorization при рукопожатии при opennig.Я искал ответы на эту проблему, и почти все они предложили сначала сохранить файл cookie авторизации с помощью javascript, а затем подключиться к веб-сокету (поэтому заголовок будет отправлен из файла cookie, сохраненного на веб-странице).

Но я предпочитаюНе сохраняйте токен в файле cookie браузера, а просто отправляйте его в моей области запроса веб-сокета.

Вот простой код 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>

1 Ответ

0 голосов
/ 06 декабря 2018

Я нашел решение.Поправьте меня, если я ошибаюсь.

Сразу после установления соединения через веб-сокет отправьте токен на сервер.И в Сервере (в моем случае каналы 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()
...