Джанго не получит заголовок https - PullRequest
0 голосов
/ 08 апреля 2019

Intro

Я создаю веб-приложение, используя последнюю версию Django вместе с python3.7.Приложение докернизировано, и я планирую развернуть его с помощью docker-compose.Внутри контейнера я использую nginx для прокси трафика к приложению, а не выставляю его напрямую.Кроме того, я использую apache на уровне сервера для прокси-трафика к различным другим контейнерам, размещенным на той же машине.

В приложении Django я использую oauth2 для аутентификации в Fitbit Web API, и проблема, с которой я сталкиваюсь, заключается в том, что django-social-auth автоматически передает имя хоста как redirect_uriкоторый теперь, после большого количества настроек со всеми этими прокси, отлично работает в HTTP, но когда я использую HTTPS, хотя приложение обычно отвечает, redirect_uri по-прежнему http, что явно не разрешено fitbit и очень рискованно.

Хотя мне очень трудно определить, на каком уровне возникает проблема, я пробовал разные вещи, но ничего не получается.

То, что я пробовал

Первый

Я пытался заставить мой контейнер прослушивать запрос https, который казался мне наиболее подходящим решением, но прекратил получать 502 ошибки от Apache.Я попытался найти решение по этому вопросу, добавив некоторую конфигурацию в файл виртуального хоста, например

#Solution 1
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://localhost:83/ Keepalive=On #Solution 2 (keep alive)
ProxyPassReverse / https://localhost:83

Но, наконец, я обнаружил, что это не проблема apache, но что nginx внутри контейнера не былотвечая, хотя трафик был перенаправлен на порт 443 с использованием HTTPS

Second

Я пытался перенаправить трафик с HTTPS для Apache на HTTP-контейнером nginx (, который не имеет для меня особого смысла)), что заставляет приложение реагировать нормально, но приводит к ошибке redirect_uri, о которой я упоминал выше

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

Обновление 1

Конфигурация nginx, запрошенная в комментариях

server {

    listen 80;
    listen 443 default_server ssl;
    server_name localhost;
    charset utf-8;

    location /static {
        alias /app/static/;
    }

    location /upload {
        alias /app/media/;
    }

    location / {
        proxy_pass http://web:8000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

1 Ответ

0 голосов
/ 22 апреля 2019

Мне удалось устранить проблему, добавив следующую конфигурацию на settings.py.Я также добавил условный элемент управления, чтобы иметь возможность запускать контейнер в разработке.

# Was already present before the issue resolved but is also needed
USE_X_FORWARDED_HOST = True
# The actual solution
if eval(os.environ.get('DEPLOY', default=False)): 
  SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
  SECURE_SSL_REDIRECT = True
  SESSION_COOKIE_SECURE = True
  CSRF_COOKIE_SECURE = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...