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:password@192.168.0.5/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


@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: isnaked@6.6.6.6

Jangan ragu untuk melihat posting blog untuk lebih jelasnya.


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==";

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


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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.