2010/03/03

Twitter и его OAuth

Все, кто ещё не уверен, что OAuth придумали безумные люди, посмотрите на процесс авторизации

Это из самого полного мана http://oauth.net/core/1.0/#anchor9

Вспомнив успех Zend для OpenID, снова обратился к нему. На этом месте должна была быть некая бодрая шутка, но её не будет, так как слова закончились через несколько часов попыток извлечь пользу. Заглянув на http://framework.zend.com/manual/1.10/en/zend.oauth.html можете сами убедиться в полной бесполезности зенда в вопросах хитрой авторизации в твиттере через OAuth. Короче, оно тупо не работает.

Когда ничего не помогает, можно уже наконец читать инструкцию. Загуглив тему, Вы точно так же не обнаружите того, чего не обнаружил я: нормальных хавтушек системы "как установить эту хрень?!"
Зато гугл доставил собственный ман http://code.google.com/intl/ru/apis/accounts/docs/OAuth.html. Блеснул слабый луч надежды.
Но блестел он не долго. Почему? Потому что надо понимать, как именно работает OAuth. Это не "пара логин\пароль". Аутентификация происходит после получения авторизационных ключей, после обмена на них ключей доступа, которые можно получить после предоставления уникальной идентификационной пары. Кто хочет окончательно запутаться, сверху есть замечательная картинка.

Теперь ещё раз и вдумчиво. Немного терминологии:

  • application - приложение, втч веб-ресурс, которое пользуется услугами провайдера
  • provider - сервер авторизации
  • consumer - потребитель услуги, юзер, которого приложение авторизует через провайдера
  • tokens - пары ключ\секретный ключ, гугл зовёт их маркерами
Процесс кажется поначалу весьма простым. Запутанным, но не особенно сложным: ключи запроса, ключи доступа, сигнатура, доступ, оппа! Берём простейший класс-обёртку cURL, за полчаса ваяем шедевр и обламываемся на ответе: "Failed to validate oauth signature and token". Что это? Ищем ключевое слово сигнатура и обламываемся ешё раз: сигнатура вычисляется по RSA-SHA1, но из чего - науке неизвестно; по другим источникам она составляется перекомпоновкой из пары токенов доступа, но их тоже надо ещё получить, а у нас ключи запроса не принимаются. Короче, это тоже тупиковая ветвь.

Решаем обратиться к первоисточникам, то бишь мануалу самого твиттера. Это мрак. Родной ман твиттера ещё хуже мана жКвери. Если захотите почитать, то польза начинается отсюда http://apiwiki.twitter.com/Twitter-API-Documentation. Всё, что находится по ссылкам, ещё менее информативно, чем ман зенда.

К слову, http://hueniverse.com/oauth/, куда сходятся большинство отсылок по OAuth, вполне соответсвует своему названию.

Ситуацию выручил программер нерусской национальности Абрахам, но почему-то Вильямс, с рассказом о том, как это работает https://docs.google.com/View?docID=dcf2dzzs_2339fzbfsf4

Перевожу и дополняю:

  1. Надеюсь, вы уже зарегистрировали своё приложение? здесь https://twitter.com/oauth_clients
  2. получите оригинальные идентификаторы и выучите их наизусть $consumer_key, $consumer_secret
  3. далее выполняем первичную авторизацию приложения на провайдере $to = new TwitterOAuth($consumer_key, $consumer_secret);
  4. и получаем ключи запроса $token = $to->getRequestToken();
  5. токены реквеста нужно указывать в адресе авторизации $request_link = $to->getAuthorizeURL($token);
  6. и выполнить пересылку по этому адресу header('Location: '.$request_link); die;
  7. у твиттера существует два типа авторизации oauth/authorize и oauth/authenticate; кому важно, разберётся сам
  8. в тви-интерфейсе юзер приложения выполняет хитрые действия по нажиманию кнопок пальцами
  9. и если вы всё сделали правильно, то твиттер должен прислать токены доступа, как большим
  10. но этого не происходит, потому что тви не прост: если в пункте 0 вы не указали адрес обратного вызова, то тви считает приложение десктопным и сам переключает режим, и в пункте 8 пересылку не делает, а показывает пин-код; адрес колбека, удивительно, можно указать\переназначить в запросе токенов реквеста, п.3.
  11. получаем ключи доступа $tok = $to->getAccessToken($_GET["oauth_verifier"]);
  12. ой, какая неприятность, у нас новый объект, и он сбивает весь процесс!
    Внимание! объект из п.2 необходимо сохранить! для пхп проще воспользоваться сессиями
  13. всё. ключи доступа получены и можно что-нибудь спросить у твиттера, например: $to->OAuthRequest('https://twitter.com/account/verify_credentials.xml', 'GET', $token)); ах да, у Абрахама в этом месте ошибка в параметрах
  14. пытливый читатель попросит добавки в виде описания процесса для десктопных. пожалуйста: пин-код из п.9 нужно использовать как oauth_verifier из п.10
  15. voila!
У меня работает. Можно продолжать монетизировать твиттер :)
На прощание ссылка для базовой авторизации - красиво выглядит класс http://github.com/jdp/twitterlibphp
зы: внимательный читатель заметил, что твиттер не требует обязательного указания сигнатуры ;)

upd: когда гугл включил статистику для блогспота, я был весьма удивлён огромной для такого скромного бложика посещаемостью этой статьи...
читатель! не стесняйся благодарить автора переводом любой суммы в йандекс-кошелёк 410011133049553 :) (https://money.yandex.ru/shop.xml?scid=1269)
blog comments powered by Disqus