Авторизация на сайте через Facebook

Инструкция, как получить данные пользователя Facebook через авторизацию OAuth.

На странице https://developers.facebook.com/apps/ нужно создать приложение.

Указываем название приложения и контактный e-mail:

Чтобы включить приложение, нужно перейти в основные настройки и указать URL-адрес политики конфиденциальности и категорию.

Включаем приложение:

Статус - опубликовано

Создадим PHP-скрипт, который будет обрабатывать ответы от Facebook, к примеру https://example.com/login-facebook.php

Этот URL нужно добавить в список «Действительных URI перенаправления для OAuth» в настройках входа через Facebook.

Вход через Facebook - Настройки

После этого можно сформировать ссылку для входа:

https://www.facebook.com/dialog/oauth?client_id=Идентификатор_приложения&redirect_uri=https://example.com/login-facebook.php&scope=email&response_type=code

В URL можно добавить параметр «state» для передачи своих данных.

$params = array(
	'client_id'     => 'Идентификатор приложения',
	'redirect_uri'  => 'https://example.com/login-facebook.php',
	'scope'         => 'email',
	'response_type' => 'code',
	'state'         => '123'
);
 
$url = 'https://www.facebook.com/dialog/oauth?' . urldecode(http_build_query($params));
echo '<a href="' . $url . '">Войти через Facebook</a>';
PHP

Кликнув по ссылке, пользователь переходит на страницу с диалогом:

После того, как пользователь подтвердил запрос, он будет перенаправлен на redirect_uri с добавлением кода в GET-параметре.

В скрипте, полученный код отправляется запросом получения access_token и по нему метод https://graph.facebook.com/me возвращает id, имя, фамилию, e-mail и фото пользователя (полный список полей на https://developers.facebook.com/docs/graph-api/reference/user).

<?php
if (!empty($_GET['code'])) {
	// var_dump($_GET['state']);

	$params = array(
		'client_id'     => 'Идентификатор приложения',
		'client_secret' => 'Секрет приложения',
		'redirect_uri'  => 'https://example.com/login-facebook.php',
		'code'          => $_GET['code']
	);
	
	// Получение access_token
	$data = file_get_contents('https://graph.facebook.com/oauth/access_token?' . urldecode(http_build_query($params)));
	$data = json_decode($data, true);

	if (!empty($data['access_token'])) {
		$params = array(
			'access_token' => $data['access_token'],
			'fields'       => 'id,email,first_name,last_name,picture'
		);

		// Получение данных пользователя
		$info = file_get_contents('https://graph.facebook.com/me?' . urldecode(http_build_query($params)));
		$info = json_decode($info, true);

		var_dump($info);
	}		
}
PHP

Результат:

array(
	'id' => '123456789',
    'email' => 'mail@example.com',
    'first_name' => 'Иван',
    'last_name' => 'Иванов', 
    'picture' => array(
    	'data' => (
        	'height' => 50,
            'is_silhouette' => true,
           	'url' => 'https://platform-lookaside.fbsbx.com/platform/profilepic/?asid=123456', 
            'width' => 50
		}
	} 
}

После успешной авторизации Facebook добавляет #_=_ к адресу возврата.

#_=_ в URL

Сделано это специально, поскольку некоторые браузеры, при редиректе переносят хеш из URL-адреса в новый URL. Такой хеш можно удалить:

if (window.location.hash === "#_=_"){
	history.replaceState 
		? history.replaceState(null, null, window.location.href.split("#")[0])
		: window.location.hash = "";
}
JS
01.11.2019, обновлено 09.01.2021
16668

Комментарии

, чтобы добавить комментарий.

Другие публикации

Вход через Google
Сервис «Google Аккаунты» позволяет через протокол OAuth 2.0 реализовать авторизацию пользователя на своем сайте. После прохождения авторизации можно получить имя, фамилию, e-mail и юзерпик...
24234
+18
Авторизация на сайте через Яндекс
Сервис Яндекс.Паспорт позволяет через API реализовать авторизацию пользователя на своем сайте. После разрешения доступа...
9586
+8
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
41426
+15
Публикация записей на стену сообщества VK
Для начала вы должны быть авторизированы в VK и являться администратором группы или страницы. Далее нужно создать...
21980
+4
Работа с API Instagram
В статье описана регистрация клиента, получения access token, примеры использования методов API Instagram на PHP.
21921
+3
Интеграция с платежной системой PayKeeper в PHP
Платежная платформа PayKeeper позволяет принимать оплату заказов по ссылке, используя данный метод можно с легкостью...
4955
0