我正试图在nginx中配置Digest Auth,我使用非正式的模块,nginx Digest模块,在大多数情况下,我可以让它工作得很好,我能够锁定一个端点,除非它是get,这是我的位置配置。
location /config {
proxy_pass http://internal_config_service/config;
limit_except GET {
auth_digest "peek a boo";
}
}
然而,我有一个场景,我允许localhost
不受挑战,我真的没有找到一个很好的方法来做到这一点。
我已经探索过的东西,我已经尝试过allow 127.0.0.1;
,我甚至研究过试图做一些与if
和检查$host
是本地的,而不是添加文摘指令,但我不认为这是可能的,因为我的理解是配置是相当静态的。
我能想到的一个解决方案,可能会起作用,但需要相当数量的工作,和额外的混乱,有人新的,基本上是创建2个服务器,一个是只能由本地主机访问,并允许本地主机通过不受挑战,不能从外部访问。然后第二个服务器是公开访问的,并被digest锁定。
我希望有一个更好的解决方案,但我仍然在学习NGINX的复杂性,但对更好的解决方案并不乐观。
你可以使用satisfy
指令:http://nginx.org/en/docs/http/ngx_http_core_module.html满足
问题:我不知道auth_digest(非官方模块)是否会成为NGINX请求处理中Auth-Face的一部分。但是,如果是这种情况,您可以另外使用auth_request
。不过不妨试一下:
...
location /authreq {
satisfy any;
allow 127.0.0.1;
deny all;
auth_digest "something";
# If auth_digest is not working try
auth_request /_authdigest;
}
location = /_authdigest {
internal;
auth_digest "something";
}
更新你关于allow 127.0.0.1; deny all
的问题
This将NOT阻止所有其他客户端/流量。它告诉NGINX结合satisfy any
,如果IP不是127.0.0.1
,任何其他认证函数(auth_basic, auth_jwt, auth_request)必须成功才能让请求通过。在我的演示中:如果我不向localhost
发送请求,我将不得不通过auth_request
位置。如果auth_request
类似于200
,它满足我的配置,我被允许连接到上游代理。
我已经构建了一个小的njs脚本,禁用用户的auth_digest,并对代理请求进行身份验证。但这不是你需要的,不是吗?
如果您想将配置分开,一个用于本地主机,另一个用于公共ip,您的服务器配置可以如下所示:
server {
listen 127.0.0.1:80;
## do localhost configuration here
}
server {
listen 80;
## apply configuration for the IP of nic eth0 (for example) here.
}