По причинам, не зависящим от меня, я использую PHP4 для написания клиента Twitter. Запросы не работают должным образом – я с трудом вижу, что случилось. Есть идеи?
Я схватил код и ударил его по очень простому сценарию, чтобы проиллюстрировать, по сути, что происходит. Я скрыл ключи OAuth для целей безопасности.
<?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); } ?>
Дело в том, что я попытался запустить этот скрипт со значениями из http://dev.twitter.com/pages/auth#signing-requests, а подпись и строка авторизации были точно такими же, но когда я пытаюсь выполнить с CURL с мои собственные значения (используя тот же самый код), это просто дает мне довольно не-дескриптор «Не удалось проверить oauth подпись и токен»
Не могу поверить в это – просто нашел это через секунду или два после публикации этого вопроса. На самом деле в этом было две вещи:
1) Не удалось установить время на моем dev-сервере. Однако, установив это правильно, он все равно не работает. 2) после установки curl_setopt ($ curl, CURLOPT_POST, true) все магически сработало. Hoorah!