Статьи

Понимание OAuth — Чирикать с нуля, часть 2

Добро пожаловать обратно в Понимание OAuth — Tweeting с нуля. Это вторая часть серии из двух частей, которая начинается там, где мы остановились в первой части, с вашими возвращенными учетными данными доступа. Так как получение учетных данных является изнурительной частью процесса, остается сделать гораздо больше, кроме публикации твита от имени пользователя. Надеюсь, вы найдете, что последним этапам будет намного легче следовать и их будет веселее реализовать.

Перво-наперво, вы должны, по крайней мере, сохранить специфичные для пользователя детали и учетные данные из части 1 в $_SESSION чтобы их можно было использовать позже, хотя, скорее всего, вы захотите сохранить информацию в базе данных, чтобы вы могли извлекать их в любое время отправлять твиты от имени других.

 <?php //... $response = file_get_contents($requestUrl); parse_str($response, $values); $_SESSION["accessToken"] = $values["oauth_token"]; $_SESSION["accessTokenSecret"] = $values["oauth_token_secret"]; $_SESSION["twitterUserId"] = $values["user_id"]; $_SESSION["twitterUsername"] = $values["screen_name"]; // Redirect the user to the application's form header("Location: /postTweet.php"); 

Поскольку ваше приложение имеет необходимые учетные данные доступа, и вы безопасно спрятали их для будущего использования, вы можете перенаправить пользователя в форму, где он может ввести текст своего твита.

 <form action="/postTweet.php" method="post"> <textarea name="tweet" rows="3" cols="50"></textarea> <br> <input type="submit" value="Send"> </form> 

Отправка в Twitter

После того, как вы получите учетные данные для доступа к API Twitter, вы можете многое сделать (полную документацию по API можно найти по адресу dev.twitter.com/docs/api ). В этой статье я показываю только использование статусов / обновлений, чтобы публиковать твиты. Вы можете запросить многие вызовы API для ответа данными в формате XML или JSON, просто добавив .xml или .json в конец URL-адреса. Лично я считаю, что с JSON гораздо проще работать, чем с XML.

statuses/update требует HTTP POST для отправки параметров OAuth в заголовке HTTP. Ранее вы использовали только GET в разговорах с Twitter.

Все URL ресурсов OAuth v1 Twitter API начинаются с «http://api.twitter.com/1/» и заканчиваются именем ресурса, за которым следуют .xml или .json . Отныне вам нужны только учетные данные — учетные данные потребителя и учетные данные для доступа; Учетные данные запроса отбрасываются, поскольку они были необходимы только для процесса авторизации.

Построение подписи выполняется так же, как и раньше, за исключением того, что теперь вы включаете секретный ключ доступа в $sigKey .

 <?php $oauthVersion = "1.0"; $apiResourceUrl = "http://api.twitter.com/1/statuses/update.json"; $nonce = md5(mt_rand()); $oauthSignatureMethod = "HMAC-SHA1"; $oauthTimestamp = time(); $accessToken = $_SESSION["accessToken"]; $accessTokenSecret = $_SESSION["accessTokenSecret"]; $tweetText = trim($_POST["tweet"]); $sigBase = "POST&" . rawurlencode($apiResourceUrl) . "&" . rawurlencode("oauth_consumer_key=" . rawurlencode($consumerKey) . "&oauth_nonce=" . rawurlencode($nonce) . "&oauth_signature_method=" . rawurlencode($oauthSignatureMethod) . "&oauth_timestamp=" . $oauthTimestamp . "&oauth_token=" . rawurlencode($accessToken) . "&oauth_version=" . rawurlencode($oauthVersion) . "&status=" . rawurlencode($tweetText)); $sigKey = rawurlencode($consumerSecret) . "&" . rawurlencode($accessTokenSecret); $oauthSig = base64_encode(hash_hmac("sha1", $sigBase, $sigKey, true)); 

Транзакции OAuth POST могут (и обязательны для Twitter) иметь параметры OAuth, включенные в специальный HTTP-заголовок Authorization . Стоит отметить, что помимо типичных параметров OAuth, $sigBase также включает в себя статус параметра ресурса API, описанный выше. Параметры не OAuth необходимы в подписи, но исключаются из заголовка HTTP. Вместо этого они используются в теле POST .

 <?php $authHeader = "OAuth oauth_consumer_key=" . rawurlencode($consumerKey) . "," . "oauth_nonce=" . rawurlencode($nonce) . "," . "oauth_signature_method=" . rawurlencode($oauthSignatureMethod) . "," . "oauth_signature=" . rawurlencode($oauthSig) . "," . "oauth_timestamp=". rawurlencode($oauthTimestamp) . "," . "oauth_token=" . rawurlencode($accessToken) . "," . "oauth_version=" . rawurlencode($oauthVersion); $httpPostDataUrl = "status=" . $tweetText; $context = stream_context_create(array("http" => array( "method" => "POST", "header" => "Content-Type: application/x-www-form-urlencodedrnAuthorization: " . $authHeader . "rn", "content" => $httpPostDataUrl))); $result = file_get_contents($apiResourceUrl, false, $context); - <?php $authHeader = "OAuth oauth_consumer_key=" . rawurlencode($consumerKey) . "," . "oauth_nonce=" . rawurlencode($nonce) . "," . "oauth_signature_method=" . rawurlencode($oauthSignatureMethod) . "," . "oauth_signature=" . rawurlencode($oauthSig) . "," . "oauth_timestamp=". rawurlencode($oauthTimestamp) . "," . "oauth_token=" . rawurlencode($accessToken) . "," . "oauth_version=" . rawurlencode($oauthVersion); $httpPostDataUrl = "status=" . $tweetText; $context = stream_context_create(array("http" => array( "method" => "POST", "header" => "Content-Type: application/x-www-form-urlencodedrnAuthorization: " . $authHeader . "rn", "content" => $httpPostDataUrl))); $result = file_get_contents($apiResourceUrl, false, $context); 

Если все прошло гладко, вы должны были просто опубликовать в твиттере от имени авторизованного пользователя. Twitter отправляет статус успеха или неудачи вместе с очень большим количеством информации о транзакции, которую вы можете использовать с print_r(json_decode($result)) если хотите.

Резюме

Теперь, когда вы хорошо понимаете, как работает Oauth, внедрение сторонней библиотеки или устранение неполадок с OAuth в целом должно быть намного проще. Таким образом, вы узнали, как:

  • Создайте новое приложение Twitter и получите учетные данные потребителя.
  • Получите учетные данные запроса, которые необходимы для запроса учетных данных доступа
  • Авторизуйте ваше приложение с пользователем и получите учетные данные доступа
  • Опубликовать твит от имени другого пользователя, используя учетные данные доступа

Сегодня некоторые из самых популярных веб-приложений предоставляют доступ к API — Flickr , Facebook , foursquare , Netflix , Last.fm и GetGlue и многие другие. Наличие глубоких знаний о том, как легко общаться с этими приложениями, является очень желательным навыком! Некоторые из того, что вы узнали здесь относительно хэширования подписей и обмена токенами, также могут быть хорошо применены к не-Oauth v1.0 API, таким как интерфейс pre-OAuth от Flickr и гораздо более понятный OAuth v2 . Удачи и приятного времяпровождения!

Код для этой серии можно найти на GitHub.

Изображение через Photosani / Shutterstock