Авторизация через вконтакте api.
Авторизация через вконтакте, и другие — 3 (вконтакте и oauth)
В
прошлыхдвух
частях мы сделали авторизацию через ВКонтакте, используя предоставленный ими 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, из которых мы склеим отображаемое имя пользователя.
Дальнейший список действий аналогичен
первой моей статье
: проверяем, есть ли у нас такой пользователь, если есть — обновляем аватарку и имя пользователя, если нет — создаем запись в базе, авторизуем на сайте и переадресовываем на главную страницу.
Важно:
Также очень важное значение v, без него вообще не чего работать не будит, он указывает версию API.
Как быть?
Токен, полученный на клиентом, мы не можем использовать на сервере, и соответственно не можем запросить информацию о пользователе со стороны сервера, но мы можем проверить токен на валидность и узнать ид пользователя которому принадлежит данный токен.
С документации мы можем узнать что Параметр sig равен md5 от конкатенации следующих строк:
Давайте получим информацию о пользователе через open api, передадим её на сервер, проверим токен, и если все ок запишем в базу:
Настройка ссылки для входа
Первым делом сформируем ссылку используя которую пользователь нашего сайта сможет дать необходимые разрешения, на запрошенные нашим сайтом действия, например доступ к контактам.
Получение данных из вконтакте
И так, пропишем скрипт получения данных от vk по только что присланному code.
Проблема 1
Полученный токен(sig) привязывается к ip-адресу, и при попытке использовать его на сервере вам выдаст ошибку:
Проблема 2
При таком способе авторизации нет возможности получить email пользователя, даже если вы запросите нужные права и пользователь даст согласие — вы не получите email в ответе.
Проверка авторизации
Давайте создадим модель, которая будет содержать информацию о пользователе:
Регистрация приложения
В первую очередь создайте приложение на странице
Вывод:
В этой статье мы разобрали как делается авторизация во ВКонтакте на языке программирования PHP, также, если вам что то не понятно, то посмотрите эти две раздела из документации ВК.