nginx auth_basic 401 htpasswd

1

Eu tenho esse erro estranho:

Eu tenho um serviço Jenkins em execução no 8090 que desejo proteger com senha por meio do Nginx auth_basic com proxy_pass Ao fazer o proxy-pass sem auth_basic, posso acessar o site sem problemas:

server {
  listen 8080;
  location / {
    proxy_pass http://localhost:8090;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_redirect off;
    proxy_buffering off;
    proxy_pass_header Authorization;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    # auth_basic "Restricted";                   #For Basic Auth
    # auth_basic_user_file /etc/nginx/htpasswd;  #For Basic Auth
  }
}

No entanto, ao descomentar as duas linhas de autenticação. Eu recebo a página de login esperada no navegador. Se eu inserir credenciais inválidas, obtenho os erros esperados em nginx / error.log:

(usuário errado)

2014/07/30 18:59:58 [error] 15374#0: *1 user "afds" was not found in "/etc/nginx/htpasswd", client: xx.xx.xx.xx, server: example.com, request: "GET /job/xyz HTTP/1.1", host: "example.com:8080"

(bom usuário, senha errada)

2014/07/30 19:01:43 [error] 15374#0: *44 user "jenkins": password mismatch, client: xx.xx.xx.xx, server: example.com, request: "GET /job/xyz HTTP/1.1", host: "example.com:8080"

Mas, se eu digitar a combinação correta de usuário / senha, eu não obtenho nada em nginx / error.log, mas em vez disso, obtenho o seguinte em nginx / access.log

xx.xx.xx.xx - jenkins [30/Jul/2014:19:03:53 -0500] "GET /job/xyz HTTP/1.1" 401 278 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"

E o navegador pede a senha novamente.

Alguma idéia do porquê isso está acontecendo?

    
por obaqueiro 31.07.2014 / 02:07

1 resposta

0

Como o @Lukas explicou, encaminhar o cabeçalho de Autorização para o backend fará com que o seu cliente tente autenticar com ele. Como você provavelmente não definiu nenhuma autenticação em seu back-end, ele responderá com um 401, como o RFC 2617 requer :

If the origin server does not wish to accept the credentials sent with a request, it SHOULD return a 401 (Unauthorized) response.

Seu back-end não tem nada a ver com a autenticação, pois é feito por / com o proxy. Não faça proxy nesse campo de cabeçalho.

Se você deseja que seu back-end autentique o cliente novamente, você deve ativar auth_basic também, com o mesmo banco de dados de usuário / senha. Tenha cuidado ao gerenciar usuários, você teria duas cópias para manter sincronizado agora ...

    
por 06.11.2014 / 15:14

Tags