2010-09-06 14 views
2

Pour des raisons indépendantes de ma volonté, j'utilise PHP4 pour écrire un client twitter. Les demandes ne fonctionnent pas correctement - j'ai du mal à voir ce qui ne va pas. Des idées?Échec de la validation de la signature et du jeton oauth

J'ai saisi le code et l'ai tapé dans un script très simple ici pour illustrer essentiellement ce qui se passe. J'ai caché des clés OAuth à des fins de sécurité.

<?php 

$requestTokenURL = 'https://api.twitter.com/oauth/request_token'; 
$consumerKey = 'fLxA6J1111111111PnvVOg'; 
$consumerSecret = 'H5QxDHAOHn1111111111111Ozet1HRTtVAV1FM3oYk'; 
$callbackURL = 'http://www.example.com'; 
$signature = 'POST&' . urlencode($requestTokenURL) . '&'; 

$auth_params = array(
    'oauth_callback' => $callbackURL, 
    'oauth_consumer_key' => $consumerKey, 
    'oauth_nonce' => md5(time()), 
    'oauth_signature_method' => 'HMAC-SHA1', 
    'oauth_timestamp' => time(), 
    'oauth_version' => '1.0' 
); 

ksort($auth_params); 

foreach($auth_params as $k=>$v) { 
    if ($k == 'oauth_callback') { 
    $v = urlencode($v); 
    } 
    $signature .= urlencode($k) . '%3D' . urlencode($v) . '%26'; 
} 
$signature = substr($signature, 0, strlen($signature) - 3); 
$signing_key = $consumerSecret . '&'; 
$oauth_signature = hmac_sha1($signing_key, $signature); 

$auth_params['oauth_signature'] = $oauth_signature; 

$auth_string = 'OAuth '; 
foreach($auth_params as $k=>$v) { 
    $auth_string .= $k . '="' . urlencode($v); 
    $auth_string .= ($k == 'oauth_signature') ? '&' : ''; 
    $auth_string .= '", '; 
} 
$auth_string = substr($auth_string, 0, strlen($auth_string) - 2); 

echo 'Authorization header: <pre>'; 
echo $auth_string; 
echo '</pre>'; 
echo '<br /><br />'; 
echo 'OAuth Signature: <pre>'; 
var_dump($oauth_signature); 
echo '</pre>'; 
echo '<br /><br />'; 
//exit; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $requestTokenURL); 
curl_setopt($curl, CURLOPT_POST, GET); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: ' . $auth_string) 
); 

$response = curl_exec($curl); 
curl_close($curl); 

var_dump($response); 

/* function from PHP.net - no PHP4 built-in function */ 
function hmac_sha1($key, $data) { 
    $blocksize = 64; 
    $hashfunc = 'sha1'; 
    if (strlen($key) >$blocksize) { 
     $key = pack('H*', $hashfunc($key)); 
    } 

    $key = str_pad($key, $blocksize, chr(0x00)); 
    $ipad = str_repeat(chr(0x36), $blocksize); 
    $opad = str_repeat(chr(0x5c), $blocksize); 
    $hash = pack('H*', $hashfunc(($key^$opad).pack('H*',$hashfunc(($key^$ipad).$data)))); 

    return base64_encode($hash); 
} 
?> 

la chose est, j'ai essayé de lancer ce script avec les valeurs de http://dev.twitter.com/pages/auth#signing-requests et la signature et la chaîne d'autorisation étaient exactement les mêmes - mais lorsque je tente d'exécuter avec CURL avec mes propres valeurs (en utilisant le code exacty même) il me donne juste le plutôt non-descript "Échec de valider la signature et le jeton oauth"

Répondre

4

Je ne peux pas le croire - je l'ai trouvé juste une seconde ou deux après avoir posté cette question. Il y avait en fait deux choses qui ne marchaient pas:

1) L'heure sur mon serveur dev n'était pas correctement définie. Après avoir réglé correctement, cependant, cela n'a toujours pas fonctionné. 2) après avoir réglé curl_setopt ($ curl, CURLOPT_POST, true), tout a fonctionné comme par magie. Hourra!