2009-08-25 14 views
6

He estado jugando con la biblioteca Poco Net durante algún tiempo, es bastante agradable. Muy conveniente y fácil de entender.Autenticación Proxy en la biblioteca POCO Net C++

Pude configurar una dirección de proxy, y dice 407 Proxy authorization required, properly. Me imaginé que

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

me trataron valores como: "texto plano" "básica" en el esquema, y ​​"usuario: contraseña" en authInfo. No parece funcionar. Google no está ayudando.

¿Alguien ha hecho esto usando Poco Net anteriormente? ¿O es obvio el uso y no puedo hacer que funcione debido a mi ignorancia hacia la autenticación proxy en general? Por favor aconséjame.

EDIT: Después de jugar un poco más, creo que la función setCredentials se usa cuando el servidor remoto espera la información de autenticación para iniciar sesión. No he podido encontrar una forma de hacer la autenticación proxy utilizando las bibliotecas de Poco Net. Sin embargo, pude establecer el servidor proxy y el puerto. Esto es lo que tendría si hubiera solo un servidor proxy sin autenticación:

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

Necesita ayuda.

EDIT: Sobre la base de la solución sugerida por @StackedCrooked, he intentado establecer detalles de autenticación de proxy a la cabecera de la solicitud antes de hacer la solicitud, y en otro enfoque se encuentran en Internet, me puse de proxy detalles de autenticación sólo después de hacer una solicitud inicial y aparece un error 407, y luego hacer la solicitud nuevamente. Ambos métodos siguieron dando el mismo error 407. Mi código actual es el siguiente:

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

¿Podrías poner un testcase en codepad.org o algo así? Me encantaría probarlo contra mi proxy. – joshperry

+1

Creo que el encabezado correcto, como sugirió @StackedCrooked, es "Proxy-Authorization" en lugar de "Proxy-Authentication". ¿Tu código real está usando el correcto? –

Respuesta

2

Es probable que necesite agregar el campo de Autorización de Proxy a los encabezados HTTP. La clase HTTPRequest de Poco no tiene un método dedicado para esto. Sin embargo, ya que hereda la clase NameValueCollection públicamente se puede establecer de esta manera:

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

Dónde QWxhZGRpbjpvcGVuIHNlc2FtZQ== es la base 64 versión de "Aladdin: ábrete sésamo" codificados.

Muchos de estos problemas se vuelven más fáciles una vez que aprende un poco sobre el protocolo HTTP. Ahora, en su mayoría, estoy predicándome a mí mismo :)

+0

He estado intentando esto de varias maneras, siempre está dando el mismo error 407. Por favor vea la edición en la pregunta. – Sahas

+0

Sí, no puedo ayudarte más que esto porque mi conocimiento sobre este tema también es limitado.Espero que hayas encontrado una solución por ahora (¡o que encuentres una solución pronto!). – StackedCrooked

+0

Además de la autenticación básica, existen otras autenticaciones: digest, NTLM, pasaporte, etc. WinHTP hace esto por usted (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383144(v=vs.85)) .aspx). Me gustaría saber si poco C++ (o cualquier otra biblioteca) puede hacer lo mismo. – quixver

1

No he utilizado yo mismo, pero ¿ha mirado a la clase HTTPBasicCredentials? Concluye la llamada a req.setCredentials a través de su método de autenticación. Usted terminaría con algo parecido a:

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

Acabo de intentarlo. No está funcionando Creo que HTTPBasicCredentials es necesario cuando el servidor remoto espera información de autenticación básica. Ahora creo que incluso la función setCredentials que probé inicialmente tampoco es para este propósito. – Sahas

+1

Esto funciona ... la otra respuesta no (Base64Encoding manualmente usando el encoder poco). – Homer6

Cuestiones relacionadas