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:[email protected]/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

bwizzy
fonte
@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: [email protected]

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

Shai
fonte
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==";
bwizzy
fonte
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)

alvosu
fonte
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)

sunapi386
fonte