Bottle -WebSocket: Как убедиться, что HTTP-запрос поступает из того же сеанса, что и ws-соединение? - PullRequest
2 голосов
/ 19 января 2020

Я создал веб-приложение, используя Python Bottle framework. Я использовал плагин bottle-websocket для связи WebSocket с клиентами. Вот часть моего кода.

from bottle import Bottle, request, run
from bottle.ext.websocket import GeventWebSocketServer, websocket

class MyHandler():
    ...

class MyServer(Bottle):

    ...

    def _serve_websocket(self, ws):
        handler = MyHandler()
        some_data = request.cookies.get('some_key') # READ SOME DATA FROM HTTP REQUEST

        while True:
            msg = ws.receive()
            handler.do_sth_on(msg, some_data) # USE THE DATA FROM HTTP REQUEST
            ws.send(msg)

        del(handler)

if __name__ == '__main__':
    run(app=MyServer(), server=GeventWebSocketServer, host=HOST, port=PORT)

Как показывает код, мне нужно прочитать некоторые данные из браузера (файлы cookie или что-либо в заголовках HTTP-запроса) и использовать их для обработки сообщений WebSocket.

Как я могу убедиться, что запрос поступил из того же сеанса браузера, что и сеанс подключения WebSocket?

ПРИМЕЧАНИЕ

Как и я Я не очень разбираюсь в HTTP и WebSocket, я бы хотел здесь подробно рассказать о них.

1 Ответ

0 голосов
/ 19 января 2020

Как я могу убедиться, что запрос поступил из того же сеанса браузера, что и сеанс подключения WebSocket?

Сеанс браузера немного абстрактен, поскольку HTTP не иметь понятия сессий . API-интерфейсы HTTP и RESTful разработаны для без сохранения состояния , но есть варианты.

Обычно обычно вы хотите узнать, от какого пользователя исходит запрос. Обычно это решается с помощью аутентификации , например, с помощью OpenID Connect и позволяет пользователю отправлять свой JWT-токен в заголовке Authorization:, это работает для всех HTTP-запросов, в том числе при настройке подключение к Websocket.

bottle -oauthlib представляется библиотекой для аутентификации конечных пользователей с использованием OAuth2 / OpenID Connect.

Другой вариант - определить " сессия браузера "с использованием cookie , но это зависит от состояния где-то на стороне сервера и сложнее реализовать на облачных платформах, таких как Kubernetes, которые предпочитают без сохранения состояния рабочих нагрузок .

...