OAuthlib считает запрос небезопасным из-за обратного прокси-сервера

Я заметил, что для каждого запроса, request.scheme является http. Я не могу найти никаких официальных источников, но мои коллеги сказали, что это происходит из-за того, что Cloudflare действует как обратный прокси и терминатор tls, заставляя хостинг-провайдера моего сервера видеть http вместо https.

Одна часть моего приложения использует Google Classroom API, и я настроил обратный вызов на безопасную конечную точку моего сервера. При попытке получить токен из абсолютного uri обратного вызова oauthlib выдает ошибку oauthlib.oauth2.rfc6749.errors.InsecureTransportError: (insecure_transport) OAuth 2 MUST utilize https., поскольку считает, что запрос является http и небезопасным. Я исследовал и обнаружил, что могу установить os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' для смягчения этой проблемы, но я не решаюсь сделать это, потому что не уверен, не нарушит ли это безопасность.

Мой мыслительный процесс заключается в том, чтобы вручную изменить url запроса на https, когда я абсолютно уверен, что он безопасен. Если проанализировать request.META на предмет того, какие заголовки устанавливаются в случае обратного проксированного http-запроса, то код выглядит следующим образом:

authorization_response = request.build_absolute_uri()
if (
    authorization_response.startswith("http://") and
    request.META["HTTP_X_FORWARDED_PROTO"] == "https" and
    request.META["HTTP_ORIGIN"].startswith("https") and
    json.loads(request.META["HTTP_CF_VISITOR"])['scheme'] == "https"
):
    authorization_response = "https://" + authorization_response[7:]

... fetch the token passing authorization_response and etc

который, кажется, работает.

Учитывая, как мало информации я смог найти об этом в сети, мне интересно, является ли это лучшей практикой и есть ли лучший способ сообщить oauthlib, что запрос безопасен. Или, поскольку мой домен имеет предварительную загрузку HSTS, все это не нужно, и я могу обойтись установкой os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'?

Вернуться на верх