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.