Аутентификация через Facebook
Привет всем! Сегодня мы выходим на финишную прямую и рассмотрим, как осуществить процесс аутентификации через социальную сеть 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] => Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript [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['id'] . '/picture?type=large" />'; echo "<br />"; }
Шаг 6. И снова дело за вами
Тут всё как и в предыдущих случаях. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить, не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.
После этого всё что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;
На странице выхода из системы просто удаляем сессию с помощью функции unset
.
Итог
Итак, это последняя статья, где мы рассматривали создание аутентификации для отдельной социальной сети или сервиса. В следующем уроке я покажу вам, как построить систему аутентификации через несколько соц сетей, и как прикрутить всё это к БД. Удачи!
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/Ey6yKm406v4/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
- 2024-05-27 » Подборка сервисов для расшифровки аудио в текст
- 2024-05-27 » PostgreSQL 16. Изоляция транзакций. Часть 2
- 2024-05-06 » Как настраивать конверсионные стратегии: работа над ошибками
- 2024-04-22 » Комментирование кода и генерация документации в PHP
- 2024-04-22 » SEO в России и на Западе: в чем основные отличия
- 2024-04-22 » SEO для международного масштабирования
- 2024-04-22 » Как использовать XML-карты для продвижения сайта
Кто мало хочет, тот дешево стоит |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.