38

Vì vậy, tôi đang cố gắng để thực hiện các tình huống sau:HTTP Spec: Cấp quyền proxy và Authorization header

  • Đơn được bảo vệ bởi Basic Authentication. Giả sử nó được lưu trữ trên app.com
  • Một proxy HTTP, ở phía trước ứng dụng, cũng yêu cầu xác thực. Nó được lưu trữ trên proxy.com

Do đó, người dùng phải cung cấp thông tin cho cả các proxy và các ứng dụng trong cùng một yêu cầu, do đó ông có khác nhau cặp username/password: một cặp để xác thực bản thân chống lại các ứng dụng, và tên người dùng khác/cặp mật khẩu để xác thực mình chống lại proxy.

Sau khi đọc thông số kỹ thuật, tôi không thực sự chắc chắn về cách thực hiện điều này. Điều tôi đang nghĩ là:

  1. Người dùng gửi yêu cầu HTTP tới proxy mà không cần bất kỳ loại xác thực nào.
  2. Proxy trả lời 407 Proxy Authentication Required và trả về tiêu đề Proxy-Authenticate ở định dạng: "Proxy-Authenticate: Basic realm="proxy.com".
    Câu hỏi: Đây có phải là tiêu đề Proxy-Authenticate được đặt chính xác không?
  3. Khách hàng sau đó thử lại yêu cầu với tiêu đề Proxy-Authorization, đó là đại diện Base64 của proxy username:password.
  4. Lần này proxy xác thực yêu cầu, nhưng sau đó ứng dụng trả lời với tiêu đề 401 Unauthorized. Người dùng đã được xác thực bởi proxy, chứ không phải bởi ứng dụng. Ứng dụng này thêm tiêu đề WWW-Authenticate vào phản hồi như WWW-Authenticate: Basic realm="app.com". Câu hỏi: giá trị tiêu đề này đúng không?
  5. Máy khách thử lại yêu cầu với tiêu đề Proxy-Authorization và tiêu đề Authorization có giá trị với biểu diễn Base64 của ứng dụng username:password.
  6. Tại thời điểm này, proxy xác thực thành công yêu cầu, chuyển tiếp yêu cầu đến ứng dụng xác thực người dùng. Và khách hàng cuối cùng cũng nhận được phản hồi.

Toàn bộ quy trình làm việc có chính xác không?

+0

Vâng, cảm ơn vì đã có tiêu đề Proxy- * được giải thích ở đây, đang tìm kiếm chúng. Nhưng bạn đã giải quyết được vấn đề của mình chưa? Tại sao câu hỏi vẫn mở? –

+0

Vì bạn vừa yêu cầu xác nhận chung về cách tiếp cận, tôi đã cố gắng thêm một số màu bổ sung trong câu trả lời của tôi xung quanh các hoán vị khác của thiết lập này. Tuy nhiên, nếu bạn đang đặt câu hỏi này bởi vì bạn đã thử những gì bạn đã mô tả và gặp lỗi cụ thể, vui lòng cập nhật câu hỏi để bao gồm lỗi đó; mặc dù tôi đã cố gắng hết sức để xác thực những gì bạn đã đăng, thử nghiệm thực sự sẽ đơn giản là thử và xem điều gì xảy ra. –

Trả lời

25

Có, có vẻ như quy trình làm việc hợp lệ cho trường hợp bạn mô tả và các tiêu đề Xác thực dường như có định dạng đúng. Một điều thú vị cần lưu ý là có thể, mặc dù không, đối với một kết nối nhất định liên quan đến nhiều proxy bị xích lại với nhau, và mỗi người có thể tự yêu cầu xác thực. Trong trường hợp này, phía máy khách của mỗi proxy trung gian sẽ tự lấy lại một thông báo 407 Proxy Authentication Required và chính nó lặp lại yêu cầu với tiêu đề Proxy-Authorization; các tiêu đề Proxy-AuthenticateProxy-Authorization là các tiêu đề đơn-hop không được chuyển từ máy chủ này sang máy chủ tiếp theo, nhưng WWW-AuthenticateAuthorization là tiêu đề đầu cuối được coi là từ máy khách đến máy chủ cuối cùng, được thông qua nguyên văn bởi trung gian.

Vì sơ đồ Basic gửi mật khẩu rõ ràng (base64 là mã hóa đảo ngược), nó được sử dụng phổ biến nhất qua SSL.Kịch bản này được triển khai theo một cách khác, vì mong muốn ngăn proxy nhìn thấy mật khẩu được gửi đến máy chủ cuối cùng:

  • khách hàng sẽ mở một kênh SSL tới proxy để bắt đầu yêu cầu, nhưng thay vì gửi yêu cầu HTTP thông thường, nó sẽ gửi a special CONNECT request (vẫn còn với tiêu đề Proxy-Authorization) để mở đường hầm TCP tới máy chủ từ xa.
  • Khách hàng sau đó tiến hành tạo một kênh khác được lồng trong đầu tiên, qua đó nó chuyển thông báo HTTP cuối cùng bao gồm tiêu đề Authorization.

Trong trường hợp này proxy chỉ biết máy chủ và cổng mà khách hàng kết nối, không phải nội dung được truyền hoặc nhận qua kênh SSL bên trong. Hơn nữa, việc sử dụng các kênh lồng nhau cho phép khách hàng "xem" chứng chỉ SSL của cả proxy và máy chủ, cho phép nhận dạng cả hai xác thực.

+0

Tôi biết tôi đang hồi sinh lĩnh vực kiến ​​thức này từ bạn (cách đây 2 năm), nhưng bạn có biết nếu hầu hết các trình duyệt hiện đại gửi proxy auth qua SSL không? – Zerkz

+2

Tôi không chắc mình hiểu câu hỏi, nhưng: trình duyệt sẽ gửi thông tin xác thực cơ bản trên cùng một kênh khi gửi yêu cầu, vì vậy nếu URL proxy của bạn là https: thì nó sẽ nằm trong kênh SSL, nhưng nếu URL proxy của bạn chỉ là http: sau đó nó sẽ được rõ ràng. –

+1

(Nếu tôi không hiểu câu hỏi của bạn thì tốt nhất là nên bắt đầu một câu hỏi cấp cao mới hơn là cố gắng giải thích thêm ở đây. Có chỗ để biết thêm chi tiết trong câu hỏi chứ không phải là nhận xét). –