Показать Меню
falbar Авторизация Facebook

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

Авторизация Facebook

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

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

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

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

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

Create a New App

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

Форма

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

Главная страница настроек

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

Settings

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

Status and Review

Вот мы и закончили создание и настройку приложении. Если сравнивать с ВК, то в 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 = false;
			parse_str(file_get_contents("https://graph.facebook.com/oauth/access_token?".$query), $token);

			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($code) мы вытягиваем нужные данные (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 в 23:53
Хорошая статья, через Twitter тоже напишите?
Ответить
Антон Кулешов
Антон Кулешов > Иван Иваныч 15 января 2016 в 23:55
Спасибо, планирую в следующей статье.
Ответить
Тимофей Синянский
Тимофей Синянский 22 марта 2016 в 17:53
Здравствуйте, подскажите пожалуйста, может все таки есть способ получить email пользователя? заметил что при регистрации, например на Кинопосике через ФБ, приложение КП получает email. Может это указывается где-то в настройках приложения на ФБ?
Ответить
Тимофей Синянский
Тимофей Синянский 22 марта 2016 в 17:54
И спасибо за статью!)
Ответить
Антон Кулешов
Антон Кулешов > Тимофей Синянский 22 марта 2016 в 22:06
Сейчас это невозможно. При добавлении авторизации через ФБ к себе на сайт, я также пытался вытянуть почту, но в любом случаи доступ к ней уже закрыт. Настроек в приложении таких нет. Единственный вариант, который был раньше, это через API социальной сети. Например, если указать дополнительно в параметре fields значение email, то результата не будет (тестировал долго и упорно на разных версиях API Facebook). Но при регистрации посетителя в предоставляемой информации приложению, появится и почта, что может дать ложную надежду.
Ответить
Anton Sergeev
Anton Sergeev 26 октября 2016 в 13:26
Привет спасибо за статью, подскажите существует ли возможность обновить данные уже авторизованных (зарегистрированных) через ФБ пользователей? Т.е. у меня есть основные данные в базе но мне нужно допустим подгрузить их аватары и прочее.
Ответить
Антон Кулешов
Антон Кулешов > Anton Sergeev 2 ноября 2016 в 17:18
Да. При каждом входе пользователя изменившиеся данные перезаписывайте.
Ответить