Не удалось проверить подпись и токен - PullRequest
2 голосов
/ 06 сентября 2010

По независящим от меня причинам я использую PHP4 для написания твиттер-клиента.Запросы не работают должным образом - мне трудно понять, что не так.Есть идеи?

Я взял код и написал его очень простым сценарием, чтобы проиллюстрировать, что происходит.Я скрыл ключи OAuth в целях безопасности.

<code><?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 '
';эхо«;echo 'Подпись OAuth:
';
var_dump($oauth_signature);
echo '
';эхо«;//выход;$ 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, массив ('Авторизация:'. $ auth_string));$ response = curl_exec ($ curl);curl_close ($ завиток);var_dump ($ ответ);/ * функция из PHP.net - нет встроенной функции PHP4 * / 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))));возвращаем base64_encode ($ hash);}?>

дело в том, что я пытался запустить этот скрипт со значениями http://dev.twitter.com/pages/auth#signing-requests, и подпись и строка авторизации были точно такими же - но когда я пытаюсь выполнить с CURLс моими собственными значениями (используя точно такой же код) он просто дает мне довольно неописанное «Не удалось проверить подпись и токен oauth»

1 Ответ

4 голосов
/ 06 сентября 2010

Не могу поверить - просто нашел это через секунду или две после публикации этого вопроса. На самом деле в этом было две вещи:

1) Время на моем сервере разработки не было правильно установлено. Однако после правильной настройки все равно это не сработало. 2) после установки curl_setopt ($ curl, CURLOPT_POST, true) все волшебным образом работает. Hoorah!

...