Jak używać nginx do proxy na hoście wymagającym uwierzytelnienia?

41

Jak skonfigurować dyrektywę nginx proxy_pass, która będzie również zawierać podstawowe informacje o uwierzytelnianiu HTTP wysyłane do hosta proxy?

To jest przykład adresu URL, który muszę proxy do:

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

Ostatecznym celem jest umożliwienie 1 serwerowi prezentowania plików z innego serwera (tego, do którego jesteśmy proxy) bez ujawniania identyfikatora URI serwera proxy. Mam to działające w 90% poprawne po wykonaniu konfiguracji Nginx znalezionej tutaj:

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

Muszę tylko dodać uwierzytelnianie podstawowe HTTP, aby wysłać je do serwera proxy

bwizzy
źródło
@all: Upewnij się, że potrzebujesz uwierzytelniania podstawowego HTTP podczas korzystania z tego rozwiązania - nie uwierzytelniania
streszczonego

Odpowiedzi:

57

Jakiś czas temu napisałem na ten temat. Zobacz szczegóły tutaj:

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

Na przykład:

 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” to „king: isnaked” zakodowany w standardzie base64, aby działał dla

http: // king: [email protected]

Zapoznaj się z postem na blogu, aby uzyskać więcej informacji.

Shai
źródło
2
Link jest zerwany
Alex
1
Link jest teraz tutaj: shairosenfeld.blogspot.com/search?q=nginx na wypadek, gdyby ktoś się zastanawiał
ckm
1
Potrzebuję czegoś trudniejszego
Ilja
7
Twoje rozwiązanie nie jest wystarczająco elastyczne. Bardzo przydatne może być kodowanie nazwy użytkownika: hasła w locie. Po pierwsze, nginx musi przeanalizować nazwę użytkownika: hasło z adresu URL, po drugie, nginx musi zakodować te dane i ustawić odpowiedni nagłówek. Nie chcę kodować poświadczeń zakodowanych na stałe.
Johnny
Dostaję „złą prośbę” podczas próby jej konfiguracji. Mam jakiś pomysł?
Spock,
21

Pracowałem z odpowiedzią alvosu, ale musiałem wpisać słowo „Basic” w cudzysłowie ciągu base64, aby wyglądało to tak:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";
bwizzy
źródło
1
Czy wiesz, jak zakodować nazwę użytkownika: hasło w locie za pomocą nginx? Poświadczenia zakodowane na stałe nie są elastyczne, ponieważ chcę uwierzytelnić użytkownika przy użyciu poświadczeń określonych przez niego w adresie URL.
Johnny
1
Znalazłem sposób kodowania do base64 przy pomocy nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Jest to bardziej przydatne niż poświadczenia zakodowane na stałe.
Johnny
@Johnny linki do tych dokumentów są teraz tutaj: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass
5

Ustaw autoryzację proxy_set_header „USER_AND_PASS”, gdzie USER_AND_PASS = base64 (user: pass)

alvosu
źródło
3
brakuje słowa kluczowego Basic.
Jan-Philip Gehrcke
2

Usuń nagłówek autoryzacji, który jest przekazywany przez nginx za pomocą proxy_set_header Authorization "";.

Skonfigurowałem nginx, aby wykonywał podstawowe uwierzytelnianie, ale Authorizationnagłówek był przekazywany w proxy_passdyrektywie i odbiorca nie mógł obsłużyć tokena.

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

(Zwłaszcza w moim przypadku ten błąd został zwrócony Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

sunapi386
źródło