Может ли одна идея изменить мир?

Как получить email пользователя при авторизации через Вконтакте

Как получить 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_tokenuser_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'] сохраняются все необходимые данные пользователя и происходит перенаправление на главную страницу сайта.


Понравился материал?
Поделись со своими друзьями в социальных сетях!


Комментарии:
Имя
Имя 22 ноября 2015, 22:28:08
У них не рабочий исходник... Поэтому не понять где ошибка
Оставить комментарий
Ваш e-mail необходим только для связи с Вами и не публикуется на сайте
Введите сумму чисел с картинки = 
* Звёздочкой помечены обязательные поля для заполнения
Вход
Вы вошли на сайт, как Гость


Внешний вид сайта

Какой вид сайта Вы предпочитаете?



Telegram
Подпишись на Telegram-канал, чтобы первым узнать все новости сайта:
Подпишись на Telegram-канал, чтобы первым узнать все новости сайта
Рассылка
Подпишитесь на рассылку наших новостей, чтобы всегда быть в курсе последних обновлений!


* Звёздочкой помечены обязательные поля для заполнения
Ваши данные никому не передаются. Вы можете отписаться от рассылки новостей в любой момент.
Статистика
Сейчас на сайте:
Cтатей: 136
Партнёрских продуктов: 179
Файлов: 93
Секретных материалов: 144
Обучающих курсов: 295
Товаров: 6
Галерей: 2
Альбомов: 1
Категорий: 32
Партнёров: 16
Заметок: 27
Комментариев: 16
Мудрых фраз: 146
Страниц: 6
Пользователей: 106
Подписчиков: 165
Посетителей на сайте: 1
Реклама
Группа Вконтакте
Группа Facebook
 Наверх