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"