Bagaimana cara menggunakan nginx ke proxy ke host yang membutuhkan otentikasi?

41

Bagaimana saya bisa mengatur direktif nginx proxy_pass yang juga akan menyertakan informasi otentikasi HTTP Dasar yang dikirim ke host proxy?

Ini adalah contoh dari URL yang saya perlu proxy untuk:

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

Tujuan akhirnya adalah untuk memungkinkan 1 server menyajikan file dari server lain (yang sedang kami proksi) tanpa memaparkan URI dari server proxy. Saya memiliki ini berfungsi 90% benar sekarang dari mengikuti konfigurasi Nginx yang ditemukan di sini:

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

Saya hanya perlu menambahkan otentikasi HTTP Basic untuk mengirim ke server proxy

bingung
sumber
@all: Pastikan Anda memerlukan otentikasi HTTP Basic saat menggunakan solusi ini - bukan HTTP Digest Authentication;) Cukup sulit
men-

Jawaban:

57

Saya melakukan writeup tentang ini beberapa waktu yang lalu. Lihat detailnya di sini:

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

Sebagai contoh:

 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" adalah "king: isnaked" base64 yang dikodekan, sehingga akan bekerja untuk

http: // king: [email protected]

Jangan ragu untuk melihat posting blog untuk lebih jelasnya.

Shai
sumber
2
Tautan terputus
Alex
1
Tautan sekarang ada di sini: shairosenfeld.blogspot.com/search?q=nginx kalau-kalau ada yang bertanya
ckm
1
Saya butuh sesuatu yang lebih sulit
Ilja
7
Solusi Anda tidak cukup fleksibel. Ini bisa sangat berguna untuk menyandikan nama pengguna: kata sandi saat itu juga. Pertama, nginx harus menguraikan nama pengguna: kata sandi dari URL, kedua, nginx harus menyandikan data ini dan mengatur header yang sesuai. Saya tidak ingin hardcode disandikan kredensial.
Johnny
Saya mendapatkan "permintaan buruk" saat mencobanya di pengaturan saya .. ada ide?
Spock
21

Saya mendapatkan ini bekerja dengan jawaban alvosu tetapi saya harus memasukkan kata "Basic" di dalam kutipan dari string base64 sehingga terlihat seperti ini:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";
bingung
sumber
1
Apakah Anda tahu cara menyandikan nama pengguna: kata sandi saat bepergian dengan nginx? Kredensial hardcoded tidak fleksibel, karena saya ingin mengautentikasi pengguna dengan kredensial yang ditentukan olehnya di URL.
Johnny
1
Saya telah menemukan cara menyandikan ke base64 dengan nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Ini lebih berguna daripada kredensial hardcoded.
Johnny
@Johnny tautan ke dokumen tersebut sekarang ada di sini: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass
5

Setel otorisasi proxy_set_header "USER_AND_PASS", di mana USER_AND_PASS = base64 (pengguna: pass)

alvosu
sumber
3
kata kunci hilang Basic.
Jan-Philip Gehrcke
2

Hapus tajuk otorisasi yang diteruskan diteruskan oleh nginx dengan proxy_set_header Authorization "";.

Saya mengkonfigurasi nginx untuk melakukan auth dasar tetapi Authorizationheader diteruskan dalam proxy_passdirektif dan penerima tidak dapat menangani 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 "";
}

(Khusus untuk kasus saya, kesalahan ini dikembalikan Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

sunapi386
sumber