Матвей Земсков

Заметки веб-мастера

Вторник, 07 июля 2015 09:20

Обновленная информация об авторизации на сайте через Facebook (PHP SDK v4)

Оцените материал
(6 голосов)

Более двух лет тому назад, я разместил в своем блоге перевод статьи об авторизации на сайте, при помощи соцсети Facebook. Эта статья заинтересовала посетителей и стала довольно популярной. За это время ее прочитало около 17 000 человек. Правда сейчас, в 2015 году, информация, представленная в статье устарела. Недавно я решил узнать, как обстоят дела с авторизацией через Facebook на данный момент. Почитав документацию на сайте для разработчиков, я понял, что произошедшие изменения довольно значительны. Это побудило меня написать новую статью и разместить ее в своем блоге.

Чтобы читателю было удобней знакомиться с отличиями, произошедшими за это время, в обновленной статье я попытался сохранить структуру прошлой.

Шаг первый. Подготовка

Сначала нам нужно создать базу данных для хранения информации о посетителях, а также приложение в Facebook. Так как эта статья написана в образовательных целях, я решил не создавать базу данных mySQL, а обойтись SQLite. БД называется my-app, состоит она из единственной таблицы users. Таблица выглядит также, как и прошлой статье.

SQL

CREATE TABLE `users` ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, "oaut_provider" VARCHAR, "oauth_uid" VARCHAR, "username" VARCHAR)

Она состоит из полей, в которых будет храниться следующая информация: ID, название соцсети, через которую произошла авторизация (на случай если для авторизации будет задействовано несколько соцсетей на выбор), идентификатор посетителя в социальной сети, его имя и фамилия.

Итак, БД создана. Переходим к созданию приложения в Facebook. Для этого перейдите по ссылке и заполните все необходимые поля.

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

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

Панель приложений Facebook

В результате я получил 2 ключа приложения: App ID и App Secret - это довольно важные штуки, без них ваши скрипты не будут работать.

Еще один момент. Приложению нужно указать значение URL для редиректа после авторизации. Этот путь и имя файла должны совпадать со значением, которое вы укажите в вашем скрипте для авторизации. Делается это в настройках: выберите в меню слева пункт: Settings, перейти к закладке Advanced и заполнить поле Valid OAuth redirect URIs.

Шаг второй. Авторизация

С момента размещения на сайте прошлой статьи, процесс практически не изменился:

  • генерируется url для авторизации на facebook.com
  • посетитель перенаправляется по указанному url
  • скрипт запрашивает права на доступ к профилю посетителя
  • если авторизация прошла успешно, происходит перенаправление на адрес указанный в настройках и скрипте
  • процесс авторизации завершается: данные о посетителе сохраняются в базе данных и массиве $_SESSION

Перед тем, как приступить ко второму шагу, сделаем небольшое отступление. Это нужно для того, чтобы скачать PHP SDK и немного познакомиться со структурой нашего мини-приложения.

Кстати, на данный момент актуальная 4 версия PHP SDK, которую можно загрузить отсюда

Давайте рассмотрим структуру файлов и папок нашего приложения.

На изображении - структура файлов приложения

Итак, давайте начнем с содержимого файла setting.php. В нем хранятся настройки, это как раз то, с чего нужно начинать.

PHP

	// путь к папке приложения
	define('FACEBOOK_SDK_V4_SRC_DIR', 'fb-sdk/');
	// App ID
	define('FACEBOOK_APP_ID', 'ваш_app_id');
	// App Secret
	define('FACEBOOK_APP_SECRET', 'ваш_app_secret');
	// путь к файлу, на который происходит редирект с Facebook
	define('REDIRECT_URL', 'ваш_redirect_url');
	// путь к файлу базы данных
	define('DB_NAME','my-app.sqlite');

Теперь можно проходить авторизацию через Facebook при помощи следующего кода:

PHP

session_start();

require __DIR__ . '/settings.php';
require __DIR__ . '/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;

FacebookSession::setDefaultApplication(FACEBOOK_APP_ID, FACEBOOK_APP_SECRET);

$required_scope = 'public_profile';

$helper = new FacebookRedirectLoginHelper(REDIRECT_URL);

try{
   $session = $helper->getSessionFromRedirect();
}catch(FacebookRequestException $ex){
    die('Error: '.$ex->getMessage());
}catch(\Exception $ex){
    die('Error: '.$ex->getMessage());
}

if($session){
   $user_profile = (new FacebookRequest($session, 'GET', '/me'))->execute()->getGraphObject();
   echo '<pre>';
   print_r($user_profile);
   echo '</pre>';
   
}
else{
    $login_url = $helper->getLoginUrl(array('scope'=>$required_scope));
    header('Location: '.$login_url);
}

Этот код нужно сохранить в файле с именем login_fb.php. После сохранения можно открыть его в браузере. Если все сделано правильно, то вы сначала будете перенаправлены на Facebook, после ввода логина и пароля, произойдет редирект обратно (URL указан в настройках приложения в профиле на Facebook и в файле settings.php). Сработает блок кода, который получит данные о вас и просто выведет их на экран.

Результат работы скрипта login_fb.php

Шаг третий. Регистрация и авторизация

На этом шаге мы будем работать с базой данных. Как я писал выше, я выбрал базу данных SQLite. Она размещается в той же папке, что и остальные файлы и называется my-app.sqlite. Код из этого раздела статьи нужно разместить внутри блока if($session){…}. Сейчас там уже есть строка, которая получает данные из профиля посетителя и сохраняет их в переменную $user_profile. Эти данные мы и сохраним в базу.

PHP

$user_id = $user_profile->getProperty('id');
$user_name = $user_profile->getProperty('name');
    try{
           $db = new PDO('sqlite:'.DB_NAME);
           $query = "SELECT * FROM users WHERE oauth_provider = 'facebook' AND oauth_uid = ".$user_id;
           $st = $db->query($query);
           $res = $st->fetch(PDO::FETCH_ASSOC);

           if(empty($res)){
               $query = "INSERT INTO users (oauth_provider, oauth_uid, username) VALUES ('facebook', {$user_id}, '{$user_name}')";
               $db->exec($query);
               $query = "SELECT * FROM users WHERE id = " . $db->lastInsertId();
               $st = $db->query($query);
               $res = $st->fetch(PDO::FETCH_ASSOC);

           }
           $_SESSION['id'] = $res['id']; 
           $_SESSION['oauth_provider'] = $res['oauth_provider'];
           $_SESSION['oauth_uid'] = $res['oauth_uid'];
           $_SESSION['username'] = $res['username'];

           header('Location: '.$_SESSION['back_url']);
       }            
    catch(PDOException $e){
           echo $e->getMessage();                        
       }

Как и в предыдущей статье производим поиск по базе, опираясь на данные из поля oauth_provider. Если заполнять это поле при добавлении каждой новой записи, то можно сохранять данные об авторизации из разных источников (например, Twitter и других). В поле oauth_uid таблицы предназначено для хранения идентификаторов пользователей.

В результате запроса в переменной $res – будет находиться массив с данными, полученными из БД. Некоторые из них необходимо сохранить в сессии. Только не забудьте добавить в самом начале скрипта вызов функции session_start(). Кроме того в скриптах, где необходима авторизация, также нужно добавить вызов этой функции. Сделать это нужно также в самом начале каждого скрипта.

PHP

if(empty($_SESSION['oauth_uid'])){
    $_SESSION['back_url'] = $_SERVER['PHP_SELF'];
    header('Location: login_fb.php');    
}

Для отображения имени посетителя добавим к этому коду следующие строки:

PHP

else{
    echo 'Welcome '.$_SESSION['username'];    
}

Шаг четвертый: используем дополнительные возможности

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

PHP

…
$required_scope = 'email, user_birthday, user_status, publish_actions, user_photos, user_videos';
…
$login_url = $helper->getLoginUrl(array('scope'=>$required_scope));
…

Все действия с профилем производятся через Graph API. Ранее можно было использовать FQL (Facebook Query Language), но на данный момент он устарел и более не поддерживается Facebook.

Проверка наличия у приложения расширенных прав

Перед тем как проводить какие-либо действия, особенно если они связаны с публикацией чего-либо, необходимо убедиться в наличии у приложения необходимых прав. Размещаем внутри блока if($session){…} следующий код:

PHP

$user_permissions = (new FacebookRequest($session, 'GET', '/me/permissions'))->execute()->getGraphObject(GraphUser::className())->asArray();
    $found_permission = false;
    foreach($user_permissions as $key=>$value){
	if($value->permission == 'publish_actions'){
		$found_permission = true;
	}
    }
	
    if($found_permission){
	// пользуемся разрешением publish_actions
	echo "publish_actions доступно приложению";
    }

Если все сделано правильно, проверка прав пройдет успешно. Теперь давайте разместим какое-нибудь сообщение на «стене» пользователя. Для примера я разместил у себя в профиле ссылку на свой сайт. Сразу после приведенного выше кода для проверки прав, добавляем следующее:

PHP

	if($found_permission){
		// пользуемся правом publish_actions
		
		$post_data = array('link' => 'http://mattweb.ru', 'message' => 'Заметки веб-мастера');
		$response = (new FacebookRequest($session, 'POST', 'me/feed', $post_data))->execute()->getGraphObject();
		
		if($response->getProperty('id')){
			echo "Ссылка опубликована!";
		}
		
	}	

В результате на «стене» в моем профиле появилось следующее сообщение:

Сообщение на стене пользователя

Дополнительная информация, которая может пригодиться

Как было отмечено в «старой» статье: пользователь в любой момент может удалить ваше приложение или лишить его каких-либо прав. Сделать это можно на странице настроек приложения. До сих пор эта информация является актуальной. Поэтому необходимо хорошо обдумать как будет вести себя ваше приложение в такой ситуации.

Заключение

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

Вы можете скачать архив с примерами кода из статьи для более детального ознакомления.

Прочитано 10009 раз
Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:

Наверх