Я установил 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/ и явно устанавливая заголовок, и учетные данные передаются правильно.