我想让我的 nginx 代理仅在客户端尚未经过身份验证时才执行身份验证子请求。有条件的部分是我卡住的地方。如何制作配置以使每个会话只对客户端进行一次身份验证?
我能够成功地向 Apache 执行 auth_request 并拉回我想要传递给后端的标头,但这会发生在每个请求上,而且成本很高。
在此处的示例中,我的目标是仅在“授权”标头丢失或为空或包含令牌的 cookie 时才执行 auth_request
# DEFAULT BACKEND
location / {
proxy_pass_request_body off;
if ($http_authorization ~* '')
{
rewrite ^(.*)$ /__login;
}
if ($user !~* "([aa-zZ]+)@example.com")
{
}
if ($http_cookie !~* "(auth_cookie=([aa-zZ]+)@example.com)")
{
add_header Set-Cookie "auth_cookie=$user;domain=.example.com;Max-Age=3000";
}
proxy_pass_header x-webauth-user;
proxy_pass_header Set-Cookie;
proxy_pass http://example.com:6762/;
}
位置 /__login { 内部;
auth_request /auth;
auth_request_set $user $upstream_http_x_webauth_user;
set $xuser $user;
add_header Auth-User $user;
proxy_set_header User-Name $user;
proxy_set_header Authorization $http_authorization;
#proxy_pass_header x-webauth-user;
#proxy_pass_header Set-Cookie;
proxy_pass http://example:6762/;
access_log /etc/nginx/login_debug.log;
}
location = /auth{
internal;
proxy_pass http://example.com:81/;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
#proxy_pass_header Set-Cookie;
#proxy_pass_header x-webauth-user;
}
Auth-User 标头在第一次之后的所有请求中都会丢失,并且 cookie 似乎永远不会被设置,除此之外,页面实际上似乎并没有在浏览器中呈现。我显然做错了什么,请有人帮我解决这个问题。