Подтвердить что ты не робот

При подключении tornado v4 + WebSocket получают отказ с 403

У меня есть старый сервер торнадо, который обрабатывает соединения ванили WebSocket. Я прокси эти подключения, через Nginx, от wss://info.mydomain.com до wss://mydomain.com: 8080, чтобы обойти клиентские прокси, которые блокируют нестандартные порты.

После недавнего обновления до Tornado 4.0 все соединения получают отказ от 403. Что вызывает эту проблему и как я могу ее исправить?

4b9b3361

Ответ 1

Tornado 4.0 внедрил по умолчанию ту же проверку происхождения. Это проверяет, что заголовок источника, заданный браузером, совпадает с заголовком хоста

Код выглядит следующим образом:

 def check_origin(self, origin):
    """Override to enable support for allowing alternate origins.

    The ``origin`` argument is the value of the ``Origin`` HTTP header,
    the url responsible for initiating this request.

    .. versionadded:: 4.0
    """
    parsed_origin = urlparse(origin)
    origin = parsed_origin.netloc
    origin = origin.lower()

    host = self.request.headers.get("Host")

    # Check to see that origin matches host directly, including ports
    return origin == host

Для того, чтобы ваше соединение с прокси-сервером продолжало работать, вам необходимо переопределить происхождение проверки в WebSocketHandler и присваивать белый список доменам, которые вас интересуют. Что-то вроде этого.

import re
from tornado import websocket

class YouConnection(websocket.WebSocketHandler):

    def check_origin(self, origin):
        return bool(re.match(r'^.*?\.mydomain\.com', origin))

Это приведет к тому, что соединения, проходящие через info.mydomain.com, пройдут по-прежнему.

Ответ 2

Я хотел бы предложить альтернативное решение, вместо того, чтобы возиться с кодом приложения торнадо, я решил проблему, указав nginx на исправление заголовка узла:

location /ws {
proxy_set_header Host $host;
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}