Pull to refresh

Авторизация через ВКонтакте, Mail.ru и другие — 3 (ВКонтакте и OAuth)

Reading time3 min
Views32K
В прошлых двух частях мы сделали авторизацию через ВКонтакте, используя предоставленный ими javascript-виджет и через Майл.ру, используя как JS API, так и через взаимодействие сервер-сервер. Сегодня мы исправим наше упущение относительно ВКонтакте и рассмотрим авторизацию через ВКонтакте без использования клиентских javascript'ов.
В качестве ссылки на авторизацию мы можем использовать любой элемент, например картинку

, оформленную аналогичным образом со ссылкой на авторизацию через mail.ru.
Ссылка у нас будет следующего вида:
api.vkontakte.ru/oauth/authorize?client_id=2445355&scope=&redirect_uri=_REDIRECT_URI_&response_type=code
Механизм работы с Контактом следующий: пользователь переходит по ссылке, передавая Контакту номер нашего приложения, параметры доступа, которые хочет получить наше приложение в параметре scope, URI для перенаправления, как в случае согласия пользователя, так и в случае отказа его предоставить доступ нашему приложению. Параметр response_type=code обязателен в случае с авторизацией через OAuth. Мы хотим получить лишь базовые данные о пользователе и пока не хотим постить на его стену и слать ему сообщения, поэтому параметр scope у нас пустой.

После того как пользователь разрешит нам доступ, его перенаправит на страницу, указанную в параметре redirect_uri в следующем виде:
_http://REDIRECT_URI?code=7a6fa4dff77a228eeda56603b8f
Хотя в документации указан такой пример (с добавлением http://) перед переданным значением, как показывает практика, можно безопасно передавать полные адреса, адрес протокола добавляется только тогда, когда это нужно.
В случае, если пользователь нам откажет (об этом тоже важно помнить), то будет перенаправлен на страницу _http://REDIRECT_URI?error=access_denied&error_reason=user_denied&error_description=User+denied+your+request
Пришедший с ответом параметр code используется для получения ключа доступа (access_token), с помощью которого мы собственно и будем забирать данные о пользователе. Для того чтобы использовать полученный code у нас ровно час.
Для получения access_token можно использовать вот такой код:
$url = "https://api.vkontakte.ru/oauth/access_token?client_id=_APP_ID_&client_secret=_CLIENT_SECRET_&code=" . $_REQUEST['code'];
$response = json_decode(@file_get_contents($url));
if ($response->error) {
  die('Или какая-то другая обработка ошибки');
}


В данном примере _APP_ID_ — номер вашего приложения, а _CLIENT_SECRET_ — секретный ключ, получаем на странице настройки параметров приложения.
В $response->access_token мы получим так необходимый нам ключ доступа, а $response->user_id — номер пользователя в ВКонтакте. В случае каких-либо ошибок $response->error будет не пустым и в $response->error_description будет краткое описание ошибки.
Выполнять запросы к API можно получая как XML ответы, так JSON, получая содержимое страницы api.vkontakte.ru/method/METHOD_NAME.xml?PARAMETERS&access_token=ACCESS_TOKEN для первого случая и api.vkontakte.ru/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN для второго. Для себя я выбрал JSON раз уж взаимодействие с этой социальной сетью им и начинается.
Посмотреть полный список методов API можно на вики-страничке в разделе для разработчиков, их достаточно много, однако нам понадобится лишь getProfiles, возвращающий расширенную информацию о профилях одного или нескольких пользователей.
$arrResponse = json_decode(@file_get_contents("https://api.vkontakte.ru/method/getProfiles?uid={$response->user_id}&access_token={$response->access_token}&fields=photo"))->response;


В массиве $arrResponse мы имеем массив объектов «пользователь», что именно нам будет предоставлено мы указываем в параметре fields (допустимые параметры uid, first_name, last_name, nickname, screen_name, sex, bdate (birthdate), city, country, timezone, photo, photo_medium, photo_big, has_mobile, rate, contacts, education, online, однако некоторые, например uid и first_name приходят и без явного указания). Кроме этого нам доступна гениальная вещь — мы можем указать падеж склонения имени. Этой полезнейшей вещью можно пользоваться на своем сайте, выполняя поиск по имени и получая от Контакта имена в нужном склонении.
Единственное, что нам понадобится из ответа: $response[0]->uid, $response[0]->photo (для аватарки), $response[0]->first_name и $response[0]->last_name, из которых мы склеим отображаемое имя пользователя.
Дальнейший список действий аналогичен первой моей статье: проверяем, есть ли у нас такой пользователь, если есть — обновляем аватарку и имя пользователя, если нет — создаем запись в базе, авторизуем на сайте и переадресовываем на главную страницу.
Tags:
Hubs:
+42
Comments31

Articles

Change theme settings