OAuth 2.0 аутентификация приложений в Facebook

Используемый Facebook протокол OAuth версии 2.0 позволяет за счет SSL упростить схему аутентификации пользователя. Суть сводится к получению маркера доступа (access token) и дальнейшей отсылке ее обратно во всех последующих информационных запросах. Чтобы получить access token необходимо выполнить следующие действия:

  1. Зарегистрировать приложение и получить Application ID (client_id) и Application Secret (client_secret)Facebook настройка приложения
  2. Переадресовать посетителя, указав client_id, полученный на предыдущем шаге, и redirect_uri, по адресу:
    1
    2
    3
    
    https://graph.facebook.com/oauth/authorize?
    client_id=...&
    redirect_uri=http://yourdomain.com

    Где ему будет предложено ввести логин и пароль.

  3. В случае успешной авторизации facebook перенаправит пользователя по адресу указанному в redirect_uri с параметром $_GET['code'], который меняется на access token следующим запросом:
    1
    2
    3
    4
    5
    
    https://graph.facebook.com/oauth/access_token?
    client_id=...&
    redirect_uri=http://youdomain.com/oauth_redirect&
    client_secret=...&
    code=...
  4. Далее используем access token во всех запросах:
    1
    2
    3
    
    https://api.facebook.com/method/stream.publish?
    message=Hello&
    access_token=...

Пример oauth 2.0 аутентификации в facebook:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
session_start();
 
require_once('facebookoauth.php');
 
//Параметры получаемые при регистрации приложения
$facebook_client_id = ''; //заполнить значение!!!
$facebook_client_secret = ''; //заполнить значение!!!
 
$oauth = new FacebookOAuth($facebook_client_id,$facebook_client_secret);
 
if (empty($_SESSION["access_token"]))
{
$callbackUrl = "http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."?facebook_callback";
 
//Получаем "code"
if(isset($_GET['facebook_connect']))	
	{
	$request_link = $oauth->getCodeUrl(urlencode($callbackUrl));
	header('Location: '.$request_link);
	}
 
//Получаем "access_token" и сохр. в сессионной переменной
elseif ( isset($_GET['facebook_callback']) && isset($_GET['code']) )
	{
	$_SESSION["access_token"] = $oauth->getAccessToken(urlencode($callbackUrl),$_GET['code'],$callbackUrl);
	}
}
//Если "access_token" получен, выполняем запросы к facebook
else
{
//Функция получения списка страниц пользователя
$res=$oauth->pagesGetInfo($_SESSION["access_token"]);
echo($res);
$res=$oauth->streamPublish("Hello",$_SESSION["access_token"]);
echo($res);
}
?>

В этом примере используется класс FacebookOAuth и его методы: getCodeUrl() – формирование урла (см. п.2), getAccessToken() – получение access token (см. п.3), pagesGetInfo() – получение информации о существующих страницах пользователя (см. п.4), streamPublish() – публикация сообщения на стене или странице пользователя (см. п.4)

А вот и сам класс FacebookOAuth:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
class FacebookOAuth
{
var $auth_base_url = "https://graph.facebook.com";
var $api_base_url = "https://api.facebook.com";
 
var $client_id;
var $client_secret;
var $redirect_uri;
 
function __construct($client_id,$client_secret)
	{
	$this->client_id 	= $client_id;
	$this->client_secret 	= $client_secret;
	}
 
function makeRequest ($url, $callbackurl="")
	{
	$ch = curl_init();
 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_REFERER, $callbackurl);
	curl_setopt($ch, CURLOPT_HEADER, 0); 
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
 
	curl_setopt($ch, CURLOPT_URL, $url);
 
	$result = curl_exec($ch);
	if (empty($result)) 
		{
		die(curl_error($ch));
		curl_close($ch);
		}
 
	curl_close($ch);
	return $result;
	}
 
function getCodeUrl($redirect_uri)
	{
	return $this->auth_base_url."/oauth/authorize?client_id=".$this->client_id."&redirect_uri=".$redirect_uri."&scope=offline_access,publish_stream&display=popup";
	}    
 
function getAccessToken($redirect_uri,$code,$callbackurl)
	{
	$res = $this->makeRequest($this->auth_base_url."/oauth/access_token?client_id=".$this->client_id."&redirect_uri=".$redirect_uri."&client_secret=".$this->client_secret."&code=".$code, $callbackurl);
	$st = "=";
	$pos = strpos($res,$st);
	$res = substr($res,$pos+1);
 
	return $res;
	}
 
function streamPublish($msg,$access_token)
	{
	if (empty($access_token)) {return false;}
	$res = $this->makeRequest($this->api_base_url."/method/stream.publish?message=".urlencode($msg)."&access_token=".$access_token);
 
	preg_match_all("/<stream_publish_response[^>]*>(.*?)<\/stream_publish_response>/si",$res,$matches, PREG_PATTERN_ORDER);
 
 
	if (!empty($matches) && !empty($matches[1][0]))	
		{	
		//return post id
		return $matches[1][0];
		}
	else
		{
		return false;
		}
	}
 
function pagesGetInfo($access_token)
	{
	if (empty($access_token)) {return false;}
	$res = $this->makeRequest($this->api_base_url."/method/pages.getinfo?access_token=".$access_token."&fields=page_id,name,page_url");
 
	return $res;
	}
} 
?>

P.S. По умолчанию access token выдается на определенное время, по завершению которого пользователю придется вновь авторизоваться. Чтобы этого избежать необходимо на шаге переадресации (см. п.2) дополнительно в урле передать параметр offline_access (см. метод getCodeUrl()).

Authentication Facebook Developers
Скачать пример

  1. Нет комментариев