Làm cách nào để sử dụng nginx để proxy đến máy chủ yêu cầu xác thực?


41

Làm cách nào tôi có thể thiết lập một lệnh nginx proxy_pass cũng sẽ bao gồm thông tin xác thực HTTP Basic được gửi đến máy chủ proxy?

Đây là một ví dụ về URL tôi cần ủy quyền:

http://username:password@192.168.0.5/export?uuid=1234567890

Mục tiêu cuối cùng là cho phép 1 máy chủ trình bày các tệp từ một máy chủ khác (máy chủ chúng tôi đang ủy quyền) mà không để lộ URI của máy chủ proxy. Bây giờ tôi đã làm việc đúng 90% từ việc theo cấu hình Nginx được tìm thấy ở đây:

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

Tôi chỉ cần thêm xác thực HTTP Basic để gửi đến máy chủ proxy


@all: Hãy chắc chắn bạn cần HTTP Basic xác thực khi sử dụng giải pháp này - không HTTP Digest Authentication;) Đã có một thời gian khá khó gỡ lỗi xung quanh cho đến khi tôi figured it out ... stackoverflow.com/questions/9534602/...
SimonSimCity

Câu trả lời:


57

Tôi đã viết một bài về điều này một thời gian trước đây. Xem chi tiết tại đây:

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

Ví dụ:

 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" là "king: isnaken" được mã hóa base64, do đó sẽ hoạt động cho

http: // king: isnaken@6.6.6.6

Hãy xem bài viết trên blog để biết thêm chi tiết.


2
Liên kết bị hỏng
Alex

1
Liên kết hiện có tại đây: shairosenfeld.blogspot.com/search?q=nginx trong trường hợp có ai thắc mắc
ckm

1
Tôi cần một cái gì đó khó khăn hơn
Ilja

7
Giải pháp của bạn không đủ linh hoạt. Nó có thể rất hữu ích để mã hóa tên người dùng: mật khẩu nhanh chóng. Đầu tiên, nginx phải phân tích tên người dùng: mật khẩu từ URL, thứ hai, nginx phải mã hóa dữ liệu này và đặt trong tiêu đề thích hợp. Tôi không muốn mã hóa thông tin được mã hóa cứng.
Johnny

Tôi nhận được "yêu cầu xấu" khi thử nó trên thiết lập của mình .. có ý kiến ​​gì không?
Spock

21

Tôi đã làm việc này với câu trả lời của alvosu nhưng tôi phải nhập từ "Cơ bản" bên trong trích dẫn của chuỗi base64 để nó trông như thế này:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";

1
Bạn có biết cách mã hóa tên người dùng: mật khẩu đang hoạt động với nginx không? Thông tin xác thực mã hóa không linh hoạt, vì tôi muốn xác thực người dùng bằng thông tin đăng nhập do anh ấy chỉ định trong URL.
Johnny

1
Tôi đã tìm thấy cách mã hóa vào base64 với nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Điều này hữu ích hơn thông tin mã hóa cứng.
Johnny

@Johnny liên kết đến các tài liệu đó hiện có tại đây: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass

5

Đặt ủy quyền proxy_set_header "USER_AND_PASS", trong đó USER_AND_PASS = base64 (người dùng: vượt qua)


3
thiếu từ khóa Basic.
Jan-Philip Gehrcke

2

Xóa tiêu đề ủy quyền được chuyển tiếp bởi nginx với proxy_set_header Authorization "";.

Tôi đã định cấu hình nginx để thực hiện xác thực cơ bản nhưng Authorizationtiêu đề đã được chuyển qua trong proxy_passchỉ thị và phần cuối nhận không thể xử lý mã thông báo.

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

(Cụ thể với trường hợp của tôi, lỗi này đã được trả lại Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.