Авторизация через социальные сети: Facebook

Авторизация через социальные сети: Facebook

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

скачать исходникискачать урок

Постановка задачи

Для авторизации через социальную сеть Facebook, используется открытый протокол OAuth 2.0. OAuth — это открытый протокол авторизации, который позволяет получить Вам – разработчикам — доступ к ресурсам пользователя хранящимся к примеру в социальной сети Facebook. При этом пользователю вовсе не нужно сообщать Вам свой логин и пароль для доступа к его данным.

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

Теперь, так как мы будем работать непосредственно с социальной сетью, наш скрипт должен располагаться на реальном сервере. Так как будет проходить постоянный обмен данными между нашим скриптом и сервисом Facebook. При этом на локальном компьтере (к примеру Denwer) скрипт работать не будет.

Для удобства работы с удаленным сервером, мы будем использовать текстовый редактор Notepad++, который содержит встроенный плагин по работе с протоколом FTP. Используя который, мы можем открывать и редактировать файлы скрипта непосредственно на удаленном сервере. Для этого запускаем текстовый редактор открываем меню Plugins, далее NppFTP и активируем Show NppFTP Window. При этом будет открыто окно для обзора файлов и папок удаленных серверов. В данном окне необходимо открыть настройки (кнопка Settings), а именно настройки профиля (Profile Settings) и добавить новый профиль для соединения с ftp сервером (при этом необходимо указать настройки подключения). Затем, кликнув по кнопке Connect выполняем соединении через FTP.

Для добавления новых файлов, достаточно правой кнопкой кликнуть по соответствующей папке и выбрать Create new file. Открыть соответствующий файл можно двойным щелчком мыши.

Создание приложения

Для получения данных пользователя из социальной сети Facebook, Вам обязательно необходим акаунт данной сети, а также необходимо создать приложение, которое непосредственно будет работать с данными пользователя. Для этого переходим в Facebook, авторизируемся и на странице https://developers.Facebook.com/?ref=mb переходим по вкладке Приложения выбираем “Create a new app”:

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

Далее переходим в новое созданное приложение:

На данной странице нам понадобятся идентификатор приложения и его секретный ключ (App Secret). ВАЖНО: никому не сообщайте эти данные и не выкладывайте в открытом виде на страницах своего сайта. Так как эти данные идентифицируют Ваше приложения и могут быть использованы злоумышленниками. Далее переходим на вкладку Настройки и нажимаем кнопку Добавить платформу.

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

Получение параметра code

Итак, первым делом создадим файл конфигурации config.php:

<?
define("URL_AUTH","https://www.Facebook.com/dialog/oauth");
define("CLIENT_ID","Идентификатор приложения");
define("SECRET","Секретный ключ приложения");
define("REDIRECT","http://avtomirock.com.ua/fb/auth.php");
define("TOKEN","https://graph.Facebook.com/oauth/access_token");
define("GET_DATA","https://graph.Facebook.com/me");
?>

Константы:

URL_AUTH – адрес страницы авторизации Facebook;

CLIENT_ID – идентификатор приложения;

SECRET – секретный ключ приложения;

REDIRECT – путь на который будет оправлен параметр code, в нашем случае мы создадим файл auth.php, который будет обрабатывать все данные;

TOKEN – адрес по которому нужно отправить запрос для получения access_token – ключ доступа к данным пользователя;

GET_DATA – адрес по которому нужно отправить запрос, для получения данных пользователя.

Далее создадим файл functions.php в котором, будем описывать функции необходимые для работы скрипта. Затем на нашем сайте создаем страницу авторизации, к примеру, вот такого содержания (файл index.php):

<?
require "config.php";
require "functions.php";

$path = URL_AUTH."?"."client_id=".CLIENT_ID."&redirect_uri=".urlencode(REDIRECT)."&response_type=code";
?>

<a href="<? echo $path;?>">Авторизация</a>

Авторизация через Facebook начинается с авторизации непосредственно на данном сервисе. Поэтому мы должны перенаправить пользователя для авторизации. При этом мы должны отправить через адресную строку (методом GET) следующие данные:

client_id – идентификатор приложения;

redirect_uri – путь на который придет параметр code, в случае успешной авторизации;

response_type – тип ответа от сервера, в нашем случае параметр code.

Поэтому с учетом этих данных формируем путь для ссылки – переменная $path. Страница выглядит следующим образом:

Далее, переходи по ссылке Авторизация и если мы еще не авторизировались на Facebook – увидим следующее:

Перед авторизацией давайте создадим файл auth.php, так как именно на него придет параметр code, при успешной авторизации. После этого вводим логин, пароль и нажимаем Войти.

После этого Facebook перенаправляет нас обратно на страницу auth.php и в адресной строке видно, что пришел параметр code, который необходим для получения ключа доступа к данным access_token.

Получение access_token

Access_token можно получить, только при наличии параметра code. При этом один и тот же code, можно использовать всего один раз. Поэтому в файл auth.php добавим следующий код:

<?
require "config.php";
require "functions.php";

if($_GET['code']) {
	$result = get_token($_GET['code']);
	
}
else {
	exit('Ошибка параметров');
}
?>

То есть, если мы получили параметр code, значит, вызовем функцию get_token(), передав ей полученный параметр code. Открываем файл functions.php и создадим функцию get_token():

function get_token($code) {
	$ku = curl_init();
	
	$query = "client_id=".CLIENT_ID."&redirect_uri=".urlencode(REDIRECT)."&client_secret=".SECRET."&code=".$code;
	
	curl_setopt($ku,CURLOPT_URL,TOKEN."?".$query);
	curl_setopt($ku,CURLOPT_RETURNTRANSFER,TRUE);
	
	$result = curl_exec($ku);
	if(!$result) {
		exit(curl_error($ku));
	}
	
	if($i = json_decode($result)) {
		if($i->error) {
			exit($i->error->message);
		}
	}
	else {
		
		parse_str($result,$token);
		
		if($token['access_token']) {
			return $token['access_token'];
		}
	}
}

Для получения access_token, необходимо отправить запрос по адресу https://graph.Facebook.com/oauth/access_token и передать следующие данные:

client_id – идентификатор приложения;

redirect_uri – аналогично как для получения code;

client_secret – секретный ключ приложения;

code – полученный code.

Для отправки запроса используем библиотеку curl. Обратите внимание, что в результате успешного запроса мы получим строку вида:

access_token=CAAFQLvUKJMcBAPhDrAkMMmSj5Q62jzQHF1x2i4LWSjqCgZClZBh6ckk7J
THf0Oh8EHGwwTl0ibXTDhXT39zOSWa1NypDu85CRizg9uAu2ILaQDZC4rIOmSIRo0eZCucu
wiul5t85xZCdJzk3JEod4LaQ7vTfpukxB5rkKC8RMQFHtKD5XwVJq&expires=5182962

То есть это строка запроса, которую можно использовать в адресной строке, а значит, если применить функцию parse_str($result,$token), мы в массиве $token получим две ячейки access_token, с ключом доступа и expires – период его актуальности. То есть массив следующего вида:

В случае возникновения ошибки в результате запроса мы получим строку формата JSON, следующего вида:

{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}

Значит ее можно конвертировать в объект, используя jsone_decode(). При этом можно вывести на экран сообщение об ошибке. Что, собственно я сделал в функции. Таким образом функция либо возвращает ключ access_token, либо выводит на экран сообщение об ошибке.

Получение данных пользователя

После получения ключа access_token, мы можем получить доступ к его данных, отправив запрос по адресу https://graph.Facebook.com/me. При этом необходимо отправить только access_token. Поэтому в файле auth.php, добавим следующий код (после вызова метода get_token):

if($result) {
		print_r(get_data($result));
	}

То есть если мы получили access_token, значит, вызываем функцию get_data(), код которой добавим в файл functions.php.

function get_data($token) {
	
	$ku = curl_init();
	
	$query = "access_token=".$token;
	
	curl_setopt($ku,CURLOPT_URL,GET_DATA."?".$query);
	curl_setopt($ku,CURLOPT_RETURNTRANSFER,TRUE);
	
	$result = curl_exec($ku);
	if(!$result) {
		exit(curl_error($ku));
	}
	
	return json_decode($result);
	
}

Опять же, аналогично отправляем запрос, используя библиотеку CURL, при этом в результате успешного запроса, мы получим строку формата JSON с данными пользователя, или сообщение об ошибке, если конечно она была. Поэтому данную строку конвертируем в объект и возвращаем как результат работы функции. На экране мы увидим следующее:

Мой профиль в Facebook заполнен не полностью, поэтому мы видим очень мало информации. Теперь полученную информацию о пользователе, Вы можете использовать по своему усмотрению. К примеру, можно сохранить в базе данных, таким образом реализовав механизм регистрации.

На этом данный урок завершен. Всего Вам доброго и удачного кодирования!!!

Курс по программированию на языке PHP

Изучите PHP с нуля до результата!

Смотреть курс

Метки: ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (3)

  1. Сергей

    правильнее было бы назвать пост не «Авторизация через социальные сети: Facebook», а «получение данных у авторизованного пользователя Facebook». Ну как то так

  2. Vladimir

    есть еше проблема что это переложения не работает когда заходиш не ты а кто то другой то пишут что приложения не работает нужно просто добавить email
    и еше вопрос если это приложения нужно будет использовать по другому адресу нужно менять сылку в самом приложени а можно это как то обойти ?

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree