2009-08-25 35 views
6

Tôi đã chơi với thư viện Poco Net một thời gian, nó khá là đẹp. Rất thuận tiện và dễ hiểu.Xác thực proxy trong thư viện Net C++ của POCO

Tôi có thể đặt địa chỉ proxy và yêu cầu cấp phép proxy 407, đúng cách. Tôi đã nhận thấy rằng

HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
req.setCredentials(scheme, authInfo); 

Tôi đã thử các giá trị như "cơ bản", "văn bản thuần" trong lược đồ và "người dùng: mật khẩu" trong authInfo. Nó dường như không hoạt động. Google không giúp đỡ.

Có ai đã thực hiện việc này bằng Poco Net trước đó không? Hoặc là việc sử dụng rõ ràng và tôi không thể làm cho nó hoạt động vì sự thiếu hiểu biết của tôi đối với xác thực proxy nói chung? Làm ơn cho lời khuyên.

EDIT: Sau khi thêm một số hoạt động xung quanh, tôi nghĩ chức năng setCredentials được sử dụng khi máy chủ từ xa đang chờ thông tin xác thực đăng nhập. Tôi đã không thể tìm ra cách để thực hiện xác thực proxy bằng các thư viện Poco Net. Tôi đã có thể thiết lập máy chủ proxy và cổng mặc dù. Đây là những gì tôi sẽ có nếu chỉ có một máy chủ proxy mà không cần xác thực:

HTTPClientSession session(uri.getHost(), uri.getPort()); 
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
session.setProxy("host", port); 
session.sendRequest(req); 

Cần trợ giúp.

EDIT: Dựa trên các giải pháp được đề xuất bởi @StackedCrooked, tôi cố gắng thiết lập chi tiết xác thực proxy để tiêu đề yêu cầu trước khi đưa ra yêu cầu, và trong cách tiếp cận khác tìm thấy trên internet, tôi đặt chi tiết auth proxy chỉ sau khi thực hiện một yêu cầu ban đầu và lỗi 407 xuất hiện, sau đó thực hiện lại yêu cầu. Cả hai phương pháp tiếp tục đưa ra cùng một lỗi 407. Mã hiện tại của tôi trông giống như sau:

HTTPClientSession session(uri.getHost(), uri.getPort()); 
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
session.setProxy("10.7.128.1", 8080); 
req.set("Proxy-Authentication", "Basic bGVlbGE6bGVlbGExMjM="); 
session.sendRequest(req); 
+0

Bạn có thể đặt một testcase trên codepad.org hoặc một cái gì đó không? Tôi rất muốn thử nó chống lại proxy của tôi. – joshperry

+1

Tôi tin rằng tiêu đề chính xác, như @StackedCrooked được đề xuất, là "Ủy quyền ủy quyền" thay vì "Xác thực proxy". Mã thực sự của bạn có sử dụng mã đúng không? –

Trả lời

2

Có thể bạn cần phải thêm trường Ủy quyền proxy vào tiêu đề HTTP. Lớp HTTPRequest của Poco không có một phương thức riêng cho việc này. Tuy nhiên, kể từ khi nó được thừa hưởng lớp NameValueCollection công khai, bạn có thể thiết lập nó như thế này:

req.set("Proxy-Authorization" , "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); 

đâu QWxhZGRpbjpvcGVuIHNlc2FtZQ== là base64 phiên bản của "Aladdin: mở mè" mã hóa.

Rất nhiều vấn đề này trở nên dễ dàng hơn khi bạn tìm hiểu một chút về giao thức HTTP. Hiện tại, tôi đang rao giảng cho chính mình :)

+0

Tôi đã thử điều này theo nhiều cách khác nhau, nó luôn đưa ra cùng lỗi 407. Vui lòng xem chỉnh sửa trong câu hỏi. – Sahas

+0

Vâng, tôi không thể giúp bạn nhiều hơn thế bởi vì kiến ​​thức của tôi về chủ đề này cũng rất hạn chế.Tôi hy vọng bạn tìm thấy một giải pháp ngay bây giờ (hoặc bạn sẽ tìm thấy một sớm!). – StackedCrooked

+0

Ngoài xác thực cơ bản còn có các xác thực khác - thông báo, NTLM, hộ chiếu, vv WinHTP thực hiện điều này cho bạn (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383144(v=vs.85) .aspx). Tôi sẽ tò mò muốn xem liệu poco C++ (hay bất kỳ thư viện nào khác) có thể làm tương tự. – quixver

1

Tôi chưa tự mình sử dụng, nhưng bạn đã xem lớp học HTTPBasicCredentials chưa? Nó kết thúc cuộc gọi đến req.setCredentials thông qua phương thức xác thực của nó. Bạn sẽ kết thúc với nội dung nào đó dọc theo dòng:

HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
HTTPBasicCredentials cred("user", "password"); 
cred.authenticate(req); 
+0

Chỉ cần thử. Không hoạt động. Tôi nghĩ rằng HTTPBasicCredentials là bắt buộc khi máy chủ từ xa đang mong đợi thông tin xác thực cơ bản. Bây giờ tôi nghĩ ngay cả hàm setCredentials mà tôi đã thử ban đầu cũng không có nghĩa là cho mục đích này. – Sahas

+1

Công trình này ... câu trả lời khác không (bằng tay Base64Encoding sử dụng bộ mã hóa poco). – Homer6

Các vấn đề liên quan