Как получить email пользователя при авторизации через Вконтакте
Недавно занимался кнопками авторизации пользователей на сайте через социальные сети. И первым делом принялся изучать материалы про создание авторизации на сайтах с помощью социальной сети Вконтакте.
Основной материал, который был использован при написании функции и класса авторизации был взят с сайта webformyself.com из статьи Авторизация через социальные сети: ВКонтакте.
По ходу работы понял, что такой информации в Инете не много. И многие веб-программисты ищут ответ на вопрос: "Как получить email пользователя при авторизации через Вконтакте?" Научился сам - и возникла идея поледиться этим отличным материалом с другими. Поэтому далее в этой статье по шагам опишу процесс авторизации и получения данных пользователя Вконтакте на своём сайте.
Итак, для создания авторизации на сайте через Вконтакте необходимо:
Шаг 1. Авторизоваться Вконтакте и зайти в раздел "Разработчикам", далее перейти по ссылке "Создать приложение".
Шаг 2. Заполнить все необходимые поля формы, нажать кнопку "Подключить сайт".
Шаг 3. Зайти в настройки приложения и получить ID и защищённый ключ.
Далее сделать всё аналогично тому, как рассказано в статье "Авторизация через социальные сети Вконтакте", а именно:
Шаг 4. В индексном файле создать ссылку-изображение на авторизацию через социальную сеть Вконтакте:
Вот её код:
<div id="social_authorization"><a href="vkauth.php" target="_self" title="Авторизация через Вконтакте"><img src="images/templates/all/vk.png" width="24px" height="24px" border="0px" alt="Авторизация через Вконтакте" title="Авторизация через Вконтакте"></a></div>
Шаг 5. Добавить константы:
// ID приложения define("APP_ID",'{идентификатор приложения}'); // Защищённый ключ define("APP_SECRET",'{Защищённый ключ}'); // Адрес до файла авторизации через Вконтакте define("REDIRECT_URI",'http://rolar.ru/vkauth.php'); // Адрес для авторизации define("URL_AUTH",'http://oauth.vk.com/authorize'); // Страница для получения Токена define("URL_ACCESS_TOKEN",'https://oauth.vk.com/access_token'); // Адрес для работы с методом users.get и получения данных define("URL_GET_USER",'https://api.vk.com/method/users.get');
Шаг 6. Прописать класс vkauthorization
class vkauthorization { private $code; private $token; private $uid; private $email; public function set_code($code) { $this->code = $code; } public function set_token($token) { $this->token = $token; } public function set_uid($id) { $this->uid = $id; } public function set_email($email) { $this->email = $email; } public function get_token() { } public function get_vkuser() { } }
и подключить его в контроллере:
// подключение класса для авторизации через Вконтакте require_once 'vkauthorization.php'; $o = new vkauthorization(); if(!$_GET['code']) { $query = "client_id=".APP_ID."&scope=email,offline&redirect_uri=".REDIRECT_URI."&response_type=code"; redirect(URL_AUTH."?".$query); } if($_GET['code']) { // echo $_GET['code']; $o->set_code($_GET['code']); // получение токена $res = $o->get_token(); if($res) { // получение данных пользователя $o->get_vkuser(); } else { exit($_SESSION['vkauth']['error']); } } if($_GET['error']) { exit($_GET['error_description']); }
Функция redirect() была описана в контроллере и почти не отличается от той, что приводится в статье "Авторизация через социальные сети Вконтакте". Поэтому далее объясню, как всё это работает.
Пользователь, нажимая по ссылке авторизации, перенаправляется на страницу авторизации Вконтакте (http://oauth.vk.com/authorize) со следующими параметрами:
- client_id – ID созданного приложения Вконтакте,
- scope=email,offline – права доступа приложения, где:
- email – доступ к email пользователя (то, что нам и нужно),
- offline – доступ к API в любое время со стороннего сервера (при использовании этой опции параметр expires_in, возвращаемый вместе с access_token, содержит 0 – токен бессрочный),
- redirect_uri – адрес перенаправления, на который будет отправлен параметр code. Как правило, это тот же файл с которого происходит запрос на авторизацию. В моем случае это http://rolar.ru/vkauth.php,
- response_type – ответ от сервера, который возвращается в файл vkauth.php, может быть либо code (в нашем случае), либо token (не рассматривается).
Если пользователь зашёл на файл vkauth.php в первый раз и у нас ещё нет параметра code, тогда наш php-скрипт перенаправляет его по такому адресу:
После успешного перехода сервер Вконтакте возвращает нам параметр code. Более детально процесс авторизации на сайте описан в документации.
Шаг 7. Когда в GET-запросе есть параметр code, то нужно получить access_token, используя функцию get_token():
// получение токена $res = $o->get_token();
ниже приведён её код:
public function get_token() { if(!$this->code) { exit("Не верный код авторизации"); } // открытие соединения с библиотекой url $ku = curl_init(); $query = "client_id=".APP_ID."&client_secret=".APP_SECRET."&code=".$this->code."&redirect_uri=".REDIRECT_URI; curl_setopt($ku,CURLOPT_URL,URL_ACCESS_TOKEN."?".$query); curl_setopt($ku,CURLOPT_RETURNTRANSFER,TRUE); $result = curl_exec($ku); curl_close($ku); //var_dump($result); $ob = json_decode($result); //var_dump($ob); if($ob->access_token) { $this->set_token($ob->access_token); $this->set_uid($ob->user_id); // Получение email пользователя и сохранение его в массив $_SESSION['vkauth'] $this->set_email($ob->email); $_SESSION['vkauth']['email'] = $ob->email; return TRUE; } elseif($ob->error) { $_SESSION['vkauth']['error'] = "Ошибка при получении токена"; return FALSE; } }
В данной функции для получения токена перенаправление будет осуществлено по адресу:
Если переход прошёл успешно и данные отправлены верно, то сервер возвращает access_token и ещё другие параметры (в том числе и email) в формате JSON:
Вот что написано в документации (п. 4):
В результате выполнения данного запроса Ваш сервер получит вновь созданный access_token. Вместе с access_token серверу возвращается время жизни ключа expires_in в секундах.
Также сервер передаёт email пользователя, если приложение является сайтом, были запрошены соответствующие права, а также у пользователя есть email, и он разрешил доступ к нему. Процедуру авторизации приложения необходимо повторять в случае истечения срока действия access_token, смены пользователем своего логина или пароля или удаления приложения из настроек.
Как потом прочитал на одном из блогов в комментариях пользователя:
Мыло ВК отдается вместе с токеном, а не при запросе информации о юзере.
Далее функция get_token() сохраняет полученные данные (access_token, user_id и email) в специальный массив $_SESSION['vkauth'], который в дальнейшем и будет хранить остальные данные пользователя.
Шаг 8. Далее нужно получить остальные данные пользователя через функцию get_vkuser():
// получение данных пользователя $o->get_vkuser();
Ниже приведён код данной функции:
public function get_vkuser() { if(!$this->token) { exit("Неверный токен"); } if(!$this->uid) { exit("Неверный идентификатор пользователя"); } $query = "user_ids=".$this->uid."&fields=first_name,last_name,nickname,screen_name,timezone,photo_100,site&name_case=nom&access_token=".$this->token; //echo $query; $kur = curl_init(); curl_setopt($kur, CURLOPT_URL, URL_GET_USER."?".$query); // для отмены проверки ssl-сертификата curl_setopt($kur, CURLOPT_SSL_VERIFYPEER, false); // для отмены проверки ssl-сертификата curl_setopt($kur, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($kur,CURLOPT_RETURNTRANSFER,TRUE); $result2 = curl_exec($kur); // var_dump($result2); //exit(); curl_close($kur); $vk_user = json_decode($result2); // сохранение данных пользователя в массив $_SESSION['vkauth'] // $_SESSION['vkauth'][1] = $vk_user->response[0]; $_SESSION['vkauth']['uid'] = $vk_user->response[0]->uid; $_SESSION['vkauth']['first_name'] = $vk_user->response[0]->first_name; $_SESSION['vkauth']['last_name'] = $vk_user->response[0]->last_name; $_SESSION['vkauth']['nickname'] = $vk_user->response[0]->nickname; $_SESSION['vkauth']['screen_name'] = $vk_user->response[0]->screen_name; $_SESSION['vkauth']['photo_100'] = $vk_user->response[0]->photo_100; $_SESSION['vkauth']['site'] = $vk_user->response[0]->site; // unset($_SESSION['vkauth']); // переадресация на главную сраницу сайта redirect(DOMEN); }
Данная функция снова отправляет запрос на сервер Вконтакте, уже с токеном:
Дополнительные параметры fields:
- first_name - имя пользователя,
- last_name - фамилия пользователя,
- nickname - никнейм (отчество) пользователя,
- screen_name - короткое имя (поддомен) страницы пользователя, например, id684384,
- timezone - временная зона пользователя. Возвращается только при запросе информации о текущем пользователе, число integer,
- photo_100 - url квадратной фотографии пользователя, имеющей ширину 100 пикселей. В случае отсутствия у пользователя фотографии возвращается следующий адрес картинки http://vk.com/images/camera_b.gif,
- site - возвращает указанный в профиле сайт пользователя.
Метод users.get - позволяет получать данные пользователя. Его описание и параметры (user_ids, fields, name_case), которые он принимает указаны в документации.
При успешном выполнении функции в массив $_SESSION['vkauth'] сохраняются все необходимые данные пользователя и происходит перенаправление на главную страницу сайта.
Поделись со своими друзьями в социальных сетях!
- Бесплатный видеокурс по основам HTML от Евгения Попова на ЯндексДиск
- Payeer - платёжная система
- Скрипт "Магнит для подписчика" + видео по установке
- "Продуктовая инфомаркетинга" - бесплатный марафон Азамата Ушанова
- WaspAce - сервис интернет автоматизации
- JuctClick - сервис автоматизации инфобизнеса “под ключ”
- Создание шаблона на Joomla (justclick)
- Free Avalanche - лавина бесплатного трафика
- Формула струйных оргазмов от Алекса Мэя
- Официальный русскоязычный сайт Алекса Мэя, профессионального тренера-сексолога из Голландии