Nginx auth_request 和 auth_basic

Nginx auth_request 和 auth_basic

我正在尝试配置 nginx 在访问资源之前进行用户身份验证。目前我的配置如下:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    location = /test {
    satisfy any;
        auth_basic "test";
        auth_basic_user_file "/usr/local/nginx/htpasswd";        
        auth_request /auth;
        proxy_pass http://localhost:9000/;

    }
    location = /auth {
        proxy_pass http://192.168.111.101:8080/auth;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }
}

所以我想要发生的是 nginx 应该使用“auth_basic”程序向用户询问密码。(这将失败,因为用户不在 auth_basic_user_file 中)

然后 nginx 应该尝试“auth_request”,并提供“auth_basic”中使用的用户名/密码。与此处相同的解决方案:https://stackoverflow.com/questions/23299623/nginx-authentication-with-auth-request-module然而,nginx 似乎更喜欢“authrequest”,因此先执行此操作,然后再执行“auth_basic”。

知道我做错了什么吗?

答案1

对于 POST 文件上传来说最重要的是:

proxy_pass_request_body off;
 proxy_set_header Content-Length "";

如果你只获取你不需要上面添加

答案2

HTTP 本质上是无状态的。基本身份验证依赖于浏览器中保留的状态并发送回服务器。服务器需要告诉浏览器这应该打开。使用 auth_request,有状态,但该机制对 nginx 来说是不透明的。

鉴于此,nginx 中没有机制来区分尚未尝试基本授权的客户端和已通过 auth_request 机制进行身份验证的客户端。

如果您只是想提供两种不同的登录方法,那么您需要在身份验证提供程序中实现它们(或通过身份验证提供程序进行多路复用),而不是在 nginx 中。

但是如果你仅有的想要使用基本授权进行非交互式访问,那么您可以使用“授权”标头的存在作为 nginx 的指标。

相关内容