gunicorn 的 Nginx 反向代理-无法将基本身份验证凭据传递给服务器

gunicorn 的 Nginx 反向代理-无法将基本身份验证凭据传递给服务器

我已经将 nginx 设置为在 Heroku 上运行的 django 站点的 gunicorn 反向代理。我将 Anymail 用于我的邮件列表,它需要接收 webhook 的基本身份验证凭据(我实际上不需要设置基本身份验证,我只需要传递带有凭据的标头)。

但我似乎无法将凭据传递给服务器。

奇怪的是,这是有效的,我可以访问HTTP_AUTHORIZATIONDjango 中的标头,其值为“test”,正如预期的那样:

proxy_set_header Authorization "test"; 

但这不起作用,HTTP_AUTHORIZATIONDjango 没有找到任何标头:

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;

        }

    }
}

答案1

好的,我发现了问题——我已经在 Chrome 和 Firefox 上通过在 URL 栏中输入内容进行了测试。foo:[email protected]/authtest

事实证明,最近这些浏览器已经开始悄悄地删除凭据,除非页面上确实设置了基本身份验证。由于我只想将凭据传递给 Django,页面上没有基本身份验证,因此它们被删除了。

测试https://httpstatus.io/并明确设置标题,并且凭据被正确传递。

相关内容