我正在尝试配置 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 的指标。