Pull to refresh

Интеграция OAuth и Twitter API в фреймворк Kohana3

Reading time5 min
Views2.1K
Закралась мне как-то в голову мысль, что пора бы заняться интеграцией блога и твиттера в единое целое. Для этого существуют две такие замечательные вещи, как OAuth, связывающий ваше приложение с функционалом стороннего API, и сам функционал, реализованный, в данном случае, в виде Twitter API.

Проштудировав несколько мануалов (например, у Дмитрия Котерова имеется очень хорошая статья по этой теме) и поняв основной принцип работы OAuth, я пришел к выводу, что писать свой велосипед — неэффективная задача на данный момент, и решил посмотреть, что уже есть готового в интернете.

Итак, что же мы видим, зайдя на http://dev.twitter.com/pages/libraries? Невообразимое количество готовых решений для нашей задачи. Я решил остановится на приглянувшейся мне библиотеке Twitter-async от Jaisen Mathai. Далее опишу, как интегрировать библиотеку в Kohana 3 и как ей пользоваться.

Для начала зарегистрируем свое приложение в твиттере по адресу http://twitter.com/apps/new. Заполняем поля, выбираем тип «Browser» для «Application Type», «Default Access type» выставляем в «Read & Write». Обязательно заполняем поле «Callback URL» — страница, куда будет совершен редирект на ваш сайт после обмена секретными ключами между вашим приложением и твиттером. К примеру, у меня за это отвечает отдельный контроллер twitter c методом confirm, код которого я приведу позже (т.е выглядит это примерно так: sitename.com/twitter/confirm ). Все, заполняем капчу, жмем «Save» и получаем пару ключей — «Consumer key» и «Consumer secret». Они понадобятся чуть позже.

Следующий шаг — распаковываем содержимое архива с библиотекой Twitter-async в директорию /modules/epitwitter/classes/ вашего сайта на kohana3. Нам нужны всего три файла — EpiCurl.php, EpiOAuth.php и EpiTwitter.php. К примеру, путь до EpiTwitter.php будет выглядеть так: /modules/epitwitter/classes/EpiTwitter.php. Имя файла EpiTwitter.php переводим в нижний регистр (epitwitter.php ) и добавляем в него три строки прямо перед описанием самого класса:


include_once('EpiCurl.php');
include_once('EpiOAuth.php');
include_once('secret.php');
class EpiTwitter extends EpiOAuth
{


* This source code was highlighted with Source Code Highlighter.


Эти манипуляции нужны для интеграции библиотеки в систему загрузки модулей Kohana3.

Далее, создаем файл /modules/epitwitter/classes/secret.php, где будем хранить наши ключи:

<?php
define('CONSUMER_KEY', 'тут_ваш_consumer_key');
define('CONSUMER_SECRET', 'тут_ваш_consumer_secret');
?>


* This source code was highlighted with Source Code Highlighter.


Открываем наш bootstrap.php и добавляем в него сточку для загрузки библиотеки в систему:

Kohana::modules(array(

'epitwitter' => MODPATH.'epitwitter',

));


* This source code was highlighted with Source Code Highlighter.


Все, интеграцию библиотеки в систему мы завершили, теперь пришло время заставить ее работать.

Создаем контроллер /application/classes/controller/twitter.php — для CallbackURL, помните? Вот как он выглядит у меня:

<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Twitter extends Controller {
  … 
  public function action_confirm()
  {
    $twitterObj = new EpiTwitter(CONSUMER_KEY, CONSUMER_SECRET);
    $twitterObj->setToken($_GET['oauth_token']);
    $token = $twitterObj->getAccessToken();   
    Cookie::set('oauth_token',$token->oauth_token,60*60*24*7);
    Cookie::set('oauth_token_secret',$token->oauth_token_secret,60*60*24*7);   
    header('Location: /');
    exit();
  }
  …
}


* This source code was highlighted with Source Code Highlighter.


В частности, нас интересует метод confirm — public function action_confirm(), на который ссылается настройка CallbackURL вашего приложения. Здесь происходит получение токена от OAuth твиттера и сохранения его значения (пары oauth_token и oauth_token_secret), к примеру, в кукисы. Затем происходит редирект на главную страницу, чтобы кукисы проинициализировались.

Что происходит на главной странице? За ядро сайта у меня отвечает контроллер Core.

<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Core extends Controller_Template {
public $template = 'main'// основной шаблон сайта
… 
  public $twitterObj = NULL;
  public $twitterInfo = NULL;
… 
  public function before()   
  {
    parent::before();
    //проверяем куки на наличие токена oAuth       
    if(isset($_COOKIE['oauth_token']) and isset($_COOKIE['oauth_token_secret']))
    {
      $twitterObj = new EpiTwitter(CONSUMER_KEY, CONSUMER_SECRET,
        Cookie::get('oauth_token'), Cookie::get('oauth_token_secret'));
//передаем объект связки oAuth+TwitterAPI в публичное свойство класса для доступа из других методов и т.п
      $this->twitterObj = $twitterObj;
      //забираем данные о залогинившемся пользователе
      $twitterInfo = $twitterObj->get_accountVerify_credentials();
      $twitterInfo->response; 
      $this->twitterInfo = $twitterInfo;
      $this->template->twitterObj = $this->twitterObj;

      //передаем массив данных о пользователе в основной шаблон. Теперь на всех страницах будет отображаться логин пользователя и его юзерпик.
      $this->template->twitterInfo = $twitterInfo;     
    }
    else
    {
      //иначе создаем объект EpiTwitter и передаем в шаблон ссылку на авторизацию твиттер-аккаунта и получение токенов
      $twitterObj = new EpiTwitter(CONSUMER_KEY, CONSUMER_SECRET);
      $this->twitterObj = NULL;
      $this->twitterInfo = NULL;
      //Вот она, ссылка:
      $this->template->twitter_login = $twitterObj->getAuthorizationUrl();      

    }
  }


* This source code was highlighted with Source Code Highlighter.



У фреймворка Kohana3 есть замечательный метод before(), который замечателен тем, что в нем происходят процессы до активизации основного метода. Т.е до обработки основных данных главного метода и рендера шаблона, создаются экземпляры классов нашей библиотеки, производятся нужные манипуляции с ключами и в зависимости от обстоятельств, в шаблон передается либо ссылка на авторизацию в oAuth Twitter, либо данные о авторизованном пользователе.

У нашей библиотеки очень удобный способ обращения к TwitterAPI. К примеру, рассмотрим эту строчку:

$twitterInfo = $twitterObj->get_accountVerify_credentials();

Что здесь происходит? Все очень просто. Мы говорим нашему объекту: используя метод GET, постучи в TwitterAPI по адресу account/verify_credentials. Результат возвращается в json и парсится внутри объекта.

К примеру, чтобы узнать публичные данные какого-нибудь твиттер-аккаунта, согласно TwitterAPI, нужно заюзать метод users/show (см. http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-users%C2%A0show). Соответственно, вызов будет выглядеть так:

$twitterInfo = $twitterObj->get_usersShow(array('screen_name'=>'VasyaPupkin'));

Все просто :)

Если выкинуть конкретизацию относительно интеграции в Kohana3, то вкратце связка вашего приложения + OAuth + Twitter API (используя библиотеку Twitter-async) выглядит так:
  1. Регистрируем наше приложение в твиттере, получаем пару ключей — consumer_key и consumer_secret
  2. В callbackurl подготавливаем посадочное место для получения токена от OAuth Twitter'а, сохраняем куда-нибудь полученные токены для постоянной авторизации на нашем сайте.
  3. Используя полученную пару токенов и пару ключей consumer, создаем экземпляр EpiTwitter, с помощью которого можно свободно обращаться к Twitter API. Либо, если токены отсутсвуют, используя пару consumer_key и consumer_secret, получить ссылку на авторизацию в oAuth твиттера для получения токенов.
Tags:
Hubs:
+18
Comments10

Articles