Como usar o nginx para proxy de um host que requer autenticação?


41

Como posso configurar uma diretiva nginx proxy_pass que também inclui informações de autenticação HTTP Basic enviadas ao host proxy?

Este é um exemplo da URL que eu preciso proxy para:

http://username:password@192.168.0.5/export?uuid=1234567890

O objetivo final é permitir que um servidor apresente arquivos de outro servidor (aquele para o qual estamos fazendo proxy) sem expor o URI do servidor proxy. Eu tenho este trabalho 90% correto agora de seguir a configuração Nginx encontrada aqui:

http://kovyrin.net/2010/07/24/nginx-fu-x-accel-redirect-remote/

Eu só preciso adicionar a autenticação HTTP Basic para enviar ao servidor proxy


@all: Certifique-se de que você precisa da autenticação HTTP Basic ao usar esta solução - não a autenticação HTTP Digest;) Tive bastante dificuldade em depurar até descobrir isso ... stackoverflow.com/questions/9534602/…
SimonSimCity

Respostas:


57

Eu escrevi sobre isso há um tempo atrás. Veja os detalhes aqui:

http://shairosenfeld.blogspot.com/2011/03/authorization-header-in-nginx-for.html

Por exemplo:

 location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://6.6.6.6:80;
    proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
 }

"a2luZzppc25ha2Vk" é codificado como "king: isnaked" base64, de modo que funcionaria para

http: // rei: isnaked@6.6.6.6

Sinta-se à vontade para conferir a postagem no blog para obter mais detalhes.


2
A ligação é interrompida
Alex

1
Fazer a ligação agora está aqui: shairosenfeld.blogspot.com/search?q=nginx no caso de alguém está se perguntando
ckm

1
Eu preciso de algo mais difícil
Ilja

7
Sua solução não é flexível o suficiente. Pode ser muito útil codificar nome de usuário: senha em tempo real. Primeiro, o nginx deve analisar o nome de usuário: senha da URL; segundo, o nginx deve codificar esses dados e definir no cabeçalho apropriado. Eu não quero codificar credenciais codificadas.
Johnny

Eu recebo "solicitação ruim" ao tentar na minha configuração .. alguma idéia?
Spock

21

Eu trabalhei com a resposta do alvosu, mas tive que inserir a palavra "Básico" dentro da citação da string base64, para que ela se parecesse com isso:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";

1
Você sabe como codificar nome de usuário: senha em tempo real com nginx? As credenciais codificadas permanentemente não são flexíveis, porque quero autenticar o usuário com credenciais especificadas por ele no URL.
Johnny

1
Eu descobri como codificar para base64 com o nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Isso é mais útil do que credenciais codificadas.
Johnny

Ligações @Johnny a esses documentos estão agora aqui: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass

5

Defina a autorização proxy_set_header "USER_AND_PASS", em que USER_AND_PASS = base64 (usuário: passe)


3
faltando a palavra-chave Basic.
Jan-Philip Gehrcke

2

Remova o cabeçalho de autorização que é passado encaminhado pelo nginx com proxy_set_header Authorization "";.

Eu configurei o nginx para realizar autenticação básica, mas o Authorizationcabeçalho estava sendo repassado na proxy_passdiretiva e a extremidade receptora não conseguiu lidar com o token.

# Basic Auth
auth_basic "Private Stuff";
auth_basic_user_file /etc/nginx/.htpasswd;

location /server {
    proxy_pass http://172.31.31.140:9090;
    proxy_set_header Authorization "";
}

(Específico para o meu caso, esse erro foi retornado Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.