nginx sub-request authentication not working as expected

Я хочу добавить контроль доступа ко всему 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
задан 7 August 2021 в 12:35
1 ответ

Всегда рекомендуется RTFM

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

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

0
ответ дан 7 August 2021 в 16:06

Теги

Похожие вопросы