¿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:password@192.168.0.5/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


@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: isnaked@6.6.6.6

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


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==";

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)


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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.