¿Cómo usar nginx para proxy a un host que requiere autenticación?

41

¿Cómo puedo configurar una directiva nginx proxy_pass que también incluirá información de autenticación básica HTTP enviada al host proxy?

Este es un ejemplo de la URL que necesito para proxy:

http://username:[email protected]/export?uuid=1234567890

El objetivo final es permitir que 1 servidor presente archivos desde otro servidor (al que estamos representando) sin exponer el URI del servidor proxy. Tengo esto funcionando 90% correcto ahora siguiendo la configuración de Nginx que se encuentra aquí:

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

Solo necesito agregar la autenticación básica HTTP para enviar al servidor proxy

bwizzy
fuente
@todos: Asegúrese de que necesita autenticación HTTP básica cuando use esta solución, no autenticación HTTP Digest;) Me costó bastante depurar hasta que lo descubrí ... stackoverflow.com/questions/9534602/…
SimonSimCity

Respuestas:

57

Hice un informe sobre esto hace un tiempo. Vea los detalles aquí:

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

Por ejemplo:

 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" está codificado en base64 "king: isnaked", por lo que funcionaría para

http: // king: [email protected]

Siéntase libre de revisar la publicación del blog para más detalles.

Shai
fuente
2
El enlace está roto
Alex
1
El enlace ahora está aquí: shairosenfeld.blogspot.com/search?q=nginx en caso de que alguien se pregunte
ckm
1
Necesito algo más difícil
Ilja
77
Su solución no es lo suficientemente flexible. Podría ser muy útil codificar nombre de usuario: contraseña sobre la marcha. Primero, nginx debe analizar el nombre de usuario: contraseña de la URL, en segundo lugar, nginx debe codificar estos datos y establecerlos en el encabezado apropiado. No quiero codificar credenciales codificadas.
Johnny
Recibo una "solicitud incorrecta" cuando lo intento en mi configuración ... ¿alguna idea?
Spock
21

Obtuve esto trabajando con la respuesta de alvosu pero tuve que ingresar la palabra "Básico" dentro de la cita de la cadena base64 para que se viera así:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";
bwizzy
fuente
1
¿Sabes cómo codificar nombre de usuario: contraseña sobre la marcha con nginx? Las credenciales codificadas no son flexibles, porque quiero autenticar al usuario con las credenciales especificadas por él en la URL.
Johnny
1
He encontrado cómo codificar a base64 con nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Esto es más útil que las credenciales codificadas.
Johnny
Los enlaces de @Johnny a esos documentos ahora están aquí: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass
5

Establezca la Autorización proxy_set_header "USER_AND_PASS", donde USER_AND_PASS = base64 (usuario: pase)

alvosu
fuente
3
falta la palabra clave Basic.
Jan-Philip Gehrcke
2

Elimine el encabezado de autorización que se pasa reenviado por nginx con proxy_set_header Authorization "";.

Configuré nginx para hacer autenticación básica, pero el Authorizationencabezado se estaba pasando en la proxy_passdirectiva y el extremo receptor no podía manejar el 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 mi caso, este error fue devuelto Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

sunapi386
fuente