Продолжаем тему аутентификации через социальные сети и сегодня поговорим о Twitter.
Предыдущие статьи по этой теме:
Аутентификация через «ВКонтакте»;
Аутентификация через Facebook.
Да, один из читателей уже заметил, что способов попасть на сайт стало больше, и я попутно с написанием статей дописывал и функционал у себя на сайте. Вот, дошло время и до твитера, как у всех социальных сетей, так и у него есть свои особенности, но при этом есть общая черта – нам нужно создать приложение, чем и займёмся.
Разбираемся с Twitter приложением
Начинаем мы свою работу с посещения страницы – приложения Twitter. Если вы оказались тут впервые, то на этой странице увидите только одну кнопку «Create New App» - по ней и жмём.
Далее мы попадаем на страницу изначальных настроек, все данные, которые будут введены в поля формы, в дальнейшем можно будет изменить. По порядку заполняем поля:
Тут особо пояснять нечего, двигаемся дальше и после заполнения соглашаемся с условиями пользования, кликаем в конце страницы на кнопку «Create your Twitter application».
Разработчики Twittera избавили нас от лишних настроек (в отличие от Facebook). Мы же сразу попадаем на главную страницу приложения и единственное, что можно изменить - это иконка. Перейдем на страницу «Keys and Access Tokens» и получим нам необходимые параметры для связи с API.
Вот и всё, всего несколько минут и приложение можно использовать.
Пишем класс для аунтефикации через Twitter
Приступим к написанию и определимся, что у нас будет в скрипте:
- Нам потребуется конструктор, где мы будем сохранять передаваемые в него настройки и получать данные для формирования запросов к API;
- Сам метод аунтефикации при удачном выполнении, которого возвращать будем – true, а при обратном – false;
- Метод, при помощи которого мы сформируем ссылку для пользователя.
class TWAuth{
public $settings = array();
public $auth_status = false;
public $user_info = array();
private $app_data = array();
// Остальное код пишем ниже
}
В классе TWAuth сразу добавляем необходимые нам свойства. Названия свойств говорящие. Поясню только $app_data - в нём мы будем сохранять данные, которые получим после отработки конструктора (они нужны для формирования ссылки и для запроса):
public function __construct($settings){
if(isset($settings["client_id"], $settings["client_secret"], $settings["redirect_uri"])){
$this->settings = $settings;
// Формирование подписи для запроса
$an = md5(uniqid(rand(), true));
$at = time();
$sign_str = "GET&".urlencode("https://api.twitter.com/oauth/request_token")."&".implode(
"",
array_map("urlencode", array(
"oauth_callback=".urlencode($this->settings["redirect_uri"])."&",
"oauth_consumer_key=".$this->settings["client_id"]."&",
"oauth_nonce=".$an."&",
"oauth_signature_method=HMAC-SHA1&",
"oauth_timestamp=".$at."&",
"oauth_version=1.0"
))
);
$as = base64_encode(hash_hmac("sha1", $sign_str, $this->settings["client_secret"]."&", true));
// Формирование токена для запроса
$ot_url = "https://api.twitter.com/oauth/request_token?oauth_callback=".urlencode($this->settings["redirect_uri"]).implode("&", array(
"&oauth_consumer_key=".$this->settings["client_id"],
"oauth_nonce=".$an,
"oauth_signature=".urlencode($as),
"oauth_signature_method=HMAC-SHA1",
"oauth_timestamp=".$at,
"oauth_version=1.0"
)
);
$response = file_get_contents($ot_url);
parse_str($response, $response);
$this->app_data["response_at"] = $response["oauth_token"];
$this->app_data["response_at_secret"] = $response["oauth_token_secret"];
}
}
Для того чтобы мы могли общаться с API Twitter, нам нужно особым образам сформировать для этого запрос. Он же состоит из подписи, которую мы также должны сформировать, после чего при помощи функции file_get_contents() обратиться, по этому адресу. В частности: в конструкторе формируем запрос для получения oauth_token и oauth_token_secret, чтобы уже их использовать для получения данных из API. Да, в твитаре заботятся о безопасности, и поэтому сделано всё довольно завёрнуто. Двигаемся дальше, и на очереди второй метод:
public function auth($oauth_token, $oauth_verifier){
// Формирование подписи для запроса
$an = md5(uniqid(rand(), true));
$at = time();
$sign_str = "GET&".urlencode("https://api.twitter.com/oauth/access_token")."&".implode(
"",
array_map("urlencode", array(
"oauth_consumer_key=".$this->settings["client_id"]."&",
"oauth_nonce=".$an."&",
"oauth_signature_method=HMAC-SHA1&",
"oauth_token=".$oauth_token."&",
"oauth_timestamp=".$at."&",
"oauth_verifier=".$oauth_verifier."&",
"oauth_version=1.0"
))
);
$as = base64_encode(hash_hmac("sha1", $sign_str, $this->settings["client_secret"]."&".$this->app_data["response_at_secret"], true));
// Формирование токена для запроса
$ot_url = "https://api.twitter.com/oauth/access_token?".implode("&", array(
"oauth_nonce=".$an,
"oauth_signature_method=HMAC-SHA1",
"oauth_timestamp=".$at,
"oauth_consumer_key=".$this->settings["client_id"],
"oauth_token=".urlencode($oauth_token),
"oauth_verifier=".urlencode($oauth_verifier),
"oauth_signature=".urlencode($as),
"oauth_version=1.0"
));
$response = file_get_contents($ot_url);
parse_str($response, $response);
if(isset($response["oauth_token"], $response["oauth_token_secret"], $response["screen_name"])){
// Формирование подписи для запроса
$an = md5(uniqid(rand(), true));
$at = time();
$oauth_token = $response["oauth_token"];
$oauth_token_secret = $response["oauth_token_secret"];
$screen_name = $response["screen_name"];
$sign_str = "GET&".urlencode("https://api.twitter.com/1.1/users/show.json")."&".implode(
"",
array_map("urlencode", array(
"oauth_consumer_key=".$this->settings["client_id"]."&",
"oauth_nonce=".$an."&",
"oauth_signature_method=HMAC-SHA1&",
"oauth_timestamp=".$at."&",
"oauth_token=".$oauth_token."&",
"oauth_version=1.0&",
"screen_name=".$screen_name
))
);
$as = base64_encode(hash_hmac("sha1", $sign_str, $this->settings["client_secret"]."&".$oauth_token_secret, true));
// Формирование токена для запроса (Данные пользователя)
$ot_url = "https://api.twitter.com/1.1/users/show.json?".implode("&", array(
"oauth_consumer_key=".$this->settings["client_id"],
"oauth_nonce=".$an,
"oauth_signature=".urlencode($as),
"oauth_signature_method=HMAC-SHA1",
"oauth_timestamp=".$at,
"oauth_token=".urlencode($oauth_token),
"oauth_version=1.0",
"screen_name=".$screen_name
));
$this->user_info = json_decode(file_get_contents($ot_url), true);
if(isset($this->user_info["id"])){
$this->auth_status = true;
return true;
}
}
return false;
}
Метод auth() принимает два параметра, которые мы будем отлавливать в адресной строке после того, как пользователь нажмёт на ссылку для аунтефикации и вернётся к нам обратно на страницу. А весь внутренний код метода будет, как видите, повторяться прямиком до получения самих данных. Теперь допишем последний метод:
public function get_link(){
if($this->app_data){
return "https://api.twitter.com/oauth/authorize?oauth_token=".$this->app_data["response_at"];
}
return false;
}
Ура! Мы закончили со скриптом, теперь воспользуемся им и напишем простой код для получения информации о пользователе.
require_once("TWAuth.php");
$tw = new TWAuth(array(
"client_id" => "api_ключ",
"client_secret" => "api_секрет",
"redirect_uri" => "адрес_редиректа_после_аунтефикации"
));
if(isset($_GET["oauth_token"], $_GET["oauth_verifier"])){
if($tw->auth($_GET["oauth_token"], $_GET["oauth_verifier"])){
// Делаем свои дела
}
}
Далее между тегами body выводим инфу:
if($tw->auth_status){
echo("Социальный ID пользователя: ".$tw->user_info["id"]);
echo("<br />");
echo("Имя пользователя: ".$tw->user_info["name"]);
echo("<br />");
echo("Алис: ".$tw->user_info["screen_name"]);
echo("<br />");
echo("<img src='".$tw->user_info["profile_image_url"]."' alt='image' />");
}else{
echo("<a href='".$tw->get_link()."'>Войти</a>");
}
Фух, вот мы и закончили эту статью! Готовый рабочий скрипт прилагается, скачиваем и разбираемся, пишем коменты, если что-то было непонятно.