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

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

Суббота, 01 декабря 2012 09:19

Авторизация на сайте с помощью Facebook (PHP SDK)

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

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

Уважаемые посетители!

Информация в этой статье устарела и является неактуальной.

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

Шаг первый: установка

Создаем Базу данных.

Давайте начнем с создания таблицы в БД:

SQL

CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `oauth_provider` varchar(10),
    `oauth_uid` text,
    `username` text,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Мы создаем таблицу для хранения информации о пользователях, которая включает следующие поля: ИД, логин пользователя, имя и фамилия пользователя, URI аватара пользователя и дату регистрации. Также нужно добавить еще пару полей: oauth_provider и oauth_uid, чтобы хранить в них идентификаторы различных соцсетей. Допустим, что на следующей неделе, вы решите, что неплохо было бы организовать авторизацию через Twitter. Легко: вы просто внесете в поле oauth_provider данные об этом и таким образом оградите себя от дублирования значений в поле oauth_uid – используя при выборке значения обоих полей: oauth_provider и oauth_uid.

Создаем приложение в Facebook.

Давайте создадим новое приложение в Facebook. Придумайте название приложения и согласитесь с условиями и соглашениями. Затем, сохраните API ключ и секретный ключ вашего приложения. Эти ключи расположены в секции с основными настройками приложения.

Получаем API ключ нового приложения
Получаем API ключ нового приложения

Далее заполните поля Canvas URL и Post-Authorize Redirect URL. Например, значением полей может быть следующий URL – http://localhost.com/login-facebook.php? Обратите внимание на знак вопроса в конце URL, его обязательно нужно указывать в обоих полях. Чтобы локальный хост открывался при запросе адреса http://localhost.com, нужно отредактировать файл hosts.

Указываем Canvas URL и Post-Authorize Redirect URL
Указываем Canvas URL и Post-Authorize Redirect URL

В полях раздела «Соединение», заполните поле Connect URL – его значение должно быть таким же, как в уже заполненных полях, а в поле Base Domain нужно указать localhost.com.

Указываем Connect URL
Указываем Connect URL

После сохранения настроек приложения, нужно скачать библиотеку PHP SDK и распаковать файл facebook.php из архива в новую директорию в корневой папке сайта.

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

Процесс авторизации состоит из 3 шагов:

  • Скрипт на вашем сервере генерирует url для авторизации на facebook.com, направляет туда пользователя и запрашивает права на доступ к его профилю
  • Facebook возвращает Canvas url в виде параметра в адресной строке
  • Процесс авторизации завершается сохранением авторизованного состояния в сессии

Давайте сделаем небольшую проверку перед регистрацией и авторизацией на нашем сайте.

PHP

	# Подключаем файл библиотеки
	require("facebook.php");
	# Создаем объект класса Facebook
	$facebook = new Facebook(array(
		'appId'  => 'YOUR_APP_ID',
		'secret' => 'YOUR_APP_SECRET',
		'cookie' => true
	));
	#Получим ID пользователя
	$user = $facebook->getUser();
	if (!empty($user)) {
		try {	
				  # Узнаем данные об авторизованном пользователе.
				 $user_profile = $facebook->api('/me');
				print_r($user_profile);
			  }
	  catch (FacebookApiException $e) {
			error_log($e);
			$user = null;
		}
	}
	else 
	{  
		# Нет данных об авторизации в сессии, направляем пользователя для авторизации  
		$login_url = $facebook->getLoginUrl();  
		header("Location: ".$login_url);  
}

Сохраним этот код в файле с именем login_facebook.php в корневой папке сайта и откроем его в браузере. Если все сделано правильно, то вы будете перенаправлены на facebook.com и увидите форму для запроса прав доступа приложения к вашему профилю.

Запрос прав доступа приложения к вашему профилю
Запрос прав доступа приложения к вашему профилю

Этого могло не произойти по ряду причин: первый вариант развития событий – вы были перенаправлены на facebook.com, но увидели страницу с ошибкой. Решение может быть следующее: попробуйте проверить данные в настройках приложения – все ли поля заполнены. Второй вариант развития событий: вы увидели ошибку примерно следующего содержания: «Uncaught CurlException: 60: SSL certificate problem, verify that the CA cert is OK.». Вероятно, это произошло из-за неверных настроек CURL. Чтобы исправить эту проблему откройте файл base_facebook.php из библиотеки PHP SDK и найдите в нем метод makeRequest().

В нем, сразу после строки:

PHP

$opts = self::$CURL_OPTS;  

Добавьте следующую строку:

PHP

$opts[CURLOPT_SSL_VERIFYPEER] = false;

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

Давайте продолжим с регистрацией пользователя: я разместил код примера внутри блока try/catch – сделано это для предотвращения возникновения ошибки, в случае устаревших значений ключей в текущем URL.

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

Сейчас будем проводить операции с базой данных. Обратите внимание, что я не буду осуществлять обработку данных перед сохранением в БД, для того, чтобы сократить объем кода в примерах. Пожалуйста, имейте это в виду и обязательно проводите обработку данных, поступивших от пользователя, перед сохранением в БД.

Создаем подключение к базе данных:

PHP

	mysql_connect('localhost', 'YOUR_USERNAME', 'YOUR_PASSWORD');
	mysql_select_db('YOUR_DATABASE');

Считаем, что в нашем примере сессия активна.

PHP

	# Сессия активна; давайте проверим зарегистрирован ли пользователь
	$query = mysql_query("SELECT * FROM users WHERE oauth_provider = 'facebook' AND oauth_uid = ". $user['id']);
	$result = mysql_fetch_array($query);
	# Если нет – сохраняем данные в БД
	if(empty($result)){
		$query = mysql_query("INSERT INTO users (oauth_provider, oauth_uid, username) VALUES ('facebook', {$user['id']}, '{$user['name']}')");
		$query = mysql_query("SELECT * FROM users WHERE id = " . mysql_insert_id());
		$result = mysql_fetch_array($query);
}

Обратите внимание, что я произвожу поиск пользователей из Facebook, опираясь на данные из поля oauth_provider. Заполняя это поле при добавлении любой записи, вы сможете сохранять данные об OAuth авторизации из разных источников (таких как twitter, Google Accounts, Open ID и тп), а в поле oauth_uid – будут храниться идентификаторы пользователей.

Хорошим решением при создании таблицы в БД будет присвоить полю oauth_provider тип ENUM.

Сейчас в переменной $result – находится массив с данными, полученными из БД. Давайте сохраним некоторые из них в сессии. Добавьте следующий код первой строкой вашего скрипта:

PHP

session_start();

После условного блока с проверкой if(empty($result)) добавьте следующий код:

PHP

	if(!empty($user)){
		# ...
		if(empty($result)){
			# ...
	   }
		# let's set session values
		$_SESSION['id'] = $result['id'];
		$_SESSION['oauth_uid'] = $result['oauth_uid'];
		$_SESSION['oauth_provider'] = $result['oauth_provider'];
		$_SESSION['username'] = $result['username'];
	}

Чтобы не отправлять уже авторизованных пользователей для повторной авторизации после строки session_start(); добавим следующее:

PHP

	if(!empty($_SESSION)){
		header("Location: home.php");
	}

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

PHP

	session_start();
	if(empty($_SESSION)){
		header("Location: login_facebook.php");
	}

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

PHP

	echo 'Welcome ' . $_SESSION['username'];
	# или..
	echo 'Welcome ' . !empty($_SESSION) ? $_SESSION['username'] : 'guest';

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

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

FQL или Graph API

По моему мнению, FQL – более гибкий, чем Graph API и с ним проще работать. К счастью, Facebook все еще позволяет разработчикам использовать его, несмотря на то, что в новой библиотеке есть небольшие изменения.

Если вы хотите получить следующие данные о пользователе: имя, фамилию, аватар, фото пользователя и данные о поле, то можете использовать метод users.getInfo

PHP

   $uid = $facebook->getUser();
    $api_call = array(
        'method' => 'users.getinfo',
        'uids' => $uid,
        'fields' => 'uid, first_name, last_name, pic_square, pic_big, sex'
    );
    $users_getinfo = $facebook->api($api_call)

Узнать обо всех полях, поддерживаемых методом users.getInfo()

Тот же самый результат можно получить используя FQL:

PHP

	$uid = $facebook->getUser();
		$fql_query  =   array(
			'method' => 'fql.query',
			'query' => 'SELECT uid, first_name, last_name, pic_square, pic_big, sex FROM user WHERE uid = ' . $uid
		);
		$fql_info = $facebook->api($fql_query);
	

На этой странице представлен полный список таблиц, доступ к которым возможен с помощью FQL, а также доступные поля с данными о пользователе.

Расширенные права

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

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

PHP

	$uid = $facebook->getUser();
	# scope is a comma separated list of the permissions needed
	$url = $facebook->getLoginUrl(array(
		'scope' => 'email,user_birthday,status_update,publish_stream,user_photos,user_videos'
	));
	header("Location: {$url} ");

Вы можете ознакомиться с полным списком прав. Обратите внимание, что возможно указать 2 url для возврата обратно на ваш сайт: один - в случае если пользователь предоставит приложению необходимые права, а другой – в обратном случае. Для этого используйте ключи массива next и cansel_url соответственно.

PHP

	$url = $facebook->getLoginUrl(array(
		'scope' => 'email',
		'next' => 'http://localhost.com/thanks.php',
		'cancel_url' => 'http://localhost.com/sorry.php'
	));

Если ничего не указывать, то пользователь будет направлен на страницу, адрес которой указан по умолчанию.

Запрос приложением расширенных прав
Запрос приложением расширенных прав

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

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

PHP

    $uid = $facebook->getUser();
    # users.hasAppPermission
    $api_call = array(
        'method' => 'users.hasAppPermission',
        'uid' => $uid,
        'ext_perm' => 'publish_stream'
    );
    $users_hasapppermission = $facebook->api($api_call);
    print_r($users_hasapppermission);

На данный момент REST API считается устаревшим, поэтому метод users.hasAppPermission поддерживает проверку неполного списка прав.

Публикуем сообщение на «стене» пользователя.

Давайте разместим какую-нибудь запись на «стене» пользователя, предварительно проверим наличие у приложения прав для публикации (publish_stream).

PHP

	# проверим, разрешил ли пользователь писать на его «стене»
		$api_call = array(
			'method' => 'users.hasAppPermission',
			'uid' => $uid,
			'ext_perm' => 'publish_stream'
		);
		$can_post = $facebook->api($api_call);
		if($can_post){
			# post it!
			$facebook->api('/'.$uid.'/feed', 'post', array('message' => 'Привет из моего приложения Facebook!'));
			echo 'Posted!';
		} else {
			die('Вы не обладаете необходимыми правами!');
		}

По сути, мы сделали вызов API /<ID пользователя>/feed методом POST (второй параметр метода facebook::api), передав текст сообщения (третий параметр в методе facebook::api). Третьим параметром (именем ключа массива) может быть не только значение “message”, а также “link”, “picture”, “caption”, “description”.

Приведу пример:

PHP

	$facebook->api('/'.$uid.'/feed', 'post', array(
		'message' => 'The message',
		'name' => 'The name',
		'description' => 'The description',
		'caption' => 'The caption',
		'picture' => 'http://i.imgur.com/yx3q2.png',
		'link' => 'http://net.tutsplus.com/'
	));

Результат:

Публикуем сообщение на стене пользователя
Публикуем сообщение на стене пользователя

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

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

  • Пользователь сможет удалить приложение на странице настроек приложений, нажав на [×] справа от названия приложения.
  • На странице с параметрами приложений пользователь может удалять предоставленные приложению права по отдельности

Заключение

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

Перевод – Земсков Матвей

Оригинал статьи: http://net.tutsplus.com/tutorials/php/how-to-authenticate-your-users-with-facebook-connect/

Уважаемые посетители!

Информация в этой статье устарела и является неактуальной.

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

Прочитано 26387 раз
Добавить комментарий

Комментарии   

 
-1 # Василий 11.02.2014 15:21
Спасибо, отличный перевод, статья очень помогла
Ответить | Ответить с цитатой | Цитировать
 
Мои услуги

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

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

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

Скачать

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