Показать Меню
falbar Аутентификация Twitter

Аутентификация через Twitter

Аутентификация Twitter

Продолжаем тему аутентификации через социальные сети и сегодня поговорим о Twitter.

Предыдущие статьи по этой теме:

Да, один из читателей уже заметил, что способов попасть на сайт стало больше, и я попутно с написанием статей дописывал и функционал у себя на сайте. Вот, дошло время и до твитера, как у всех социальных сетей, так и у него есть свои особенности, но при этом есть общая черта – нам нужно создать приложение, чем и займёмся.

Разбираемся с Twitter приложением

Начинаем мы свою работу с посещения страницы – приложения Twitter. Если Вы оказались тут впервые, то на этой странице увидите только одну кнопку «Create New App» - по ней и жмём.

Приложения Twitter

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

Изначальные настройки Twitter приложения

Тут особо пояснять нечего, двигаемся дальше и после заполнения соглашаемся с условиями пользования, кликаем в конце страницы на кнопку «Create your Twitter application».

Разработчики Twittera избавили нас от лишних настроек (в отличие от Facebook). Мы же сразу попадаем на главную страницу приложения и единственное, что можно изменить - это иконка. Перейдем на страницу «Keys and Access Tokens» и получим нам необходимые параметры для связи с API.

Keys and Access Tokens

Вот и всё, всего несколько минут и приложение можно использовать.

Пишем класс для аунтефикации через Twitter

Приступим к написанию и определимся, что у нас будет в скрипте:

  1. Нам потребуется конструктор, где мы будем сохранять передаваемые в него настройки и получать данные для формирования запросов к API;
  2. Сам метод аунтефикации при удачном выполнении, которого возвращать будем – true, а при обратном – false;
  3. Метод, при помощи которого мы сформируем ссылку для пользователя.
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>");
}

Фух, вот мы и закончили эту статью! Готовый рабочий скрипт прилагается, скачиваем и разбираемся, пишем коменты, если что-то было непонятно.

Подписаться на обновления

Иван Иваныч
Иван Иваныч 23 января 2016 в 13:22
Спасибо за статью! У меня получилось с первого раза подключить ваш скрипт к себе на сайт и при этом не возникло трудностей. Будут ещё по этой теме статьи?
Ответить
Антон Кулешов
Антон Кулешов > Иван Иваныч 24 января 2016 в 11:13
Я рад, что Вам пригодился скрипт, а касательно ещё статей по авторизациям через социальные сети пока в планах нет.
Ответить