2012-03-22 11 views
13

me gustaría utilizar una función CURL, pero estoy detrás de un proxy, por lo que obtener un error HTTP/1.1 407 Proxy Authentication Required ...Autentificación de poder con el enrollamiento de

Este es el código php que utilizo:

$proxy_user = 'Michiel'; 
$proxy_pass = 'mypassword'; 
$proxy_url = 'myproxyurl:port'; 
$proxy = true; 

$service_url = "https://www.myapiurltocall.com"; 
$service_user = 'user:password:FO'; 
$service_pass = 'password'; 

$ch = curl_init($service_url); 

// Set proxy if necessary 
if ($proxy) { 
    curl_setopt($ch, CURLOPT_PROXY, $proxy_url); 
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_user.':'.$proxy_pass); 
    curl_setopt($ch, CURLOPT_PROXYPORT, 8080); 
    curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM); 
} 

// Set service authentication 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
curl_setopt($ch, CURLOPT_USERPWD, "{$service_user}:{$service_pass}"); 

// HTTP headers 
$headers['Authorization'] = 'Basic ' . base64_encode("$proxy_user:$proxy_pass"); 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_ENCODING, ''); 
curl_setopt($ch, CURLOPT_TIMEOUT, 15); 

//WARNING: this would prevent curl from detecting a 'man in the middle' attack 
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

$data = curl_exec($ch); 

Y no sé lo que hago mal ... ¿Cómo puedo evitar este error?

+1

asumir la '$ PROXY_USER: proxy_pass' $ son los valores correctos, si está detrás de un firewall de oficina, las credenciales de autenticación que se utilizarán serán las de un administrador y no las suyas ... He encontrado algo muy similar en mi entorno de trabajo y ese fue el caso para mí ya que mis credenciales normales no t tiene los privilegios necesarios. – optimusprime619

+0

Sí, detrás de un firewall de oficina. El $ proxy_user y $ proxy pass son 100% correctos (puedo usar mi webmail y comunicador con estas credenciales, entonces ...) ¿Se refiere al administrador de mi PC o de la red? – Michiel

+0

la red es mi mejor apuesta ... – optimusprime619

Respuesta

19

Esto es lo que estoy usando en su mayoría:

function curlFile($url,$proxy_ip,$proxy_port,$loginpassw) 
{ 
    //$loginpassw = 'username:password'; 
    //$proxy_ip = '192.168.1.1'; 
    //$proxy_port = '12345'; 
    //$url = 'http://www.domain.com'; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_PROXYPORT, $proxy_port); 
    curl_setopt($ch, CURLOPT_PROXYTYPE, 'HTTP'); 
    curl_setopt($ch, CURLOPT_PROXY, $proxy_ip); 
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, $loginpassw); 
    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
} 
+1

Ok, ¡muchas gracias! ¿Cómo cabría una autenticación con contraseña (para '$ url' en sí) en esta configuración? – Michiel

+1

Ok, gracias! ¡Lo he descubierto yo mismo! ¡Gracias! – Michiel

+1

Muchas gracias por esto. Esto es exactamente lo que estaba buscando construir. Me has ahorrado un gran dolor de cabeza. –

2

tratar de implementar esto en su función

function send_string($data) { 
//  pr($data);exit; 

    $equi_input="Your values"; 
// echo $equi_input; exit; 
     $agent = ""//Agent Setting for Netscape 
     $url = ""; // URL to POST FORM. (Action of Form) 
     //xml format 
     $efx_request=strtoupper($equi_input); 
     //echo $efx_request;exit; 
     $post_fields = "site_id=""&service_name=""&efx_request=$efx_request"; 
     $credentials = ; 
     $headers = array("HTTP/1.1", 
      "Content-Type: application/x-www-form-urlencoded", 
      "Authorization: Basic " . $credentials 
     ); 
     $fh = fopen('/tmp/test.txt', 'w') or die("can't open file"); //File to write the header information of the curl request. 
     $ch = curl_init(); // Initialize a CURL session. 
     curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
     curl_setopt($ch, CURLOPT_URL, $url); // Pass URL as parameter. 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
     curl_setopt($ch, CURLOPT_STDERR, $fh); 
     curl_setopt($ch, CURLOPT_POST, 1); // use this option to Post a form 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); // Pass form Fields. 
     curl_setopt($ch, CURLOPT_VERBOSE, '1'); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1'); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     $result = curl_exec($ch); // grab URL and pass it to the variable. 
     curl_close($ch); // close curl resource, and free system resources. 
     fclose($fh); 


    //echo '<pre>';print_r($array);echo '</pre>';exit; 
     if (!empty($result)) { 
      return $result; 
     } else { 
      echo "Curl Error" . curl_error($ch); 
     } 
    } 

petición de prueba de enviar 200OK ...

y comprobar su certificado de seguro si está utilizando ....

Gracias.

+0

Gracias por la respuesta, pero no estoy seguro de cómo implementar esto en mi código actual. ¿Podrías ayudarme aquí? – Michiel

+0

también estoy pasando el valor de tus variables como credenciales, Url, Autorización ... estoy aprobando la variable $ credenciales ... estoy pasando nombre de usuario, contraseña en el campo postal .. ,, código de lectura, creo que te ayudará. –

+0

Lo primero es comprobar sus credenciales de autenticación, puede ser que estén creando problemas para usted ... verifique ... –

1

Suponiendo que $proxy_user:$proxy_pass son los valores correctos, si está detrás de un firewall de oficina, las credenciales de autenticación que se utilizarán serán las de un administrador de red y no las suyas ... He encontrado algo muy similar en mi entorno de trabajo y ese fue el caso para mí, ya que mis credenciales normales no tenían los privilegios necesarios. Sin embargo, la mejor manera de garantizar que este sea el caso sería asegurarse de que el código funcione en una red abierta con sus configuraciones proxy comentadas. ¡Espero que esto ayude!

2

Esto es lo que yo uso y que funciona perfectamente:

$proxy = "1.1.1.1:12121"; 
$useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; 
$url = "http://www.google.pt/search?q=anonymous"; 
$credentials = "user:pass" 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,15); 
curl_setopt($ch, CURLOPT_HTTP_VERSION,'CURL_HTTP_VERSION_1_1'); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt($ch, CURLOPT_PROXY, $proxy); 
curl_setopt($ch, CURLOPT_PROXYUSERPWD,$credentials); 
curl_setopt($ch, CURLOPT_USERAGENT,$useragent); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0); 
$result=curl_exec ($ch); 
curl_close ($ch); 
Cuestiones relacionadas