nginx 子请求身份验证未按预期工作

nginx 子请求身份验证未按预期工作

我想在反向代理上为整个虚拟主机添加访问控制。我使用 nginx 子请求身份验证来执行此操作。预期的交互是用户将收到一条带有登录页面链接的错误消息,或者登录页面呈现在请求的 URL 上。登录过程完成后,应该有一些机制供用户导航/重新加载最初请求的 URL。反向代理本身没有脚本功能(即没有 PHP),这限制了通过身份验证过程捕获和传播原始 URL 的选项。

我的期望:如果请求身份验证失败(即http://authprovider.example.com:8081/gateway/index.php返回 401) 我希望在请求的 URL 处返回特定内容,无需重定向,并且具有 4xx 状态。

server {
    listen 80;
    server_name www.example.com;
    root /var/www/html;

    error_page 401 iprestricted.html;
    ## This provides feedback to the user when request is disallowed
    ## (including a link to login)
    # location /iprestricted.html {
    #       try_files $uri $uri/ =404;
    # }

    # This implements the sub-request check....
    location /restricted {
            internal;
            proxy_pass http://authprovider.example.com:8081/gateway/index.php ;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Original-URI $request_uri;
    }
    location / {
            auth_request /restricted;
            proxy_pass http://localwebserver/;
    }
}

然而:

如果location /iprestricted.html{...}注释掉,我会得到一个重定向循环http://www.example.com

如果取消注释,则任何请求都会得到 302 响应,其中 Location /iprestricted.html 返回 200 状态代码

如何实现不带重定向的子请求身份验证?

是否有其他方法可以捕获原始 URL 并仅使用 nginx 配置将其传播到身份验证步骤?

我确实尝试添加add_header WWW-Authenticate "Basic realm=bipdevtest";上述每个位置,但这并未在 HTTP 响应中发回。

答案1

总是一个好主意阅读手册

如果 auth_request 提供程序返回 WWW-Authenticate 标头,Nginx 将中继该标头(http://authprovider.example.com:8081/gateway/index.php在上述内容中)。

然而,我将保留这个问题,因为我对自定义错误页面导致 302 重定向然后是 200 响应感到困惑/担心。

相关内容