Twitter oAuth и Cod... Баллада о г... сихи лирик... стихи лири... Динамическ... Домашняя с... Использова... Использова... Отправка с... Создание ф... Шепот посл... TinyMCE в Rails стихи лири... Быстрая ра... Пишем собс... Создание с... Установка ... Ностальгия... Москва-Бел... стихи лири... Стихи про п... Крылья сти... Создание п... Простой по... Создание п... Одинокий в... Гражданин ... Несчастный... Сонет стих... Отрезок ст... Врагу не сд... Предчувств... Поиск в ст... Использова... Смерть дву... Использова... Как сделат... Как сделат... Облако тег... Южная сере... Программна... Codeigniter в де... CodeIgniter: фор... проверка в... стихи лири... WEB fetcher(scrappe... Простой Twitt... стихи твор... стихи лири... Побег с Сол... Отправка SMS... MS VSTO 2007/Infusio... Установка R... Степные тр... моя любовь. К твоим оз... Сомкнуть л... чтоб отдат... вот – вот ... еще не расс... Снег тишина и лу... и мира пово... что мой пос... Лишь ты. И т... ты любима ты чиста. Экспорт да... Я пью до дн... что нам теп... -Наш первый... Социальные... Социальные... Спит в можж... Воздух про... Стены рожденные ... эхо умрет. Неотправле... стихи лири... Он порезал... Боясь шагн... не осталос... Услышать з... Программир...
| Twitter oAuth и CodeIgniter: как это работает |
|
|
|
| 31.05.2011 01:30 |
|
В начале о собственно об принципах работы библиотеки Twitter oAuth, которую мы будем использовать. Выглядит это так: пользователь вводит свой логин и пароль, скрипт далее отправляет GET запрос Twitter для получения кодов для запроса на авторизацию. Эти коды используется для проверки пользователя на сайте Twitterа. Затем запрос пользователя перенаправляется в Twitter чтобы разрешить (или отклонить) вход в систему. Отличительной чертой библиотеки oAuth является наличие так называемых «oAuth token(ов)» в конце каждой строки запроса. Теперь начнем разрабатывать наше приложение: 1. Скачиваем библиотеку oAuth отсюда http://oauth.googlecode.com/svn/code/php/ В папке system/application/libraries/ CodeIgnitera создаем новую папку /twitter/ .
2. Регистрируемся на Twitterе, http://twitter.com/apps/new Здесь мы получаем consumer key и consumer secret code. Это строки из хаотичного набор символов, которые впоследствии будут использоваться для авторизации. Обязательно нужно отметить чекбокс «Yes, use Twitter for login»,иначе будет невозможна аутентификация с помощью полученных здесь ключей. Полученные ключи сохраним.
3. Теперь нам нужно написать свой класс обработчик (wrapper) для работы с библиотекой oAuth. Назовем файл «Twitter_oauth.php»
<?php
require_once(APPPATH . 'libraries/twitter/OAuth.php');
class Twitter_oauth { var $consumer_key; //перемененная класса для ключа consumer var $token_key; //переменная класса для хранения ключа token var $method; //переменная для хранения метода oAuth Signature var $http_status;// переменная для хранения HTTP Status Code var $last_api_call;// URL последнего вызова API oAuth
4. Далее пишем, конструктор класса, естественно, он называется, так же как и класс: Во-первых, мы вызываем метод библиотеки oAuth для
function Twitter_oauth($data) { $this->method = new OAuthSignatureMethod_HMAC_SHA1(); $this->consumer = new OAuthConsumer($data['consumer_key'], $data['consumer_secret']); if(!empty($data['oauth_token']) && !empty($data['oauth_token_secret'])) { $this->token = new OAuthConsumer($data['oauth_token'], $data['oauth_token_secret']); } else { $this->token = NULL; } } }
генерации цифровой подписи (OAuthSignatureMethod_HMAC_SHA1();) и 2 конструктора для создания ключей (new OAuthConsumer())из полученных данных в виде переменных запросов. 5. Следующий метод будет чисто служебным и будет использоваться только с одной целью – обработки полученного от Twittera ответа на запрос. function parse_request($string) { $args = explode("&", $string); $args[] = explode("=", $args['0']); $args[] = explode("=", $args['1']); $token[$args['2']['0']] = $args['2']['1']; $token[$args['3']['0']] = $args['3']['1']; return $token; } Этот метод получает строку запроса, и разделяют его по каждому встреченному символу «&».Получается массив типа «ключ-значение».Затем мы разделяем эту пару еще раз, убирая символ «=».Затем мы форматируем ключи массива так, чтобы они стали oauth_token and oauth_token_secret.
6. Теперь нам нужен другой служебный метод для получения данных Здесь мы используем другую РНР библиотеку – сURL:
function http($url, $post_data = null) { $ch = curl_init(); if(defined("CURL_CA_BUNDLE_PATH")) curl_setopt($ch, CURLOPT_CAINFO, CURL_CA_BUNDLE_PATH); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); if(isset($post_data)) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); } $response = curl_exec($ch); $this->http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); $this->last_api_call = $url; curl_close($ch); return $response; } Вначале мы инициализируем сеанс с помощью метода curl_init(). После мы устанавливаем опцию для проверки подлинности SSL сертификата:
if(defined("CURL_CA_BUNDLE_PATH")) curl_setopt($ch, CURLOPT_CAINFO, CURL_CA_BUNDLE_PATH);
Затем мы устанавливаем соединение с указанным URL,который передается как параметр в наш метод. Так же здесь назначаем некоторые характеристики соединения, как то время ожидания соединения, типа возврата запроса и т.д.На конец, мы передаем наши данные в Twitter и проверяем, правильно ли они были переданы.После исполнения запроса и получение информационного сообщения, сессия сURL закрывается. Возвращаются данные в виде токена.
7. Следующий метод будет отправлять запрос на авторизацию пользователя с помощью request_token:
function get_request_token() { $args = array(); $request = OAuthRequest:: from_consumer_and_token($this->consumer, $this->token, 'GET', "https://twitter.com/oauth/request_token", $args); $request->sign_request($this->method, $this->consumer, $this->token); $request = $this->http($request->to_url()); $token = $this->parse_request($request); $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); return $token; }
В первой строке мы создаем массив аргументов, который потом будет передаваться в вызываемые методы. В самой функции будут использоваться методы библиотеки oAuth, так и методы данного класса. Вначале мы создаем OAuthRequest:: from_consumer_and_token() для отправки запроса в Twitter. Затем инициируем вход в систему посредством метода sign_request().Потом получаем данные с помощью метода http() и обрабатываем уже описанным выше методом parse_request(). И под конец мы создаем новый экземпляр OAuthConsumer и возвращаем его в виде токена. 8. Следующий метод будет очень похож на предыдущий с одним важным отличием – тут будем получать acces_token: function get_access_token(){ $args = array(); $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, 'GET', "https://twitter.com/oauth/access_token", $args); $request->sign_request($this->method, $this->consumer, $this->token);\ $request = $this->http($request->to_url()); $token = $this->parse_access($request); $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); return $token; }
9. Теперь мы можем отправлять полностью сформированный запрос на вход в Twitter, используя полученные токены.
function get_authorize_URL($token) { if(is_array($token)) $token = $token['oauth_token']; return "https://twitter.com/oauth/authorize?oauth_token=" . $token; }
10 . Переходим к разработке класса контролера. Именно он и будет выполнять код вновь разработанной библиотеки.
<?php session_start();
class Twitter extends Controller { var $data; //переменная класса function Twitter() { parent::Controller(); $this->data['consumer_key'] = ""; // здесь мы вставим подученные значения ключей $this->data['consumer_secret'] = ""; }
function index() { $this->load->library('twitter_oauth', $this->data);//загружаем нашу Twitter библиотеку $token = $this->twitter_oauth->get_request_token(); //получаем request_token $_SESSION['oauth_request_token'] = $token['oauth_token']; //сохраняем как переменную РНР сессии $_SESSION['oauth_request_token_secret'] = $token['oauth_token_secret']; //записываем значение перепенной сессии в переменную $token $request_link = $this->twitter_oauth->get_authorize_URL($token); //производим авторизацию и получаем ссылку на страницу для входа в систему $data['link'] = $request_link; $this->load->view('twitter/home', $data); //входим в Twitter }
11. Далее нам необходимо добавить другую важную функцию, которая будет проверять доступ к нашему блогу, чтобы быть уверенным, что пользователи заходят именно из Twitterа. Для этого мы слегка изменим URL обратного вызова. Вот код этого метода.
function access() { $this->data['oauth_token'] = $_SESSION['oauth_request_token']; $this->data['oauth_token_secret'] = $_SESSION['oauth_request_token_secret'];
$this->load->library('twitter_oauth', $this->data);
/* Request access tokens from twitter */ $tokens = $this->twitter_oauth->get_access_token();
//Сохраняем здесь токен доступа. $_SESSION['oauth_access_token'] = $tokens['oauth_token']; $_SESSION['oauth_access_token_secret'] = $tokens['oauth_token_secret']; $this->load->view('twitter/accessed', $tokens); }
12. Ну и конец, добавляем сюда функцию для выхода из Twitterа. Она очень простая – мы стираем РНР сессию и переходим в новый экран интерфейса. function logout() { session_destroy(); $this->load->view('twitter/logout'); } }
?>
13. Теперь нам еще нужно добавить, согласно модели MVC, на которой базируется CodeIgniter несколько файлов типа view . В папке system/application/views/ создаем папку под названием twitter.Там разместим наши файлы. Первый будет называться “home.php” и будет служить для обработки токенов доступа:
<!DOCTYPE HTML> <html> <head> <title>Twitter oAuth</title> </head> <body> <p><a href="/<?php echo $link; ?>">Click here to login with Twitter oAuth</a></p> </body> </html>
14. Второй файл под названием “accessed.php” будет использоваться для и входа в систему с помощью методов класса контролера и в частности, метода access(). <!DOCTYPE HTML> <html> <head> <title>Twitter oAuth - @<?php echo $screen_name; ?></title> </head> <body> <p>Your account should now be registered with twitter. Check here: <a href="https://twitter.com/account/connections">https://twitter.com/account/connections</a></p> </body> </html>
15 . И последний файл в этой папке будет показывать сообщение о выходе из Twitterа. Вот его код:
<!DOCTYPE HTML> <html> <head> <title>Twitter oAuth - Logged Out</title> </head> <body> <p>You are no longer logged in!</p> </body> </html>
На этом все, приложение полностью готово к работе. В сущности, аналогичное решение можно использовать и в других случаях, где используется библиотека oAuth. |
| Обновлено 31.05.2011 01:32 |