วิธีการใช้ nginx to proxy ไปยังโฮสต์ที่ต้องการการรับรองความถูกต้อง?


41

ฉันจะตั้งค่าคำสั่ง nginx proxy_pass ที่จะรวมข้อมูลการตรวจสอบสิทธิ์ HTTP พื้นฐานที่ส่งไปยังโฮสต์โฮสต์ได้อย่างไร

นี่คือตัวอย่างของ URL ที่ฉันต้องใช้เพื่อ:

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

เป้าหมายสุดท้ายคือการอนุญาตให้เซิร์ฟเวอร์ 1 ไฟล์แสดงไฟล์จากเซิร์ฟเวอร์อื่น (ไฟล์ที่เรากำลังจะให้) โดยไม่ต้องเปิดเผย URI ของพร็อกซีเซิร์ฟเวอร์ ฉันได้ทำงานถูกต้อง 90% ในขณะนี้จากการติดตามการกำหนดค่า Nginx ที่นี่:

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

ฉันแค่ต้องเพิ่มในการรับรองความถูกต้องของ HTTP Basic เพื่อส่งไปยังพร็อกซีเซิร์ฟเวอร์


@ ทั้งหมด: ตรวจสอบให้แน่ใจว่าคุณต้องการการรับรองความถูกต้อง HTTP พื้นฐานเมื่อใช้โซลูชันนี้ - ไม่ใช่การตรวจสอบสิทธิ์ HTTP Digest;) ค่อนข้างยากในการดีบักจนกว่าฉันจะค้นพบมัน ... stackoverflow.com/questions/9534602/
SimonSimCity

คำตอบ:


57

ฉันทำบทความนี้มาระยะหนึ่งแล้ว ดูรายละเอียดที่นี่:

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

ตัวอย่างเช่น:

 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" คือ "king: isnaked" base64 เข้ารหัสเพื่อที่จะทำงานได้

http: // กษัตริย์ isnaked@6.6.6.6

อย่าลังเลที่จะตรวจสอบการโพสต์บล็อกสำหรับรายละเอียดเพิ่มเติม


2
ลิงก์ใช้งานไม่ได้
Alex

1
เชื่อมโยงตอนนี้ที่นี่: shairosenfeld.blogspot.com/search?q=nginxในกรณีที่ทุกคนสงสัย
ckm

1
ฉันต้องการบางสิ่งที่ยากขึ้น
Ilja

7
โซลูชันของคุณไม่ยืดหยุ่นเพียงพอ มันจะมีประโยชน์มากในการเข้ารหัสชื่อผู้ใช้: รหัสผ่านในทันที ก่อนอื่น nginx ต้องแยกชื่อผู้ใช้: รหัสผ่านจาก URL อย่างที่สอง nginx ต้องเข้ารหัสข้อมูลนี้และตั้งค่าในส่วนหัวที่เหมาะสม ฉันไม่ต้องการเข้ารหัสข้อมูลประจำตัวที่เข้ารหัสยาก
จอห์นนี่

ฉันได้รับ "คำขอไม่ถูกต้อง" เมื่อลองใช้กับการตั้งค่าของฉัน
สป็อค

21

ฉันได้ทำงานกับคำตอบของ alvosu นี้ แต่ฉันต้องป้อนคำว่า "พื้นฐาน" ในใบเสนอราคาของสตริง base64 ดังนั้นมันจึงเป็นดังนี้:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";

1
คุณรู้วิธีการเข้ารหัสชื่อผู้ใช้: รหัสผ่านในทันทีด้วย nginx หนังสือรับรอง Hardcoded ไม่ยืดหยุ่นเนื่องจากฉันต้องการรับรองความถูกต้องของผู้ใช้ด้วยข้อมูลรับรองที่ระบุโดยเขาใน URL
จอห์นนี่

1
ฉันได้พบวิธีการเข้ารหัส base64 กับ Nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 สิ่งนี้มีประโยชน์มากกว่าข้อมูลประจำตัวของฮาร์ดโค้ด
จอห์นนี่

@Johnny ลิงก์ไปยังเอกสารเหล่านี้อยู่ที่นี่: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al Dass


2

นำส่วนหัวของการอนุญาตที่ได้รับการส่งต่อโดยผ่าน Nginx proxy_set_header Authorization "";กับ

ฉันกำหนดค่า nginx ให้ทำการรับรองความAuthorizationถูกต้องพื้นฐาน แต่ส่วนหัวได้รับการส่งผ่านตามproxy_passคำสั่งและจุดสิ้นสุดการรับไม่สามารถจัดการโทเค็นได้

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

(เฉพาะกรณีของฉันข้อผิดพลาดนี้ถูกส่งคืนReason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.