La autenticación de subsolicitud de nginx no funciona como se esperaba

La autenticación de subsolicitud de nginx no funciona como se esperaba

Quiero agregar controles de acceso a un vhost completo en un proxy inverso. Estoy usando la autenticación de subsolicitud de nginx para hacer esto. La interacción esperada es que el usuario reciba un mensaje de error con un enlace a la página de inicio de sesión o que la página de inicio de sesión se muestre en la URL solicitada. Al finalizar el proceso de inicio de sesión, debería haber algún mecanismo para que el usuario navegue/recargue la URL solicitada originalmente. No hay capacidad de secuencias de comandos en el proxy inverso (es decir, no hay PHP), lo que limita las opciones para capturar y propagar la URL original a través del proceso de autenticación.

Mi expectativa: si la solicitud falla en la autenticación (es decir,http://authprovider.example.com:8081/gateway/index.phpdevuelve un 401) Quiero que se devuelva contenido específico en la URL solicitada sin redireccionamiento y con un estado 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/;
    }
}

Sin embargo:

Si location /iprestricted.html{...}está comentado, aparece un bucle de redireccionamiento enhttp://www.ejemplo.com

Si no está comentado, cualquier solicitud obtiene una respuesta 302 con Ubicación /iprestricted.html que devuelve un código de estado 200.

¿Cómo implementar la autenticación de subrequest sin redirecciones?

¿Existe otra forma de capturar la URL original y propagarla hasta el paso de autenticación usando solo la configuración de nginx?

Intenté agregar add_header WWW-Authenticate "Basic realm=bipdevtest";todas y cada una de las ubicaciones anteriores, pero esto no se envió de vuelta en las respuestas HTTP.

Respuesta1

Siempre es una buena ideaRTFM

Nginx transmitirá un encabezado WWW-Authenticate si lo devuelve el proveedor auth_request (http://authprovider.example.com:8081/gateway/index.phpen lo anterior).

Sin embargo, dejaré la pregunta abierta, ya que estoy confundido/preocupado por la página de error personalizada que genera una redirección 302 seguida de una respuesta 200.

información relacionada