Как получить 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",'https://rolar.ru/vkauth.php');
// Адрес для авторизации
define("URL_AUTH",'https://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() была описана в контроллере и почти не отличается от той, что приводится в статье "Авторизация через социальные сети Вконтакте". Поэтому далее объясню, как всё это работает.
Пользователь, нажимая по ссылке авторизации, перенаправляется на страницу авторизации Вконтакте (https://oauth.vk.com/authorize) со следующими параметрами:
- client_id – ID созданного приложения Вконтакте,
- scope=email,offline – права доступа приложения, где:
- email – доступ к email пользователя (то, что нам и нужно),
- offline – доступ к API в любое время со стороннего сервера (при использовании этой опции параметр expires_in, возвращаемый вместе с access_token, содержит 0 – токен бессрочный),
- redirect_uri – адрес перенаправления, на который будет отправлен параметр code. Как правило, это тот же файл с которого происходит запрос на авторизацию. В моем случае это https://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 пикселей. В случае отсутствия у пользователя фотографии возвращается следующий адрес картинки https://vk.com/images/camera_b.gif,
- site - возвращает указанный в профиле сайт пользователя.
Метод users.get - позволяет получать данные пользователя. Его описание и параметры (user_ids, fields, name_case), которые он принимает указаны в документации.
При успешном выполнении функции в массив $_SESSION['vkauth'] сохраняются все необходимые данные пользователя и происходит перенаправление на главную страницу сайта.
Поделись со своими друзьями в социальных сетях!
- Регистрация в партнёрской программе Алекса Мэя
- SpryPay - Интернет-платежи
- Sociate.ru - биржа рекламы в группах Контакта и постинг по расписанию
- Как продлить половой акт
- CakePHP - мощь и гибкость современного PHP-фреймворка (justclick)
- Практика монетизации блога: от раскрутки до реальных денег (подписная страница)
- WaspAce - сервис интернет автоматизации
- Бесплатный видеокурс по созданию профессионального интернет-магазина
- Бесплатный миникурс по созданию сайта на Wordpress
- 5 техник резиновой верстки. Получи 5 уроков совершенно бесплатно прямо сейчас!



