Wie verwende ich Nginx als Proxy für einen Host, der eine Authentifizierung benötigt?

41

Wie kann ich eine nginx proxy_pass-Direktive einrichten, die auch HTTP Basic-Authentifizierungsinformationen enthält, die an den Proxy-Host gesendet werden?

Dies ist ein Beispiel für die URL, zu der ich einen Proxy erstellen muss:

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

Das Endziel ist, dass 1 Server Dateien von einem anderen Server (demjenigen, zu dem wir einen Proxy-Server einrichten) präsentiert, ohne den URI des Proxy-Servers preiszugeben. Ich habe diese Funktion zu 90% korrekt ausgeführt, nachdem ich die hier gefundene Nginx-Konfiguration befolgt habe:

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

Ich muss nur die HTTP-Basisauthentifizierung hinzufügen, um sie an den Proxyserver zu senden

bwizzy
quelle
@all: Stellen Sie sicher, dass Sie HTTP Basic-Authentifizierung benötigen, wenn Sie diese Lösung verwenden - nicht HTTP Digest-Authentifizierung;) Es fiel mir ziemlich schwer, Fehler zu beheben,
SimonSimCity

Antworten:

57

Ich habe vor einiger Zeit darüber geschrieben. Sehen Sie die Details hier:

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

Zum Beispiel:

 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" ist "king: isnaked" base64-codiert, damit würde das funktionieren

http: // king: [email protected]

Fühlen Sie sich frei, Blog-Post für weitere Details zu überprüfen.

Shai
quelle
2
Die Verbindung ist unterbrochen
Alex
1
Der Link ist jetzt hier: shairosenfeld.blogspot.com/search?q=nginx für den Fall, dass sich jemand wundert
ckm 22.10.14
1
Ich brauche etwas schwierigeres
Ilja
7
Ihre Lösung ist nicht flexibel genug. Es kann sehr nützlich sein, den Benutzernamen und das Passwort spontan zu verschlüsseln. Erstens muss nginx den Benutzernamen und das Passwort von der URL analysieren, zweitens muss nginx diese Daten verschlüsseln und in den entsprechenden Header setzen. Ich möchte keine verschlüsselten Anmeldeinformationen fest codieren.
Johnny
Ich erhalte eine "schlechte Anfrage", wenn ich es mit meinem Setup versuche. Irgendeine Idee?
Spock
21

Ich habe das mit Alvosus Antwort verstanden, musste aber das Wort "Basic" in das Zitat des base64-Strings eingeben, damit es so aussah:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";
bwizzy
quelle
1
Wissen Sie, wie man Benutzernamen und Passwort mit nginx verschlüsselt? Fest codierte Anmeldeinformationen sind nicht flexibel, da ich den Benutzer mit den von ihm in der URL angegebenen Anmeldeinformationen authentifizieren möchte.
Johnny
1
Ich habe herausgefunden, wie man mit nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 in base64 codiert . Dies ist nützlicher als fest codierte Anmeldeinformationen.
Johnny
@ Johnny Links zu diesen Dokumenten sind jetzt hier: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass
5

Setze proxy_set_header Authorization "USER_AND_PASS", wobei USER_AND_PASS = base64 (user: pass)

alvosu
quelle
3
das Schlüsselwort fehlt Basic.
Jan-Philip Gehrcke
2

Entfernen Sie den Autorisierungsheader, der von nginx mit weitergeleitet wird proxy_set_header Authorization "";.

Ich habe nginx für die grundlegende Authentifizierung konfiguriert, aber der AuthorizationHeader wurde in der proxy_passDirektive weitergegeben und das empfangende Ende konnte das Token nicht verarbeiten.

# 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 "";
}

(Speziell für meinen Fall wurde dieser Fehler zurückgegeben Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

sunapi386
quelle