Аутентификация через Facebook
- Details
- Published on Saturday, 23 March 2013 12:02
Привет всем! Сегодня мы выходим на финишную прямую и рассмотрим, как осуществить процесс аутентификации через социальную сеть Facebook.
Если кто пропустил предыдущие части, то их можно найти тут:
Заметка. Пример, созданный в данном уроке, предназначен для работы на локальном сервере.
Шаг 1. Регистрация нового приложения
Для того чтобы добавить новое приложение на Facebook, отправляемся на специально подготовленную для этого страницу.
В верхнем правом углу нажимаем на кнопку "+ Создать новое приложение". Далее вписываем название приложения:
Затем вводим проверочный код:
Далее, на странице настроек вашего приложения, отправляемся к блоку "Как ваше приложение встроено в Facebook" и кликаем на пункт "Website with Facebook Login". В открвшемся поле вводим адрес нашего сайта. В моём случае, это http://localhost/facebook-auth:
После этого сохраняем все настройки. Для дальнейшей работы вам понадобятся параметры, которые вы сможете найти в следующих полях:
Запишем их в специальные переменные файла index.php:
<?php $client_id = '578516362116657'; // Client ID $client_secret = 'eb1814bd3980ab9a306dc35073021fb3'; // Client secret $redirect_uri = 'http://localhost/facebook-auth'; // Redirect URIs
Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:
$url = 'https://www.facebook.com/dialog/oauth'; $params = array( 'client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'response_type' => 'code', 'scope' => 'email,user_birthday' );
С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Facebook</a></p>'; // https://www.facebook.com/dialog/oauth?client_id=578516362116657&redirect_uri=http://localhost/facebook-auth&response_type=code&scope=email,user_birthday
Итак, ссылка для аутентификации готова. Если мы сформировали все параметры правильным образом и получили верный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/facebook-auth'). Только теперь к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой http://localhost/facebook-auth/?code=AQD5q80zafjvVZoZex87ROxkCvWT9rZhjwZtkBLajYwH20KztPOI0jpb5lHZisPd3mA49Wu_onAeEioU5K6KVuoCliznf61B5bDfZSLFaIn6E7E49zqs4fO6NjTYyxN43LBttCvsSlirJOAtbOpB3oyMrl3bbjlPhGHsCyJzA-DypEIZ1c_36WAEBPmfSq3TroekvTLme3jIzZk0C-93cu8z#_=_
Шаг 3. Получение токена
Начинать процедуру аутентификации мы можем в том случае, если к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.
В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `client_id` - id приложения; `redirect_uri` - страница, на которую будет возвращён пользователь; `client_secret` - секретный ключ; `code` - url параметр, пришедший от Facebook:
if (isset($_GET['code'])) { $result = false; $params = array( 'client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'client_secret' => $client_secret, 'code' => $_GET['code'] ); $url = 'https://graph.facebook.com/oauth/access_token'; }
Далее нам нужно отправить GET запрос на адрес https://graph.facebook.com/oauth/access_token, передав перечисленные параметры. В PHP выполнить GET запрос по какому-то адресу можно несколькими способами. Для данного урока я воспользуюсь функцией file_get_contents. В отличии от других социальных сетей, Facebook присылает ответ не в JSON формате, а в виде строки, где параметры разделены специальными символами. Для того чтобы распарсить данный ответ, воспользуемся функцией parse_str, а результат (в виде массива) запишем в переменную $tokenInfo:
$tokenInfo = null; parse_str(file_get_contents($url . '?' . http_build_query($params)), $tokenInfo);
В результате, при успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Facebook в JSON формате. Данная строка содержит 4 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе; token_type - тип токена; expires_in - время жизни токена; id_token - id токена:
array(2) { ["access_token"]=> string(115) "AAAIOREZCDAnUBAOEmLbNqgHzQSNFoZBBdZC99eNv6DkZA842GUTHP3H7j7YnxEPOZCmZBiPgEZCJCb80zVXDGP9JeX8DGSRi6PU2liZAPQuj9QZDZD" ["expires"]=> string(7) "5177324" }
Шаг 4. Получение информации о пользователе
Далее делаем запрос к Facebook API для получения информации о пользователе. Передавать будем один единственный параметр access_token:
if (count($tokenInfo) > 0 && isset($tokenInfo['access_token'])) { $params = array('access_token' => $tokenInfo['access_token']); $userInfo = json_decode(file_get_contents('https://graph.facebook.com/me' . '?' . urldecode(http_build_query($params))), true); if (isset($userInfo['id'])) { $userInfo = $userInfo; $result = true; } }
Отправляем GET запрос по адресу https://graph.facebook.com/me
.
В результате, если всё было сделано правильно, то получим JSON ответ примерно следующего вида:
Array
(
[id] => 100000317390816
[name] => Стас Протасевич
[first_name] => Стас
[last_name] => Протасевич
[birthday] => 07/03/1988
[hometown] => Array
(
[id] => 110228142339670
[name] => Chisinau, Moldova
)
[location] => Array
(
[id] => 110228142339670
[name] => Chisinau, Moldova
)
[work] => Array
(
[0] => Array
(
[employer] => Array
(
[id] => 159295210819421
[name] => Web-Concept
)
[location] => Array
(
[id] => 110228142339670
[name] => Chisinau, Moldova
)
[position] => Array
(
[id] => 108480125843293
[name] => Web Developer
)
[start_date] => 2010-09
[end_date] => 2011-10
)
)
[sports] => Array
(
[0] => Array
(
[id] => 106011416097502
[name] => Ice hockey
)
)
[favorite_athletes] => Array
(
[0] => Array
(
[id] => 202766356426583
[name] => Michael Jordan
)
)
[inspirational_people] => Array
(
[0] => Array
(
[id] => 7170054127
[name] => Hans Zimmer
)
[1] => Array
(
[id] => 113529011990795
[name] => Steve Jobs
)
[2] => Array
(
[id] => 225471537469600
[name] => Albert Einstein
)
)
[education] => Array
(
[0] => Array
(
[school] => Array
(
[id] => 135979339750670
[name] => Лицей Василия Лупу
)
[year] => Array
(
[id] => 140617569303679
[name] => 2007
)
[type] => High School
)
[1] => Array
(
[school] => Array
(
[id] => 110260779004118
[name] => State University of Moldova
)
[year] => Array
(
[id] => 142963519060927
[name] => 2010
)
[concentration] => Array
(
[0] => Array
(
[id] => 189014467787633
[name] => Прикладная информатика
)
)
[type] => College
)
[2] => Array
(
[school] => Array
(
[id] => 110260779004118
[name] => State University of Moldova
)
[degree] => Array
(
[id] => 200940416612694
[name] => Магистр
)
[year] => Array
(
[id] => 115222815248992
[name] => 2012
)
[concentration] => Array
(
[0] => Array
(
[id] => 120214931322280
[name] => сетевые технологии
)
)
[type] => Graduate School
)
)
[gender] => male
[email] => This email address is being protected from spambots. You need JavaScript enabled to view it.
[timezone] => 2
[locale] => ru_RU
[languages] => Array
(
[0] => Array
(
[id] => 176015189120060
[name] => Russian
)
[1] => Array
(
[id] => 106059522759137
[name] => English
)
)
[verified] => 1
[updated_time] => 2012-12-06T18:06:38+0000
)
Полный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> <title>Аутентификация через Facebook</title> </head> <body> <?php $client_id = '578516362116657'; // Client ID $client_secret = 'eb1814bd3980ab9a306dc35073021fb3'; // Client secret $redirect_uri = 'http://localhost/facebook-auth'; // Redirect URIs $url = 'https://www.facebook.com/dialog/oauth'; $params = array( 'client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'response_type' => 'code', 'scope' => 'email,user_birthday' ); echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Facebook</a></p>'; if (isset($_GET['code'])) { $result = false; $params = array( 'client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'client_secret' => $client_secret, 'code' => $_GET['code'] ); $url = 'https://graph.facebook.com/oauth/access_token'; $tokenInfo = null; parse_str(file_get_contents($url . '?' . http_build_query($params)), $tokenInfo); if (count($tokenInfo) > 0 && isset($tokenInfo['access_token'])) { $params = array('access_token' => $tokenInfo['access_token']); $userInfo = json_decode(file_get_contents('https://graph.facebook.com/me' . '?' . urldecode(http_build_query($params))), true); if (isset($userInfo['id'])) { $userInfo = $userInfo; $result = true; } } } ?> </body> </html>
Шаг 5. Извлечение информации о пользователе
Для просмотра большего количества полей загляните в содержание переменной $userInfo:
if ($result) { echo "Социальный ID пользователя: " . $userInfo['id'] . '<br />'; echo "Имя пользователя: " . $userInfo['name'] . '<br />'; echo "Email: " . $userInfo['email'] . '<br />'; echo "Ссылка на профиль пользователя: " . $userInfo['link'] . '<br />'; echo "Пол пользователя: " . $userInfo['gender'] . '<br />'; echo "ДР: " . $userInfo['birthday'] . '<br />'; echo '<img src="http://graph.facebook.com/' . $userInfo['username'] . '/picture?type=large" />'; echo "<br />"; }
Шаг 6. И снова дело за вами
Тут всё как и в предыдущих случаях. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить, не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.
После этого всё что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;
На странице выхода из системы просто удаляем сессию с помощью функции unset
.
Итог
Итак, это последняя статья, где мы рассматривали создание аутентификации для отдельной социальной сети или сервиса. В следующем уроке я покажу вам, как построить систему аутентификации через несколько соц сетей, и как прикрутить всё это к БД. Удачи!
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/Ey6yKm406v4/lessons.php