2014-04-18 3 views
0

J'essaye de me connecter au serveur d'API Twitter pour effectuer une "Autentication Application-only". Je ne me soucie pas d'une autre façon de se connecter à Twitter. J'ai besoin de cette méthode spécifique.Connexion SSL via un serveur proxy

Je dois aller de localhost par mon proxy de société à api.twitter.com qui a besoin ssl

Après l'instruction de la page de ce développeur twitter https://dev.twitter.com/docs/auth/application-only-auth, j'ai essayé avec:

cURL:

try { 
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url); 
    if ($this->proxy != '') { 
     curl_setopt($ch, CURLOPT_PROXY, $this->proxy); 
     curl_setopt($ch, CURLOPT_PROXYPORT, $this->port); 
     curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->userpwd); 
    } 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_SSLVERSION, 3); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(" 
     POST /oauth2/token HTTP/1.1 
     Host: api.twitter.com 
     User-Agent: My Twitter App v1.0.23 
     Authorization: Basic ".base64_encode(urlencode($consumer_key).":".urlencode($consumer_secret))." 
     Content-Type: application/x-www-form-urlencoded;charset=UTF-8 
     Content-Length: 29 
     Accept-Encoding: gzip 
     grant_type=client_credentials 
    ")); 
    $response = curl_exec($ch); 
    if (FALSE === $response) throw new Exception(curl_error($ch), curl_errno($ch)); 
     curl_close($ch); 
     var_dump(json_decode($response)); 
} 
catch(Exception $e) { 
    trigger_error(sprintf('Curl failed with error #%d: %s', $e->getCode(), $e->getMessage()), E_USER_ERROR); 
} 

Ce qui me donne

Fatal error: Curl failed with error #35: Unknown SSL protocol error in connection to api.twitter.com

file_get_contents:

$context = stream_context_create(array(
    "http" => array(
    "method"=>"CONNECT", 
    "proxy" => $this->proxy.":".$this->port, 
    "request_fulluri" => true, 
    "header" => " 
     POST /oauth2/token HTTP/1.1 
     Host: api.twitter.com 
     User-Agent: My Twitter App v1.0.23 
     Proxy-Authorization: Basic ".base64_encode(urlencode($this->userpwd))." 
     Authorization: Basic ".base64_encode(urlencode($consumer_key).":".urlencode($consumer_secret))." 
     Content-Type: application/x-www-form-urlencoded;charset=UTF-8 
     Content-Length: 29 
     Accept-Encoding: gzip 
     grant_type=client_credentials 
     ", 
    ), 
)); 
$response = file_get_contents($url, False, $context); 
var_dump(json_decode($response)); 

Ce qui me donne

Warning: file_get_contents(https://api.twitter.com/oauth2/token) [function.file-get-contents]: failed to open stream: Cannot connect to HTTPS server through proxy

fsockopen:

$fp = fsockopen($this->proxy, $this->port); 
fputs($fp, " 
    POST /oauth2/token HTTP/1.1 
    Host: api.twitter.com 
    User-Agent: My Twitter App v1.0.23 
    Authorization: Basic ".base64_encode(urlencode($consumer_key).":".urlencode($consumer_secret))." 
    Content-Type: application/x-www-form-urlencoded;charset=UTF-8 
    Content-Length: 29 
    Accept-Encoding: gzip 
    grant_type=client_credentials 
"); 
$data=""; 
while (!feof($fp)) $data .= fgets($fp,1024); 
fclose($fp); 
var_dump($data); 

Ce qui me donne

HTTP/1.1 400 Bad Request 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: text/html; charset=utf-8 
Proxy-Connection: close 
Connection: close 
Content-Length: 727 

Je suis sûr que le port 443 est ouvert et il est pas un problème de la loc alhost (j'ai eu la même erreur en essayant sur un serveur en ligne).

J'ai essayé même en utilisant la méthode CONNECT au lieu de POST. J'ai essayé de tunnelliser le proxy, mais je ne suis pas sûr que je l'ai fait ni que c'est le problème.

Je suis à court d'idées ..

Répondre

0

trouvé le problème. Il n'y a pas besoin (peut-être seulement dans ce cas, je ne suis pas sûr) de base64 encoder les informations d'identification. Ils seront encodés par le serveur. Je ne connais pas la raison de ces différentes réponses d'erreur, mais était en fait un problème de double codage, à cause de laquelle le serveur n'a pas pu vérifier mes informations d'identification.

1

Essayez de supprimer ce:

curl_setopt($ch, CURLOPT_SSLVERSION, 3); 

Vous avez seulement une valeur dans ce tableau, il est faux.

curl_setopt($ch, CURLOPT_HTTPHEADER, array(" 
     POST /oauth2/token HTTP/1.1 
     Host: api.twitter.com 
     User-Agent: My Twitter App v1.0.23 
     Authorization: Basic ".base64_encode(urlencode($consumer_key).":".urlencode($consumer_secret))." 
     Content-Type: application/x-www-form-urlencoded;charset=UTF-8 
     Content-Length: 29 
     Accept-Encoding: gzip 
     grant_type=client_credentials 
    ")); 

Modifier ci-dessus pour cela:

$consumer_key = base64_encode(urlencode($consumer_key); 
$consumer_secret = urlencode($consumer_secret); 

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     "Host: api.twitter.com", 
     "User-Agent: My Twitter App v1.0.23", 
     "Authorization: Basic $consumer_key:$consumer_secret", 
     "Content-Type: application/x-www-form-urlencoded;charset=UTF-8", 
     "Accept-Encoding: gzip", 
     "grant_type=client_credentials" 
     )); 

si vous souhaitez inclure le Content-Length: xx, vous devez utiliser strlen() pour obtenir la longueur de chaîne du poste, ex;

$length = strlen($post_content); 

Puis ajoutez au tableau CURLOPT_HTTPHEADER:

"Content-Length: $length" 
+0

Merci l'homme, mais malheureusement, votre réponse n'a pas aidé .. –

Questions connexes