О том, как я не очень «легко» коротал вечер в компании приложений Facebook

14 января 2016 Антон Кулешов 6734 6

Миром овладели соцсети, а потому, мало кто станет регистрироваться на сайте или форуме, заполняя при этом кучу полей, добавляя аватарку и прочее. Дабы привлечь посетителей нам придется использовать API социальных сетей – где уже есть вся нужная нам информация для оформления профиля. Ранее мы уже рассматривали один из способов авторизации пользователя через «ВКонтакте», сегодня поговорим о Facebook.

Реклама

Перед тем, как перейти к самому написанию скрипта, стоит сказать, что добавление авторизаций через социальные сети – это явная забота о пользователе (если через ваш ресурс не проходят денежные транзакции – там, все же, стоит быть осторожнее и строже). Сам в ближайшие время обязательно добавлю на falbar авторизацию через основные соцсети - пока просто руки не доходят. Данные, которые мы получаем через API соцсети, по понятным причинам, ограничены и могут изменяться, поэтому почту пользователя для рассылки, получить не удастся, хотя раньше и можно было.

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

Создаём и настраиваем приложение Facebook

Думаю понятно - для того чтобы взаимодействовать с API социальной сети нам потребуется создать приложение и его настроить особым образам. В Facebook все ваши приложения находятся по этому адресу – приложения Facebook. При первом посещении данной странице вы нечего кроме большой зелёной кнопки «Create a New App» не обнаружите, по ней и кликаем.

create-a-new-app-facebook

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

forma-facebook

Далее мы попадаем на главную страницу настроек приложения. Важный момент – это то, что приложение изначально выключено (это можно определить по индикатору состояния). Для работы скрипта нам потребуется использовать два параметра: App ID (индификатор приложения) и App Secret (секретный ключ приложения).

glavnaya-stranitsa-nastroek-facebook

Продолжаем настраивать приложение и переходим на страницу «Settings». Тут указываем параметры: App Domains (базовый домен) и Contact Email (контактная почта). Без второго параметра не получиться включить приложение авторизации. Далее нажимаем на кнопку «Add Platform» и выбираем вебсайт, сохраняем изменения.

settings-facebook

Нам осталось только включить приложение. Для это переходим на страницу «Status & Review» и переводим тумблер в состояние «Yes».

status-and-review-facebook

Вот мы и закончили создание и настройку приложении. Если сравнивать с «ВКонтакте», то в Facebook этот процесс занимает чуть больше времени.

Пишем PHP код для авторизации через Facebook

Принцип и логику написания скрипта я оставлю такой же, как и в написанной ранее статье - Аутентификация через «ВКонтакте». В ней я подробно описывал класс авторизации и методы, которые он в себя включает. Тут же я просто добавлю код с краткими пояснениями, чтобы не повторятся.

Собственно класс авторизации через Facebook:

class FBAuth{

	public $settings    = array();
	public $auth_status = false;
	public $user_info   = array();

	public function __construct($settings){

		if(isset($settings["client_id"], $settings["client_secret"], $settings["redirect_uri"])){

			$this->settings = $settings;
		}
	}

	public function auth($code){

		if($code && $this->settings){

			$query = urldecode(http_build_query(array(

				"client_id"	 => $this->settings["client_id"],
				"redirect_uri"   => $this->settings["redirect_uri"],
				"client_secret"  => $this->settings["client_secret"],
				"code" 	         => $code
			)));

			$token = json_decode(file_get_contents("https://graph.facebook.com/oauth/access_token?".$query), true);

			if(isset($token["access_token"])){

				$query = urldecode(http_build_query(array(

					"access_token" => $token["access_token"],
					"fields"       => "id,first_name,last_name,picture.width(120).height(120)"
				)));

				$this->user_info = json_decode(file_get_contents("https://graph.facebook.com/me?".$query), true);

				if(isset($this->user_info["id"])){

					$this->auth_status = true;

					return true;
				}
			}
		}

		return false;
	}

	public function get_link(){

		if($this->settings){

			$query = urldecode(http_build_query(array(

				"client_id"     => $this->settings["client_id"],
				"redirect_uri"  => $this->settings["redirect_uri"],
				"response_type" => "code"
			)));

			return "https://www.facebook.com/dialog/oauth?".$query;
		}

		return false;
	}
}

Данный класс формирует ссылку для авторизации при помощи метода get_link(). Пользователь, нажав на неё отправиться на странницу Facebook, где ему потребуется разрешить приложению получать данные по его профилю. После того, как посетитель это разрешит, его перенаправит обратно к нам сайт с GET параметром code. При помощи метода auth() мы вытягиваем нужные данные (Id, имя, фамилия и аватарку). Касательно автаркии в Facebook довольно удобно сделали то, что можно задать размеры желаемой картинки. Функция возвращает: при удачно исходе - true, при ином - false.

Переходим к самой странице, где будет кнопка авторизации. В начале подключаем файл с классом и создаем его объект, передав в конструктор исходные данные:

require_once("FBAuth.php");

$fb = new FBAuth(array(

	"client_id"	=> "ID_приложения",
	"client_secret"	=> "защищенный_ключ",
	"redirect_uri"	=> "адрес_сайта"
));

if(isset($_GET["code"])){

	if($fb->auth($_GET["code"])){

		// Делаем свои дела
	}
}

Отловив GET параметр, мы пытаемся авторизоваться и, если всё успешно, уже работаем непосредственно с базой данных (если пользователя нет - добавляем, или обновляем некоторые параметры). В нашем случае, для наглядности, просто выведем его данные из профиля:

if($fb->auth_status){

	echo("Социальный ID пользователя: ".$fb->user_info["id"]);
	echo("<br />");
	echo("Имя пользователя: ".$fb->user_info["first_name"]);
	echo("<br />");
	echo("Фамилия пользователя: ".$fb->user_info["last_name"]);
	echo("<br />");
	echo("<img src='".$fb->user_info["picture"]["data"]["url"]."' alt='image' />");
}else{

	echo("<a href='".$fb->get_link()."'>Войти</a>");
}
Реклама
Иван Иваныч
Иван Иваныч 15 января 2016
Хорошая статья, через Twitter тоже напишите?
Антон Кулешов
Антон Кулешов 15 января 2016
Спасибо, планирую в следующей статье.
Тимофей Синянский
Тимофей Синянский 22 марта 2016
Здравствуйте, подскажите пожалуйста, может все таки есть способ получить email пользователя? заметил что при регистрации, например на Кинопосике через ФБ, приложение КП получает email. Может это указывается где-то в настройках приложения на ФБ и спасибо за статью?
Антон Кулешов
Антон Кулешов 22 марта 2016
Сейчас это невозможно. При добавлении авторизации через ФБ к себе на сайт, я также пытался вытянуть почту, но в любом случаи доступ к ней уже закрыт. Настроек в приложении таких нет. Единственный вариант, который был раньше, это через API социальной сети. Например, если указать дополнительно в параметре fields значение email, то результата не будет (тестировал долго и упорно на разных версиях API Facebook). Но при регистрации посетителя в предоставляемой информации приложению, появится и почта, что может дать ложную надежду.
Anton Sergeev
Anton Sergeev 26 октября 2016
Привет спасибо за статью, подскажите существует ли возможность обновить данные уже авторизованных (зарегистрированных) через ФБ пользователей? Т.е. у меня есть основные данные в базе но мне нужно допустим подгрузить их аватары и прочее.
Антон Кулешов
Антон Кулешов 2 ноября 2016
Да. При каждом входе пользователя изменившиеся данные перезаписывайте.
no_avatar