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.