Информация к новости
  • Просмотров: 543
  • Автор: sulicompany
  • Дата: 6-04-2013, 09:58
 (голосов: 0)
6-04-2013, 09:58

Аутентификация через Facebook

Категория: Программирование » PHP


Шаг 1. Регистрация нового приложения

Для того чтобы добавить новое приложение на Facebook, отправляемся на специально подготовленную для этого.

В верхнем правом углу нажимаем на кнопку "+ Создать новое приложение". Далее вписываем название приложения:

Затем вводим проверочный код:

Далее, на странице настроек вашего приложения, отправляемся к блоку "Как ваше приложение встроено в Facebook" и кликаем на пункт "Website with Facebook Login". В открвшемся поле вводим адрес нашего сайта. В моём случае, это http://localhost/facebook-auth:

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

Запишем их в специальные переменные файла index.php:

1 <?php
2 $client_id'578516362116657'// Client ID
3 $client_secret'eb1814bd3980ab9a306dc35073021fb3'// Client secret
4 $redirect_uri''; // Redirect URIs

Шаг 2. Генерация ссылки для аутентификации

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

1 $url'';
2
3 $paramsarray(
4     'client_id'=> $client_id,
5     'redirect_uri'=> $redirect_uri,
6     'response_type'=> 'code',
7     'scope'=> 'email,user_birthday'
8 );

С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:

1 echo$link'<p><a href="'$url'?'. urldecode(http_build_query($params)) . '">Аутентификация через Facebook</a></p>';
2 // ,user_birthday

Итак, ссылка для аутентификации готова. Если мы сформировали все параметры правильным образом и получили верный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/facebook-auth'). Только теперь к этому адресу будет прикреплён специальный параметр code:

1 // Пример. В вашем случае код будет другой
2 http://localhost/facebook-auth/?code=AQD5q80zafjvVZoZex87ROxkCvWT9rZhjwZtkBLajYwH20KztPOI0jpb5lHZisPd3mA49Wu_onAeEioU5K6KVuoCliznf61B5bDfZSLFaIn6E7E49zqs4fO6NjTYyxN43LBttCvsSlirJOAtbOpB3oyMrl3bbjlPhGHsCyJzA-DypEIZ1c_36WAEBPmfSq3TroekvTLme3jIzZk0C-93cu8z#_=_

Шаг 3. Получение токена

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

В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `client_id` - id приложения; `redirect_uri` - страница, на которую будет возвращён пользователь; `client_secret` - секретный ключ; `code` - url параметр, пришедший от Facebook:

01 if(isset($_GET['code'])) {
02     $result= false;
03
04     $paramsarray(
05         'client_id'=> $client_id,
06         'redirect_uri'=> $redirect_uri,
07         'client_secret'=> $client_secret,
08         'code'=> $_GET['code']
09     );
10
11     $url'';
12 }

Далее нам нужно отправить GET запрос на адрес https://graph.facebook.com/oauth/access_token, передав перечисленные параметры. В PHP выполнить GET запрос по какому-то адресу можно несколькими способами. Для данного урока я воспользуюсь функцией file_get_contents. В отличии от других социальных сетей, Facebook присылает ответ не в JSON формате, а в виде строки, где параметры разделены специальными символами. Для того чтобы распарсить данный ответ, воспользуемся функцией parse_str, а результат (в виде массива) запишем в переменную $tokenInfo:

1 $tokenInfo= null;
2 parse_str(file_get_contents($url'?'. http_build_query($params)), $tokenInfo);

В результате, при успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Facebook в JSON формате. Данная строка содержит 4 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе; token_type - тип токена; expires_in - время жизни токена;id_token - id токена:

1 array(2) {
2   ["access_token"]=>
3   string(115)"AAAIOREZCDAnUBAOEmLbNqgHzQSNFoZBBdZC99eNv6DkZA842GUTHP3H7j7YnxEPOZCmZBiPgEZCJCb80zVXDGP9JeX8DGSRi6PU2liZAPQuj9QZDZD"
4   ["expires"]=>
5   string(7) "5177324"
6 }

Шаг 4. Получение информации о пользователе

Далее делаем запрос к Facebook API для получения информации о пользователе. Передавать будем один единственный параметр access_token:

1 if(count($tokenInfo) > 0 && isset($tokenInfo['access_token'])) {
2         $paramsarray('access_token'=> $tokenInfo['access_token']);
3
4         $userInfo= json_decode(file_get_contents('''?'. urldecode(http_build_query($params))), true);
5         if(isset($userInfo['id'])) {
6             $userInfo$userInfo;
7             $result= true;
8         }
9     }

Отправляем GET запрос по адресу https://graph.facebook.com/me.

В результате, если всё было сделано правильно, то получим JSON ответ примерно следующего вида:

001 Array
002 (
003     [id] => 100000317390816
004     [name] => Стас Протасевич
005     [first_name] => Стас
006     [last_name] => Протасевич
007     [birthday] => 07/03/1988
008     [hometown] => Array
009         (
010             [id] => 110228142339670
011             [name] => Chisinau, Moldova
012         )
013
014     [location] => Array
015         (
016             [id] => 110228142339670
017             [name] => Chisinau, Moldova
018         )
019
020     [work] => Array
021         (
022             [0] => Array
023                 (
024                     [employer] => Array
025                         (
026                             [id] => 159295210819421
027                             [name] => Web-Concept
028                         )
029
030                     [location] => Array
031                         (
032                             [id] => 110228142339670
033                             [name] => Chisinau, Moldova
034                         )
035
036                     [position] => Array
037                         (
038                             [id] => 108480125843293
039                             [name] => Web Developer
040                         )
041
042                     [start_date] => 2010-09
043                     [end_date] => 2011-10
044                 )
045
046         )
047
048     [sports] => Array
049         (
050             [0] => Array
051                 (
052                     [id] => 106011416097502
053                     [name] => Ice hockey
054                 )
055
056         )
057
058     [favorite_athletes] => Array
059         (
060             [0] => Array
061                 (
062                     [id] => 202766356426583
063                     [name] => Michael Jordan
064                 )
065
066         )
067
068     [inspirational_people] => Array
069         (
070             [0] => Array
071                 (
072                     [id] => 7170054127
073                     [name] => Hans Zimmer
074                 )
075
076             [1] => Array
077                 (
078                     [id] => 113529011990795
079                     [name] => Steve Jobs
080                 )
081
082             [2] => Array
083                 (
084                     [id] => 225471537469600
085                     [name] => Albert Einstein
086                 )
087         )
088
089     [education] => Array
090         (
091             [0] => Array
092                 (
093                     [school] => Array
094                         (
095                             [id] => 135979339750670
096                             [name] => Лицей Василия Лупу
097                         )
098
099                     [year] => Array
100                         (
101                             [id] => 140617569303679
102                             [name] => 2007
103                         )
104
105                     [type] => High School
106                 )
107
108             [1] => Array
109                 (
110                     [school] => Array
111                         (
112                             [id] => 110260779004118
113                             [name] => State University of Moldova
114                         )
115
116                     [year] => Array
117                         (
118                             [id] => 142963519060927
119                             [name] => 2010
120                         )
121
122                     [concentration] => Array
123                         (
124                             [0] => Array
125                                 (
126                                     [id] => 189014467787633
127                                     [name] => Прикладная информатика
128                                 )
129
130                         )
131
132                     [type] => College
133                 )
134
135             [2] => Array
136                 (
137                     [school] => Array
138                         (
139                             [id] => 110260779004118
140                             [name] => State University of Moldova
141                         )
142
143                     [degree] => Array
144                         (
145                             [id] => 200940416612694
146                             [name] => Магистр
147                         )
148
149                     [year] => Array
150                         (
151                             [id] => 115222815248992
152                             [name] => 2012
153                         )
154
155                     [concentration] => Array
156                         (
157                             [0] => Array
158                                 (
159                                     [id] => 120214931322280
160                                     [name] => сетевые технологии
161                                 )
162
163                         )
164
165                     [type] => Graduate School
166                 )
167
168         )
169
170     [gender] => male
171     [email] => [email protected]il.com
172     [timezone] => 2
173     [locale] => ru_RU
174     [languages] => Array
175         (
176             [0] => Array
177                 (
178