我想使用多个auth_request指令来尝试使用多个服务器进行身份验证--也就是说,如果第一个auth服务器返回403,那么尝试第二个auth服务器。我尝试了这样一种简单的方法:
location /api {
satisfy any;
auth_request /auth-1/;
auth_request /auth-2/;
proxy_pass http://api_impl;
}
location /auth-1/ {
internal;
proxy_pass http://auth_server_1;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
location /auth-2/ {
internal;
proxy_pass http://auth_server_2;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}但是nginx不解析配置文件。我收到了回复
nginx: [emerg] "auth_request" directive is duplicate有办法在nginx中实现这样的功能吗?
发布于 2020-01-28 16:09:03
下面是我的解决方案,在google中找到这个问题,寻找相同的东西:
/auth上的nginx只使用这个上游,所以它将依次尝试所有身份验证“服务器”(感谢503个返回代码),直到其中一个成功或最后一个返回401。upstream auth {
server 127.0.2.1:8000 max_fails=0;
server 127.0.2.1:8001 max_fails=0;
server 127.0.2.1:8002 max_fails=0;
}
# Method 1
server {
listen 127.0.2.1:8000;
location / {
proxy_pass http://auth_server_1; # Returns **503** on failure
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
}
# Method 2
server {
listen 127.0.2.1:8001;
location / {
proxy_pass http://auth_server_2; # Returns **503** on failure
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
}
# Method 3
server {
listen 127.0.2.1:8002;
location / {
proxy_pass http://auth_server_3; # Returns **401** on failure
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
}
server {
# ...
location /api {
auth_request /auth;
proxy_pass http://api_impl;
}
location /auth {
proxy_pass http://auth/;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URL $request_uri;
proxy_next_upstream error timeout http_503;
}
# ...
}发布于 2022-11-08 18:41:23
我也遇到了类似的问题,但我找到了一种不同的解决方案,在某些情况下可能是可以接受的。它本质上创建了一个双代理层,它具有显著的性能损失。第一代理层用于“身份验证”,第二代理层用于“授权”。
下面的配置是未经测试的,目的是传达概念,而不是一个工作示例。
### What I wanted
location /protected_path {
auth_request /authenticate; # Login to IDP
auth_request /authorize; # Apply Role/Group based authorization
# Final routing logic
}
### My solution
server {
listen 443;
location /protected_path {
auth_request /authenticate;
auth_request_set $idp-data $arbitrary_data_from_idp_server;
proxy_pass http://localhost:8000;
proxy_set_header Arbitrary-Header $idp-data;
}
}
server {
listen 127.0.0.1:8000;
location /protected_path {
auth_request /authorize;
# Final routing logic
}
}https://stackoverflow.com/questions/45822565
复制相似问题