Аутентификация подзапроса nginx не работает должным образом

Аутентификация подзапроса nginx не работает должным образом

Я хочу добавить элементы управления доступом ко всему vhost на обратном прокси-сервере. Для этого я использую аутентификацию подзапроса 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

Всегда хорошая идеяРТФМ

Nginx будет ретранслировать заголовок WWW-Authenticate, если он возвращен поставщиком auth_request (http://authprovider.example.com:8081/gateway/index.phpвыше).

Однако я оставлю этот вопрос открытым, поскольку меня смущает/обеспокоена пользовательская страница с ошибкой, приводящая к перенаправлению 302 с последующим ответом 200.

Связанный контент