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

- Переадресовать посетителя, указав client_id, полученный на предыдущем шаге, и redirect_uri, по адресу:
1 2 3
https://graph.facebook.com/oauth/authorize? client_id=...& redirect_uri=http://yourdomain.com
Где ему будет предложено ввести логин и пароль.
- В случае успешной авторизации 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=...
- Далее используем 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()).



