Авторизация на сайте через twitter (PHP)

Вступление

Авторизация на сайте через твиттер происходит в 5 этапов:

  1. Регистрация приложения и получение секретных ключей;
  2. Отправка запроса на request_token и получение двух токенов: oauth_token и oauth_token_secret;
  3. Авторизация пользователя или подтверждение пользователя, что он доверяет вашему приложению (authorize);
  4. Получение идентификатора пользователя (access_token);
  5. Получение данных пользователя с Твиттера.

Все примеры на языке программирования PHP.

Для тех кто не любит читать мануалы и документацию, предлагаю перейти сразу к наглядному примеру:

С текстовым сопровождением: http://expange.ru/files/130/twitter_auth.php (Все строки и подписи выводятся на экран, происходит авторизация приложения и вывод данных пользователя на экран).

Без текстового сопровождения: http://expange.ru/files/130/twitter_auth_nodebug.php (Происходит авторизация приложения и вывод данных пользователя на экран).

Скачать архив: TwitterAuth.rar 3,57Кб.

Более или менее подготовленный PHP-программист должен легко разобраться, класс для авторизации очень простой.

Регистрация приложения

Переходим по ссылке: https://dev.twitter.com/apps/new и создаем новое приложение.

Необходимо заполнить следующие поля:

  • Название приложения;
  • Описание — краткое описание вашего приложения;
  • Сайт — сайт с которого будет производиться авторизация;
  • callback-страница — страница на которую будет произведен «редирект» после авторизации.

Создание приложения (twitter)

После заполнения всех полей создается приложение и вы попадаете на страницу с секретными ключами (Consumer key, Consumer secret).

Consumer key, Consumer secret

Созданное приложение (twitter)

Для секретных ключей определяем соответствующие константы. Например:

<?php define ('TWITTER_CONSUMER_KEY', 'O0IgnYHonW4KGL6pJr0YCQ'); define ('TWITTER_CONSUMER_SECRET', 'OYUjBgJPl4yra3N32sSpSSVGboLSCo5pLGsky20VJE'); define ('TWITTER_URL_CALLBACK', 'http://expange.ru/twitter_auth.php?auth=1'); define ('URL_REQUEST_TOKEN', 'https://api.twitter.com/oauth/request_token'); define ('URL_AUTHORIZE', 'https://api.twitter.com/oauth/authorize'); define ('URL_ACCESS_TOKEN', 'https://api.twitter.com/oauth/access_token'); define ('URL_ACCOUNT_DATA', 'https://api.twitter.com/1.1/users/show.json'); ?>

request_token

Наверное самый сложный пункт — одно неверное движение и застрянете здесь надолго. Очень много тонкостей, которые нужно соблюдать при формировании секретной подписи (oauth_signature). Именно этот пункт вызывает много вопросов у пользователей, как при формировании строки для кодирования так и получения подписи oauth_signature.

Читайте очень внимательно.

Данный этап разделен на 4! подэтапа:

  1. Сформировать строку;
  2. Получить хэш-код сформированной строки функцией hash_hmac(), полученный хэш закодировать функцией base64_encode();
  3. Сформировать GET-запрос по адресу: https://api.twitter.com/oauth/request_token;
  4. Получить результат GET-запроса (можно использовать curl или file_get_contents).

Формирование строки (base_string)

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

Формат строки:

Т.к. пример на PHP, строку буду формировать как удобнее программисту.

<?php // рандомная строка (для безопасности) $oauth_nonce = md5(uniqid(rand(), true)); // ae058c443ef60f0fea73f10a89104eb9 // время когда будет выполняться запрос (в секундых) $oauth_timestamp = time(); // 1310727371 /** * Константы смотрите чуть повыше * * Обратите внимание на использование функции urlencode и расположение амперсандов. * Если поменяете положение параметров oauth_... или уберете где-нибудь urlencode - получите ошибку * */ $oauth_base_text = "GET&"; $oauth_base_text .= urlencode(URL_REQUEST_TOKEN)."&"; $oauth_base_text .= urlencode("oauth_callback=".urlencode(TWITTER_URL_CALLBACK)."&"); $oauth_base_text .= urlencode("oauth_consumer_key=".TWITTER_CONSUMER_KEY."&"); $oauth_base_text .= urlencode("oauth_nonce=".$oauth_nonce."&"); $oauth_base_text .= urlencode("oauth_signature_method=HMAC-SHA1&"); $oauth_base_text .= urlencode("oauth_timestamp=".$oauth_timestamp."&"); $oauth_base_text .= urlencode("oauth_version=1.0"); /** * В результате получим строку, такого вида: GET&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token& oauth_callback%3Dhttp%253A%252F%252Fexpange.ru%252Ftwitter_auth.php%253Fauth%253D1%26 oauth_consumer_key%3DO0IgnYHonW4KGL6pJr0YCQ%26 oauth_nonce%3Dae058c443ef60f0fea73f10a89104eb9%26 oauth_signature_method%3DHMAC-SHA1%26 oauth_timestamp%3D1310727371%26 oauth_version%3D1.0 * Естественно строка должны быть однострочной (переносы сделаны для удобства сравнения) */ ?>

Хэш-код (hash_hmac, base64_encode)

В функцию hash_hmac() передаются 4 параметра: алгоритм, строка, ключ, булево значение — true.

Алгоритм — sha1, строка была сформирована выше.

Ключ

Ключ имеет следующее значение: Consumer secret + знак амперсанда.

<?php $key = TWITTER_CONSUMER_SECRET."&"; // На конце должен быть амперсанд & !!! // key: OYUjBgJPl4yra3N32sSpSSVGboLSCo5pLGsky20VJE& $oauth_signature = base64_encode(hash_hmac("sha1", $oauth_base_text, $key, true)); // oauth_signature: BB6w/jAdrHQD1/iUqqEZiI8o2M0= ?>

GET-запрос request_token

И так параметр oauth_signature мы сформировали. Осталось сформировать GET-запрос, получить результат его выполнения и получить заветные токены: oauth_token и  oauth_token_secret.

GET-запрос будет выглядеть следующим образом:

<?php /** * Опять же внимательно смотрим на функцию urlencode * */ $url = URL_REQUEST_TOKEN; $url .= '?oauth_callback='.urlencode(TWITTER_URL_CALLBACK); $url .= '&oauth_consumer_key='.TWITTER_CONSUMER_KEY; $url .= '&oauth_nonce='.$oauth_nonce; $url .= '&oauth_signature='.urlencode($oauth_signature); $url .= '&oauth_signature_method=HMAC-SHA1'; $url .= '&oauth_timestamp='.$oauth_timestamp; $url .= '&oauth_version=1.0'; /** * Строка запроса (Переносы строк естественно не нужны): https://api.twitter.com/oauth/request_token ?oauth_callback=http%3A%2F%2Fexpange.ru%2Ftwitter_auth.php%3Fauth%3D1 &oauth_consumer_key=O0IgnYHonW4KGL6pJr0YCQ &oauth_nonce=ae058c443ef60f0fea73f10a89104eb9 &oauth_signature=BB6w%2FjAdrHQD1%2FiUqqEZiI8o2M0%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1310727371 &oauth_version=1.0 **/ /** * Получить результат GET-запроса будем функцией file_get_contents * можно и даже лучше использовать curl, но здесь и эта функция справляется отлично * */ $response = file_get_contents($url); // если все сделано правильно, $response будет содержать нечто подобное: // oauth_token=DZmWEaKh7EqOJKScI48IgYMxYyFF2riTyD5N9wqTA&oauth_token_secret=NuAL0AvzocI9zxO7VnVPrNEcb9EW8kwpwJmcqg5pMWg&oauth_callback_confirmed=true // // Если что-то не так, будет выведено следующее: // Failed to validate oauth signature and token // Самая распространенная ошибка, означающая, что в большинстве случаев // подпись oauth_signature сформирована неправильно. // Еще раз внимательно просмотрите как формируется строка и кодируется oauth_signature, // сверьте с примером использования функций urlencode // И так все выведено правильно. Разбираем полученную строку. parse_str($response, $result); /** * $result: Array ( [oauth_token] => DZmWEaKh7EqOJKScI48IgYMxYyFF2riTyD5N9wqTA [oauth_token_secret] => NuAL0AvzocI9zxO7VnVPrNEcb9EW8kwpwJmcqg5pMWg [oauth_callback_confirmed] => true ) */ // session_start вначале я думаю у вас вызывается $_SESSION['oauth_token'] = $oauth_token = $result['oauth_token']; $_SESSION['oauth_token_secret'] = $oauth_token_secret = $result['oauth_token_secret']; ?>

И так, если данные получены удачно, можно переходить к этапу номер 2.

Failed to validate oauth signature and token

Самая распространенная ошибка, означающая, что в большинстве случаев подпись oauth_signature сформирована неправильно.

Еще раз, внимательно просмотрите как формируется строка и кодируется oauth_signature, сверьте с примером использования функций urlencode.

authorize

Самый простой этап, нам нужно сформировать строку запроса и перейти по сформированному адресу.

<?php $url = URL_AUTHORIZE; $url .= '?oauth_token='.$oauth_token; // url: https://api.twitter.com/oauth/authorize?oauth_token=qexSk7ySxVV5DPr9j9zE0RuxT5Zxbp1rOPqemizeU ?>

Авторизация приложения

После перехода по адресу, попадаем на страницу авторизации приложения (т.е. пользователь доверяет вашему приложению).

Авторизация приложения (twitter)

После авторизации приложения происходит возврат на страницу TWITTER_URL_CALLBACK (http://expange.ru/twitter_auth.php?auth=1), в GET-запрос добавляется 2 параметра: &oauth_token=zzphuIadnjHpoYFv8crAwH67WR2gryp2s7y1AHphuw&oauth_verifier=9y1OPe6oGvDPSeTXHcWDmGUDY9I6d9RrFlz2YNJJRfc.

access_token

После возврата на страницу получили 2 GET-параметра:

  • oauth_token: zzphuIadnjHpoYFv8crAwH67WR2gryp2s7y1AHphuw
  • oauth_verifier: 9y1OPe6oGvDPSeTXHcWDmGUDY9I6d9RrFlz2YNJJRfc

Данный этап похож на этап request_token, так же понадобится сформировать oauth_nonce, oauth_timestamp, oauth_signature и выполнить GET-запрос, по определенному адресу.

Формирование строки (base_string)

Как и в пункте request_token, при формировании строки главное соблюсти порядок расположения параметров.

Формат строки:

Формирование строки сразу в качестве PHP-примера.

<?php // Заново создаем oauth_nonce и oauth_timestamp // рандомная строка (для безопасности) $oauth_nonce = md5(uniqid(rand(), true)); // c775a2221c0d3a187438628e8427f262 // время когда будет выполняться запрос (в секундых) $oauth_timestamp = time(); // 1310727378 // oauth_token $oauth_token = $_GET['oauth_token']; // oauth_verifier $oauth_verifier = $_GET['oauth_verifier']; // oauth_token_secret получаем из сессии, которую зарегистрировали // во время запроса request_token $oauth_token_secret = $_SESSION['oauth_token_secret']; /** * Обратите внимание на использование функции urlencode и расположение амперсандов. * Если поменяете положение параметров oauth_... или уберете где-нибудь urlencode - получите ошибку * */ $oauth_base_text = "GET&"; $oauth_base_text .= urlencode(URL_ACCESS_TOKEN)."&"; $oauth_base_text .= urlencode("oauth_consumer_key=".TWITTER_CONSUMER_KEY."&"); $oauth_base_text .= urlencode("oauth_nonce=".$oauth_nonce."&"); $oauth_base_text .= urlencode("oauth_signature_method=HMAC-SHA1&"); $oauth_base_text .= urlencode("oauth_token=".$oauth_token."&"); $oauth_base_text .= urlencode("oauth_timestamp=".$oauth_timestamp."&"); $oauth_base_text .= urlencode("oauth_verifier=".$oauth_verifier."&"); $oauth_base_text .= urlencode("oauth_version=1.0"); /** * В результате получим строку, такого вида: GET&https%3A%2F%2Fapi.twitter.com%2Foauth%2Faccess_token& oauth_consumer_key%3DO0IgnYHonW4KGL6pJr0YCQ%26 oauth_nonce%3Dc775a2221c0d3a187438628e8427f262%26 oauth_signature_method%3DHMAC-SHA1%26 oauth_token%3DDZmWEaKh7EqOJKScI48IgYMxYyFF2riTyD5N9wqTA%26 oauth_timestamp%3D1310727378%26 oauth_verifier%3DEJxb8eSgNdiUZPwi5Qwwt7JPE13nfXpCXOZSwCqBU%26 oauth_version%3D1.0 * Естественно строка должны быть однострочной (переносы сделаны для удобства сравнения) */ ?>

Ключ

Ключ имеет следующее значение: Consumer secret + знак амперсанда + oauth_token_secret.

<?php $key = TWITTER_CONSUMER_SECRET."&".$oauth_token_secret; // key: OYUjBgJPl4yra3N32sSpSSVGboLSCo5pLGsky20VJE&NuAL0AvzocI9zxO7VnVPrNEcb9EW8kwpwJmcqg5pMWg $oauth_signature = base64_encode(hash_hmac("sha1", $oauth_base_text, $key, true)); // oauth_signature: WqIpf1g6fEdNk67Rc+cP9zxji5k= ?>

GET-запрос access_token

И так параметр oauth_signature мы сформировали. Осталось сформировать GET-запрос, получить результат его выполнения и получить заветные токены: oauth_token и  oauth_token_secret.

GET-запрос будет выглядеть следующим образом:

Старый нерабочий кусок кода

$url = URL_REQUEST_TOKEN;

$url .= '?oauth_callback='.urlencode(TWITTER_URL_CALLBACK);

$url .= '&oauth_consumer_key='.TWITTER_CONSUMER_KEY;

$url .= '&oauth_nonce='.$oauth_nonce;

$url .= '&oauth_signature='.urlencode($oauth_signature);

$url .= '&oauth_signature_method=HMAC-SHA1';

$url .= '&oauth_timestamp='.$oauth_timestamp;

$url .= '&oauth_version=1.0';

<?php /** * Опять же внимательно смотрим на функцию urlencode * */ $url = URL_ACCESS_TOKEN; $url .= '?oauth_nonce='.$oauth_nonce; $url .= '&oauth_signature_method=HMAC-SHA1'; $url .= '&oauth_timestamp='.$oauth_timestamp; $url .= '&oauth_consumer_key='.TWITTER_CONSUMER_KEY; $url .= '&oauth_token='.urlencode($oauth_token); $url .= '&oauth_verifier='.urlencode($oauth_verifier); $url .= '&oauth_signature='.urlencode($oauth_signature); $url .= '&oauth_version=1.0'; /** * Строка запроса $url (Переносы строк естественно не нужны): https://api.twitter.com/oauth/access_token ?oauth_nonce=c775a2221c0d3a187438628e8427f262 &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1310727378 &oauth_consumer_key=O0IgnYHonW4KGL6pJr0YCQ &oauth_token=DZmWEaKh7EqOJKScI48IgYMxYyFF2riTyD5N9wqTA &oauth_verifier=EJxb8eSgNdiUZPwi5Qwwt7JPE13nfXpCXOZSwCqBU &oauth_signature=WqIpf1g6fEdNk67Rc%2BcP9zxji5k%3D &oauth_version=1.0 **/ /** * Получить результат GET-запроса будем функцией file_get_contents * можно и даже лучше использовать curl, но здесь и эта функция справляется отлично */ $response = file_get_contents($url); // если все сделано правильно, $response будет содержать нечто подобное: // oauth_token=228497030-pmcYm211OCBvlRnLBA9pjbtpKtMQ7ofghRwWJYlA&oauth_token_secret=IyZ5SFgTfRWtluEyavSAkUi8MJMgdYCZUlt5aNNMg&user_id=228497030&screen_name=expange // Разбираем полученную строку. parse_str($response, $result); /** * $result: Array ( [oauth_token] => 228497030-pmcYm211OCBvlRnLBA9pjbtpKtMQ7ofghRwWJYlA [oauth_token_secret] => IyZ5SFgTfRWtluEyavSAkUi8MJMgdYCZUlt5aNNMg [user_id] => 228497030 [screen_name] => expange ) */ ?>

Самое главное мы получили — user_id, и то, что этот user_id на самом деле тот за кого себя выдает.

Данные Твиттер-пользователя

У многих, кто продолжал использовать версию 1.0 стала появляться ошибка Bad Authentication Data, с кодом 215. С переходом твиттера с версии 1.0 на версию 1.1, усложнилось получение данных пользователя. Теперь необходимо генерировать подпись из параметров запроса.

  1. oauth_token получили в прошлом запросе
  2. oauth_token_secret получили в прошлом запросе
  3. Сформировать строку GET-запроса;
  4. Получить и обработать данные.

Адрес запроса

Теперь данные возвращаются только в JSON формате:
https://api.twitter.com/1.1/users/show.json?screen_name=<SCREEN_NAME>

Помимо этого нужно сформировать подпись.

Пример api.twitter.com/1.1/users/show.json

Формат адреса: https://api.twitter.com/1.1/users/show.json?screen_name=expange

<?php // Заново создаем oauth_nonce и oauth_timestamp // рандомная строка (для безопасности) $oauth_nonce = md5(uniqid(rand(), true)); // время когда будет выполняться запрос (в секундых) $oauth_timestamp = time(); $oauth_token = $result['oauth_token']; $oauth_token_secret = $result['oauth_token_secret']; $screen_name = $result['screen_name']; $oauth_base_text = "GET&"; $oauth_base_text .= urlencode(URL_ACCOUNT_DATA).'&'; $oauth_base_text .= urlencode('oauth_consumer_key='.TWITTER_CONSUMER_KEY.'&'); $oauth_base_text .= urlencode('oauth_nonce='.$oauth_nonce.'&'); $oauth_base_text .= urlencode('oauth_signature_method=HMAC-SHA1&'); $oauth_base_text .= urlencode('oauth_timestamp='.$oauth_timestamp."&"); $oauth_base_text .= urlencode('oauth_token='.$oauth_token."&"); $oauth_base_text .= urlencode('oauth_version=1.0&'); $oauth_base_text .= urlencode('screen_name=' . $screen_name); $key = TWITTER_CONSUMER_SECRET . '&' . $oauth_token_secret; $signature = base64_encode(hash_hmac("sha1", $oauth_base_text, $key, true)); // Формируем GET-запрос $url = URL_ACCOUNT_DATA; $url .= '?oauth_consumer_key=' . TWITTER_CONSUMER_KEY; $url .= '&oauth_nonce=' . $oauth_nonce; $url .= '&oauth_signature=' . urlencode($signature); $url .= '&oauth_signature_method=HMAC-SHA1'; $url .= '&oauth_timestamp=' . $oauth_timestamp; $url .= '&oauth_token=' . urlencode($oauth_token); $url .= '&oauth_version=1.0'; $url .= '&screen_name=' . $screen_name; // делаем запрос $response = file_get_contents($url); // разбираем запрос $user_data = json_decode($response); echo '<pre>'; print_r($user_data); echo '</pre>'; /** Результат в виде объекта будет примерно следующего содержания: stdClass Object ( [default_profile_image] => [profile_background_tile] => [protected] => [default_profile] => [contributors_enabled] => [url] => http://expange.ru [name] => expange.ru [id_str] => 228497030 [is_translator] => [show_all_inline_media] => 1 [geo_enabled] => [profile_link_color] => 1F98C7 [follow_request_sent] => [utc_offset] => 10800 [created_at] => Sun Dec 19 22:12:45 +0000 2010 [friends_count] => 2 [profile_sidebar_border_color] => C6E2EE [following] => [time_zone] => Moscow [profile_image_url] => http://a3.twimg.com/profile_images/1228124572/expange_normal.png [description] => [statuses_count] => 106 [profile_use_background_image] => 1 [favourites_count] => 0 [status] => stdClass Object ( [place] => [truncated] => [id_str] => 91646116151570432 [in_reply_to_status_id] => [text] => Авторизация на сайте через twitter (PHP) http://t.co/SRtztLi via @expange [created_at] => Thu Jul 14 23:11:51 +0000 2011 [geo] => [favorited] => [in_reply_to_status_id_str] => [coordinates] => [id] => 91646116151570432 [in_reply_to_screen_name] => [source] => Tweet Button [in_reply_to_user_id_str] => [in_reply_to_user_id] => [contributors] => [retweeted] => [retweet_count] => 0 ) [verified] => [profile_background_color] => C6E2EE [screen_name] => expange [listed_count] => 0 [profile_background_image_url] => http://a1.twimg.com/images/themes/theme2/bg.gif [id] => 228497030 [notifications] => [profile_background_image_url_https] => https://si0.twimg.com/images/themes/theme2/bg.gif [profile_text_color] => 663B12 [lang] => en [profile_sidebar_fill_color] => DAECF4 [followers_count] => 1 [profile_image_url_https] => https://si0.twimg.com/profile_images/1228124572/expange_normal.png [location] => Moscow ) **/ ?>

Все. Данные пользователя получены, и есть уверенность, что это реальный Твиттер-пользователь, а не подставной.

Обработка данных для авторизации уже дело техники и вам решать как с ними поступить.

Дополнительные данные

Ссылка на документацию Твиттера: https://dev.twitter.com/docs/auth/oauth

Категории

ИнтернетБлогиTwitter

Комментарии

Сергей Фединяк

Коментарии работают тут отвратительно, удалите мой дублирующий. Хотел добавить листинг, чтоб возвращался email - не дает.

Ответить
Сергей Фединяк

Необходимо передать параметр include_email=true и по адресу define URL_ACCOUNT_DATA = api.twitter.com/1.1/account/verify_credentials.json

Ответить
Сергей Фединяк

Данный пример не возвращает email пользователя

Ответить
Сергей Фединяк

Данный пример не возвращает email пользователя

Ответить
kair_21

Автору огромный респект!Большое спасибо!!!!!!!

Ответить
kair_21

Автору огромный респект!Большое спасибо!!!!!!!

Ответить
expange

Олег, а на какую страницу редирект происходит?

Ответить
Олег Юрчик

А у меня после получения токена при переводе пользователя на страницу авторизация приложения в твитере пишет, что такой страницы на твитере не существует. Из-за чего такая ошибка может быть?

Ответить
ruslanbakanov

Огромное спасибо за подробнейшее руководство! :)
П.С. Радует, что спустя почти год, алгоритм по прежнему актуален

Ответить
Руслан Шакиров

пардон. все получилось. забыл убрать отладочную информацию.

Ответить
Руслан Шакиров

приветствую. статья хороша. только вот последний этап - получение данных пользователя ни как не дается. выдается ошибка - Bad Authentication data. делал по примеру. как решить проблему?

Ответить
_yoda_master_

Помогите пожалуйста. Я скачал исходники. Вставил свои ключи в код. У меня постоянно появляется ошибка Warning: file_get_contents.failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized

Ответить
Артём Фёдоров

alex_uswebstyle, всегда пожалуйста!

Ответить
alex_uswebstyle

Спасибо огромное за статью! Так они уже извратили доступ...

Ответить
Артём Фёдоров

К сожалению, я не в курсе, никогда не работал с кириллическими доменами. На досуге поизучаю проблему.

Ответить
zzrozdestov

Скажите, а как пройти регистрацию в этом приложении с кириллическим доменом? Punycode использовал - пишет неверный формат ссылки.

Ответить
Артём Фёдоров

Это только авторизация, т.е. получение данных твиттер-пользователя, подтверждающих, что пользователь на самом деле авторизован в твиттере.
Насчет других действий, надо однозначно изучать мануал: https://dev.twitter.com/docs

Ответить
Игорь Звягинцев

Я планирую сделать свою кастомную твиттер ленту с поиском по определённому хештегу и не могу понять, вот эти пляски с авторизацией необходимы для этого или есть какой-то более простой путь выполнять поисковые запросы к твиттеру?

Ответить
Артём Фёдоров

Прошу прощения у всех кто поломал голову с пунктом "GET-запрос access_token". Я его исправил.
Вся проблема в том, что программисты твиттера, видимо очень маниакально боялись подмены данных при авторизации, поэтому все настолько запутанно и сложно.
Я, когда реализовывал авторизацию через твиттер, ломал голову неделю точно, в итоге реализовал, но, проявил невнимательность при написании статьи, причем что онлайн-пример работает без ошибок.
Еще раз извиняюсь.

Ответить
Alexander Cheprasov

Действительно, за статью спасибо. Но, соглашусь с отзывом, Дмитрия Шиц, - голову себе поломал изрядно.
После заголовка "GET-запрос access_token" данные формируются не правильно.

Ответить
Артём Фёдоров

Sergey Fat, спасибо за совет. Исправлю.

Ответить
Sergey Fat

На первом єтапе рекомендую (GET-запрос request_token)рекомендую в строке $oauth_base_text .= urlencode("oauth_callback=".urlencode(TWITTER_URL_CALLBACK)."&"); не использовать urlencode а использовать rawurlencode и в скобках и за скобками. Потому что столкнулся с проблемой когда в адресе колбека есть символ тильда.

Ответить
M_O_D_E_R_N

А вот к примеру как опубликовать твит в приложении?

Ответить
Дмитрий Шиц

а Вы батенька шутник я посмотрю
шаг 3й после авторизации, получаем user_id
"GET-запрос access_token"
формируем url по одному принципу, а то что должно получиться вообще другое, даже адрес куда посылаем запрос другой - целый день голову ломал, что не так :-)
поправьте или оставьте так, для внимательных

Ответить
Артём Фёдоров

Для чего пароль? Лишние действия.

Ответить
M_O_D_E_R_N

может всё таки ещё пароль ввести предлагать?

Ответить
M_O_D_E_R_N

давно искал, спасибо!

Ответить
Артём Фёдоров

Пользуйтесь на здоровье.

Ответить
Дмитрий Петров

спасибо огромное! работает отлично!

Ответить
expange

Обновил статью. Теперь авторизация учитывает требования версии 1.1. Авторизация через твиттер на сайте тоже работает.

Ответить
Артём Фёдоров

Других ссылок посоветовать не могу, т.к. проблему пока не изучал.

Ответить
Роман Фомин

Да я там смотрел но там я ничего не нашел по поводу вытаскивания данных ...

Ответить
Артём Фёдоров

Я думаю в новой версии вряд ли очень много изменений.

Ответить
Артём Фёдоров

https://dev.twitter.com/docs/auth/oauth копать здесь

Ответить
Роман Фомин

Хотя бы подскажите где копать авторизация проходит не удается вытащить данные пользователя только. ((

Ответить
Артём Фёдоров

Видимо твиттер больше не поддерживает АПИ 1. Буду переписывать статью под версию 1.1.

Ответить
Роман Фомин

сделал как все написано в статье но в конце где должны быть данные о пользователе выдает следующее
The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.
как мигрировать? Что в коде необходимо изменить ???

Ответить
Phoenix Shepard

Напишите где-нибудь жирным, что если у вас вылезает internal server 500, то возможно нужно установить cURL

Ответить
Артём Фёдоров

Насчет этого не знаю. Нужно документацию читать, здесь статья только как данные пользователя получить. Но, насколько я помню, осталось немного, чтобы разобраться с отправкой/получением твитов.

Ответить
Phoenix Shepard

Наконец-то хоть что-то получилось twitteroauth от abraham совсем не работает.
А как теперь после этой авторизации отсылать сообщения? получать список сообщений и прочее?

Ответить
Артём Фёдоров

Всегда пожалуйста!

Ответить
Александр Егоров

Спасибо за статью, помогло. Только в моем случае больше пригодился метод authenticate вместо authorize (https://api.twitter.com/oauth/authenticate?oauth_token=...), чтобы юзер каждый раз не авторизовывал приложение.

Ответить
ivanov4twit

Во первых хочу поблагодарить за отличную статью по авторизации. Статья экономит уйму времени!
Но у меня возникла проблема в $response у меня ничего нету,но и Failed to validate oauth signature and token тоже нет. Вот такой такой результат на экране https://plus.google.com/photos/100840941629480038238/albums/5844192953996422337/5844192960467561138
Такой результат на хостинге. А вот на локальном сервере все работает хорошо. В чем может быть проблема? Может ли некорректно работать функция file_get_contents($url) в зависимости от версии php на сервере?
P.S. Файлы взял как есть без изменений только поставил свои ключи

Ответить
Артём Фёдоров

Спасибо за отзыв! Очень рад, что статья пригодилась!

Ответить
Ирина Скориковаааа

великолепная понятная удобная статья. автору респект. за два часа полная реализация авторизации через твиттер. огромное спасибо!

Ответить
Ирина Скориковаааа

прошу прощения. разобралась. рановато я захотела id

Ответить
Ирина Скориковаааа

ПОдскажите, а где я ошиблась если в ответ мне пришел response в урезанном варианте - без user_id?
parse_str($response, $result);
в итоге получаю
{ ["oauth_token"]=> string(40) "gtJLeuhHF**********QIBTH0LyGlaKU" ["oauth_token_secret"]=> string(43) "axpa3Datys02HMt**********XIUd6K0NuL8" ["oauth_callback_confirmed"]=> string(4) "true" }

Ответить
Артём Фёдоров

С остальными методами не работал, только с авторизацией.

Ответить
Az Za

А как слать запросы к другим методам айпи требующих авторизацию?
например запрос считывающий сообщения на стене, или проверку фоловинга и т.д

Ответить
Anton Yurchenko

Автору большущиуй респект!!!
Статья очень помогла, долго искал как получить oauth_token_secret и oauth_token!!!
Теперь закончу свою программку
;-)
СПАСИБО ДРУГ!!!

Ответить
Артём Фёдоров

Когда уже получили данные пользователя и обработали их, можно и редирект сделать на нужную страницу.
Кстати, теперь данные твиттер-пользователя доступны по адресу: https://api.twitter.com/1/users/show.json?screen_name=expange (expange указан в качестве примера)

Ответить
Иван Санин

а где задать путь куда нужно вернуться после авторизации, не на главнуюю, а, например, domain.ru/city/number

Ответить
Artur Nikushev

Здесь ошибочка при получании access_code, там нужно в запросе поменять url и добавить в параметры token.
в архиве файлов все верно. а здесь, на странице инструкции, кусок кода видимо не оттуда скопирован.
Поправьте.. )
За инструкцию ОГРОМНЕЙШЕЕ спасибо!
Благо Дарю!

Ответить
Влад Иваненко

когда делаем запрос на получение данных пользователя, в url 1 строчкой нужно писать не $url = URL_REQUEST_TOKEN; а $url = URL_ACCESS_TOKEN;

Ответить
Артём Фёдоров

Странно. Должно работать, т.к. проверка идет на доступность cURL. Но, код в готовом решении обновил, заменил $this->_http() на file_get_contents, для простоты.

Ответить
Алексей Чаплыгин

Здравствуйте на странице в коде на создание access_token и request_token написано:
$response = file_get_contents($url);
а в готовом решении там же :
$response = $this->_http($url);
лично в моем случае пока не заменил на
$response = file_get_contents($url);
не заработало

Ответить
Артём Фёдоров

Проблема в готовом решении? (http://expange.ru/files/130/TwitterAuth.rar)
Или решение свое пишется?

Ответить
Penguin_4ik

Failed to validate oauth signature and token.

Ответить
Артём Фёдоров

Все вопросы в комментариях.

Ответить