Матвей Земсков

Заметки веб-мастера

Четверг, 22 ноября 2012 15:53

Авторизация на сайте с помощью TwitterOAuth

Оцените материал
(1 Голосовать)

С 16 августа 2010 года Twitter больше не поддерживает протокол базовой авторизации. Это означает, что авторизовать пользователей возможно только используя приложения в Twitter. В этом уроке я расскажу, как можно использовать Twitter для авторизации пользователей на вашем сайте.

Шаг первый: создаем и настраиваем приложение в Twitter

Первым делом создаем и настраиваем приложение в Twitter:

  • Регистрируем новое приложение на dev.twitter.com/apps/
  • Заполняем все поля соответствующими данными вашего сайта. Будьте внимательны при заполнении: в поле “Application Type” выбираем “Browser”, а в поле “Callback URL” указываем адрес, на который будет перенаправляться пользователь после авторизации. Например, http://localhost.com/twitter_login.php (http://localhost использовать невозможно, так как это невалидное доменное имя).
  • Далее в пункте ”Default Access type” выбираем “Read&Write”, заполняем поле с CAPTCHA, соглашаемся с Условиями использования и регистрируем приложение.

После этих действий, вы увидите на экране следующую информацию:

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

В процессе работы мы будем использовать ключи приложения (“Consumer key” и “Consumer secret”).

После регистрации приложения, нужно скачать библиотеку twitteroauth , одну из лучших библиотек, написанную на PHP. Если вы используете другой язык программирования, ознакомьтесь со списком библиотек на других языках .

В скачанном zip-архиве найдите папку twitteroauth и распакуйте ее содержимое в папку вашего веб-приложения.

Для хранения информации о пользователях, авторизованных через Twitter, нужно будет создать Базу данных. Создать таблицу базы данных для хранения пользователей, можно примерно так:

SQL

     CREATE TABLE `users`(
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 	         `oauth_provider` varchar(10),  
	         `oauth_uid` text,  
	         `oauth_token` text,  
	         `oauth_secret` text,  
	         `username` text,  
	        PRIMARY KEY (`id`)  
     ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

Обратите внимание, на поля oauth_token и oauth_secret. Для авторизации пользователей через TwitterOAuth необходимы значения token и token_secret, поэтому будем хранить их.

На этом подготовительный этап закончен.

Шаг второй: регистрируем пользователей

Этот шаг состоит из трех этапов:

  • Запрос авторизации в Twitter;
  • Регистрация пользователя на сайте или авторизация пользователя, если он уже зарегистрирован;
  • Сохранение данных о пользователе в сессии;

Запрос авторизации.

Процесс OAuth авторизации начинается с генерации URL, на который будет перенаправлен неавторизованный пользователь. После посещения этой страницы и ввода логина и пароля на ней, приложение перенаправляет пользователя назад на ваш сервер, при этом добавляя в URL 2 параметра, необходимые для авторизации. Значение параметров являются так называемые «токены» (tokens), которые участвуют в процессе авторизации.

Начнем с подключения библиотеки и создания сессии:

PHP

  require("twitteroauth/twitteroauth.php");
  session_start();

Далее нужно создать объект класса TwitterOAuth, передав значение ключей приложения - consumer key и consumer secret, полученных в процессе регистрации нашего приложения в Twitter. Затем, сделаем запрос токенов для авторизации, сохраняем их в сессии и перенаправляем пользователя на Twitter для ввода логина и пароля.

PHP

// Создаем экземпляр класса TwitterOAuth 
$twitteroauth = new TwitterOAuth('YOUR_CONSUMER_KEY', 'YOUR_CONSUMER_SECRET');
// Запрашиваем токены, передаем параметр – URL куда будет возвращен пользователь после авторизации  
$request_token = $twitteroauth->getRequestToken('http://localhost.com/twitter_oauth.php');
// Сохраняем их в сессии
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
// Если все идет по плану..
if($twitteroauth->http_code==200){
    // Генерируем URL для авторизации и перенаправляем туда пользователя
    $url = $twitteroauth->getAuthorizeURL($request_token['oauth_token']);
    header('Location: '. $url);
} else {
    // Произошла ошибка
    die('Something wrong happened.');
}

Сохраним этот файл как twitter_login.php в папке на вашем сервере и откроем его в браузере (в нашем случае, адрес будет следующий: http://localhost.com/twitter_login.php).

Если все сделано правильно, вы будете перенаправлены на twitter.com и увидите на экране следующую страницу:

Авторизация пользователя в Twitter
Авторизация пользователя в Twitter

После нажатия кнопки “Allow”, пользователь будет перенаправлен на адрес http://localhost.com/twitter_oauth.php. Это произойдет, потому что этот URL был использован в виде параметра при вызове метода TwitterOAuth::getRequestToken. Этот файл мы пока не создали, поэтому сейчас произойдет ошибка. Чтобы этого избежать, нужно создать файл twitter_oauth.php. Файл должен содержать в самом начале те же строки, что и первый, а именно: подключение файла с библиотекой и функцию создания сессии.

После этого нам будут доступны значения 3 параметров: oauth_verifier, oauth_token, oauth_token_secret. В файле twitter_oauth.php первым делом нужно проверить значения этих параметров и если хотя бы один из параметров пуст, перенаправить пользователя на файл twitter_login.php.

PHP

if(!empty($_GET['oauth_verifier']) && !empty($_SESSION['oauth_token']) && !empty($_SESSION['oauth_token_secret'])){
    // Мы получили все, что нужно
} else {
    // Чего-то не хватает, попробуем еще раз
    header('Location: twitter_login.php');
}

Если все правильно установлено, внутри первого условного блока, мы будем создавать экземпляр класса TwitterOAuth, но уже с использованием токенов, которые мы сейчас получили, в качестве третьего и четвертого параметра. Затем получаем access token, - он является массивом. Его мы и сохраним в базе данных. А сейчас сделаем небольшой тест, чтобы удостовериться, что все работает.

PHP

// Создаем объект TwitterOAuth с 2 новыми параметрами, полученными от twitter_login.php
$twitteroauth = new TwitterOAuth('YOUR_CONSUMER_KEY', 'YOUR_CONSUMER_SECRET', $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
// Сделаем запрос access token
$access_token = $twitteroauth->getAccessToken($_GET['oauth_verifier']);
// сохраним в сессии 
$_SESSION['access_token'] = $access_token;
// Получим инфо о пользователе 
$user_info = $twitteroauth->get('account/verify_credentials');
// Выведем инфо
print_r($user_info);

Если ошибок нет, функция print_r выведет информацию о пользователе, которая является объектом. Идентификатор(ID) пользователя хранится в свойстве объекта $user_info->id, а логин – в свойстве $user_info->screen_name. Из свойств объекта можно получить и другую полезную информацию о пользователе.

Регистрация пользователей.

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

PHP

mysql_connect('localhost', 'YOUR_USERNAME', 'YOUR_PASSWORD');
mysql_select_db('YOUR_DATABASE');

Замените данные для подключения к БД своими. Сразу после получения данных о пользователе, проверим – присутствует ли информация о нем в базе данных. Если нет – добавим информацию о пользователе в БД. Если пользователь уже зарегистрирован, мы должны обновить токены, так как Twitter уже сгенерировал новые, и те, которые находятся в БД на данный момент – неактуальны. В конце скрипта мы сохраним пользовательскую информацию в сессии и перенаправим пользователя на twitter_update.php.

PHP

if(isset($user_info->error)){
    // Что-то не то, попробуем авторизоваться еще раз
    header('Location: twitter_login.php');
} else {
    // Пробуем найти пользователя по его ID
    $query = mysql_query("SELECT * FROM users WHERE oauth_provider = 'twitter' AND oauth_uid = ". $user_info->id);
    $result = mysql_fetch_array($query);
    // Если такого нет, добавляем в БД
    if(empty($result)){
        $query = mysql_query("INSERT INTO users (oauth_provider, oauth_uid, username, oauth_token, oauth_secret) VALUES ('twitter', {$user_info->id}, '{$user_info->screen_name}', '{$access_token['oauth_token']}', '{$access_token['oauth_token_secret']}')");
        $query = mysql_query("SELECT * FROM users WHERE id = " . mysql_insert_id());
        $result = mysql_fetch_array($query);
    } else {
        // Обновляем токены
        $query = mysql_query("UPDATE users SET oauth_token = '{$access_token['oauth_token']}', oauth_secret = '{$access_token['oauth_token_secret']}' WHERE oauth_provider = 'twitter' AND oauth_uid = {$user_info->id}");
    }
    $_SESSION['id'] = $result['id'];
    $_SESSION['username'] = $result['username'];
    $_SESSION['oauth_uid'] = $result['oauth_uid'];
    $_SESSION['oauth_provider'] = $result['oauth_provider'];
    $_SESSION['oauth_token'] = $result['oauth_token'];
    $_SESSION['oauth_secret'] = $result['oauth_secret'];
    header('Location: twitter_update.php');
}

Обратите внимание, что данные передаваемые в запрос, необходимо подготовить для этого - заэкранировать SQL спецсимволы. Если этого не сделать, в вашей БД могут появиться уязвимости. После подключения к БД, нужно добавить в скрипт код для проверки авторизации пользователя.

PHP

if(!empty($_SESSION['username'])){
    // Пользователь авторизован, делаем редирект
    header('Location: twitter_update.php');
}

Теперь вы можете приветствовать его по имени.

PHP

<h2>Hello <?=(!empty($_SESSION['username']) ? '@' . $_SESSION['username'] : 'Guest'); ?></h2>

Шаг третий: Читаем статусы

Как известно Twitter использует REST API – набор функций, к которым можно совершать запросы и получать ответы. Взаимодействие происходит по протоколу HTTP, таким образом обращение к какой-либо функции является простым HTTP-запросом. Например, https://api.twitter.com/1.1/statuses/user_timeline.json - обращение к функции statuses/user_timeline. Ответ будет сформирован в формате JSON.

Существует более 20 категорий функций для работы с ресурсами Twitter. Можно проводить операции с отдельными твитами, списками твитов или пользователями. Также существует возможность отправки сообщения конкретному пользователю. В каждой категории API находится набор функций, подробнее с ними можно ознакомиться в официальной документации. Начнем знакомство с API Twiter c простых функций. Аналогично можно обращаться с более продвинутыми методами.

Перед использованием функций из Twitter API, в скрипте нужно создать объект класса TwitterOAuth, используя параметры из сессии:

PHP

if(!empty($_SESSION['username'])){
    $twitteroauth = new TwitterOAuth('YOUR_CONSUMER_KEY', 'YOUR_CONSUMER_SECRET', $_SESSION['oauth_token'], $_SESSION['oauth_secret']);
}

Начнем с обращения к ленте твитов пользователя. В руководстве написано, что для этого используется statuses/home_timeline. Используем этот запрос, но передадим не все параметры: опустим версию и формат – библиотека TwitterOAuth «позаботится» об этом сама.

PHP

$home_timeline = $twitteroauth->get('statuses/home_timeline');
print_r($home_timeline);

В результате, этот код покажет нам весь массив твитов из ленты целиком. Если вам нужно обратиться к каждому твиту, можно воспользоваться циклом foreach. У функции есть дополнительные параметры, например, count, который ограничивает количество возвращаемых твитов. Эти параметры передаются методу в качестве массива. В коде ниже показано, как получить 40 твитов, опубликованных за последнее время:

PHP

$home_timeline = $twitteroauth->get('statuses/home_timeline', array('count' => 40));

Также вы можете посмотреть ленту твитов других пользователей, если они это не запретили в своем профиле. Для этого передадим в качестве параметра идентификатор или имя пользователя в Twitter. Следующий код покажет ленту твитов пользователя @nettuts:

PHP

$nettuts_timeline = $twitteroauth->get('statuses/user_timeline', array('screen_name' => 'nettuts'));

Как вы видите, после аутентификации, у вас есть доступ к ленте твитов.

Шаг четвертый: взаимоотношения пользователей

Функциональность в области взаимоотношений пользователей заключается в следующем: можно проверить является ли один пользователь читателем другого, а также сделать пользователя читателем или, наоборот, перестать «следовать» за пользователем.

Сначала нужно ознакомиться с friendships/exists (определяет, является ли пользователь читателем другого пользователя) и friendships/create (создает связь между текущим и другим пользователем). Обратите внимание, что при использовании второго запроса, данные передаются методом POST. К счастью, в библиотеке TwitterOAuth имеется метод post(), который работает аналогично методу get(). Отличие заключается в том, что get() используется для чтения, а post() – для записи, изменения и удаления.

В запросе friendships/exists обязательны 2 параметра: user_a и user_b, а запрос friendships/create принимает 1 параметр – это может быть либо screen_name, либо user_id.

PHP

$follows_faelazo = $twitteroauth->get('friendships/exists', array('user_a' => $_SESSION['username'], 'user_b' => 'faelazo'));
if(!$follows_faelazo){
    echo 'Вы не читаете @faelazo!';
    $twitteroauth->post('friendships/create', array('screen_name' => 'faelazo'));
}

Чтобы разорвать связь между пользователями, нужно использовать запрос friendships/destroy:

$follows_faelazo = $twitteroauth->get('friendships/exists', array('user_a' => $_SESSION['username'], 'user_b' => 'faelazo'));
if($follows_faelazo){
    echo 'Вы читаете @faelazo! Сейчас удалим эту связь...';
    $twitteroauth->post('friendships/destroy', array('screen_name' => 'faelazo'));
}

Шаг пятый: создание твитов, ретвиты, удаление твитов

Этот раздел API, вероятно, самый интересный – используя его запросы, вы с легкостью сможете размещать твиты или делать ретвиты. Запрос statuses/update использует метод POST (в случае отличном от чтения записей), ему требуется один аргумент – status

PHP

$twitteroauth->post('statuses/update', array('status' => 'Hello Nettuts+'));

Данный код разместит твит в вашем профиле:

Новый твит, размещенный средствами API
Новый твит, размещенный средствами API

Давайте сделаем ретвит твита пользователя @Nettuts, с идентификатором 19706871538. Руководство сообщает нам, что для этого нужно использовать запрос statuses/retweet/:id, где :id – идентификатор твита, на который нужно сделать ретвит. Использует метод POST и не требует дополнительных параметров.

PHP

$twitteroauth->post('statuses/retweet/19706871538');

Чтобы удалить твит, нужно в показанном выше коде заменить retweet на destroy. Например, если ID твита 123456789, то чтобы удалить его нужно использовать следующий код:

PHP

$twitteroauth->post('statuses/destroy/123456789');

Этот код удалит твиты только текущего авторизованного пользователя.

Заключение

API Twitter легко для понимания, оно гораздо более подробно описано, по сравнению с Facebook. К сожалению, не все так гладко с авторизацией, как хотелось бы – она зависит от настроек сессии.

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

Перевод – Земсков Матвей

Оригинал статьи: http://net.tutsplus.com/tutorials/php/how-to-authenticate-users-with-twitter-oauth/

Прочитано 9759 раз
Другие материалы в этой категории:
Авторизация на сайте с помощью Facebook (PHP SDK)

Добавить комментарий


Защитный код
Обновить

Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию: