Назад | Перейти на главную страницу

Обратный прокси-сервер Nginx для Gunicorn - проблема с передачей базовых учетных данных на сервер

Я установил nginx в качестве обратного прокси-сервера для Gunicorn для сайта django, работающего на Heroku. Я использую Anymail для своего списка рассылки, и он должен получать базовые учетные данные для веб-перехватчиков (на самом деле мне не нужно настраивать базовую аутентификацию, мне просто нужно передать заголовок с учетными данными).

Однако я не могу передать учетные данные на сервер.

Странно то, что это работает, и я могу получить доступ к HTTP_AUTHORIZATION заголовок в Django, который, как и ожидалось, имеет значение "test":

proxy_set_header Authorization "test"; 

Но это не работает, и нет HTTP_AUTHORIZATION заголовок найден Django:

proxy_set_header Authorization $http_authorization; 

Вот мой nginx.conf.erb:

daemon off;
#Heroku dynos have at least 4 cores.
worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>;

events {
    use epoll;
    accept_mutex on;
    worker_connections 1024;
}

http {

    server_tokens off;

    include mime.types;
    default_type application/octet-stream;

    #Must read the body in 5 seconds.
    client_body_timeout 5;

    upstream app_server {
        server unix:/tmp/nginx.socket fail_timeout=0;
    }

    server {
        listen <%= ENV["PORT"] %>;

        server_name example.com "";

        keepalive_timeout 5;

        location / {

            proxy_set_header Host $host;
            proxy_pass http://app_server;

        }

        location /authtest {

            proxy_set_header Host $host;
            proxy_pass http://app_server;

            # this doesn't work - no HTTP_AUTHORIZATION header found by Django
            #proxy_set_header Authorization $http_authorization; 

            # this does work and returns the value "test" for the HTTP_AUTHORIZATION header 
            proxy_set_header Authorization "test"; 

            # tested enabling and disabling these, they don't appear to make a difference
            #proxy_pass_header Authorization; 
            #proxy_set_header X-Forwarded-User $remote_user;

        }

    }
}

Хорошо, я обнаружил проблему - я тестировал ее в Chrome и Firefox, набрав foo:bar@mysite.com/authtest в адресную строку.

Оказывается, недавно эти браузеры начали незаметно удалять учетные данные, если на странице действительно не настроена базовая аутентификация. Поскольку я просто хочу передать учетные данные Django, на странице нет базовой аутентификации, поэтому они были удалены.

Тестирование с https://httpstatus.io/ и явно устанавливая заголовок, и учетные данные передаются правильно.