Come utilizzare nginx per eseguire il proxy a un host che richiede l'autenticazione?


41

Come posso impostare una direttiva proxy_pass nginx che includerà anche le informazioni di autenticazione HTTP di base inviate all'host proxy?

Questo è un esempio dell'URL che devo proxy per:

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

L'obiettivo finale è consentire a 1 server di presentare file da un altro server (quello a cui stiamo eseguendo il proxy) senza esporre l'URI del server proxy. Ho funzionato correttamente al 90% ora seguendo la configurazione di Nginx trovata qui:

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

Devo solo aggiungere l'autenticazione HTTP Basic per inviare al server proxy


@All: Essere sicuri di aver bisogno HTTP di base di autenticazione quando si utilizza questa soluzione - non HTTP Digest Authentication;) Aveva una volta molto difficile il debug in giro fino a quando ho capito ... stackoverflow.com/questions/9534602/...
SimonSimCity

Risposte:


57

Ho scritto questo a proposito poco fa. Vedi i dettagli qui:

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

Per esempio:

 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" è "king: isnaked" codificato in base64, quindi funzionerebbe per

http: // re: isnaked@6.6.6.6

Sentiti libero di controllare il post sul blog per maggiori dettagli.


2
Il collegamento è interrotto
Alex,

1
Il link è ora qui: shairosenfeld.blogspot.com/search?q=nginx nel caso qualcuno si stia chiedendo
ckm

1
Ho bisogno di qualcosa di più difficile
Ilja,

7
La tua soluzione non è abbastanza flessibile. Potrebbe essere molto utile codificare username: password al volo. Innanzitutto, nginx deve analizzare il nome utente: password dall'URL, in secondo luogo, nginx deve codificare questi dati e impostare l'intestazione appropriata. Non voglio codificare le credenziali codificate.
Johnny,

Ottengo "cattiva richiesta" quando provo sul mio setup .. qualche idea?
Spock,

21

Ho funzionato con la risposta di alvosu ma ho dovuto inserire la parola "Basic" all'interno della citazione della stringa base64 in modo che fosse simile al seguente:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";

1
Sai come codificare username: password al volo con nginx? Le credenziali hardcoded non sono flessibili, perché desidero autenticare l'utente con le credenziali specificate da lui nell'URL.
Johnny,

1
Ho scoperto come codificare in base64 con nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Questo è più utile delle credenziali codificate.
Johnny,

I link di @Johnny a quei documenti sono ora qui: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass

5

Impostare l'autorizzazione proxy_set_header "USER_AND_PASS", dove USER_AND_PASS = base64 (utente: pass)


3
manca la parola chiave Basic.
Jan-Philip Gehrcke,

2

Rimuovere l'intestazione dell'autorizzazione che viene inoltrata da nginx con proxy_set_header Authorization "";.

Ho configurato nginx per eseguire l'autent di base ma l' Authorizationintestazione veniva passata nella proxy_passdirettiva e l'estremità ricevente non poteva gestire il 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 "";
}

(Specifico per il mio caso, questo errore è stato restituito Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.