A autenticação de subsolicitação nginx não funciona conforme o esperado

A autenticação de subsolicitação nginx não funciona conforme o esperado

Quero adicionar controles de acesso a um vhost inteiro em um proxy reverso. Estou usando a autenticação de subsolicitação nginx para fazer isso. A interação esperada é que o usuário receba uma mensagem de erro com um link para a página de login ou que a página de login seja renderizada no URL solicitado. Após a conclusão do processo de login, deve haver algum mecanismo para o usuário navegar/recarregar a URL solicitada originalmente. Não há capacidade de script no proxy reverso (ou seja, não há PHP), o que limita as opções de captura e propagação da URL original através do processo de autenticação.

Minha expectativa: se a solicitação falhar na autenticação (ou seja,http://authprovider.example.com:8081/gateway/index.phpretorna 401) Desejo que conteúdo específico seja retornado no URL solicitado sem redirecionamento e com status 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/;
    }
}

No entanto:

Se location /iprestricted.html{...}estiver comentado, recebo um loop de redirecionamento emhttp://www.exemplo.com

Se não for comentado, qualquer solicitação receberá uma resposta 302 com Location /iprestricted.html que retorna um código de status 200

Como implementar a autenticação de subsolicitação sem redirecionamentos?

Existe outra maneira de capturar o URL original e propagá-lo para a etapa de autenticação usando apenas a configuração do nginx?

Tentei adicionar add_header WWW-Authenticate "Basic realm=bipdevtest";cada um dos locais acima, mas isso não foi enviado de volta nas respostas HTTP.

Responder1

É sempre uma boa ideiaRTFM

O Nginx retransmitirá um cabeçalho WWW-Authenticate se ele for retornado pelo provedor auth_request (http://authprovider.example.com:8081/gateway/index.phpno acima).

No entanto, deixarei a pergunta em aberto, pois estou confuso/preocupado com a página de erro personalizada, resultando em um redirecionamento 302 seguido por uma resposta 200.

informação relacionada