Серверная авторизация с помощью vkontakte

Для проекта нужно было разработать модуль авторизации с vkontakte.ru. После курения мануалов получилось очень даже неплохо. И так как увидел в блоге отминусованую статью (сабж), то решил написать самому.

Помолясь приступим smile

Шаг 1.
Создание приложения на сайте vk.com с последующей настройкой. Она несложная, нужно всего лишь прописать адрес сайта и базовый домен. Там же получаем защитный ключ и id приложения, которые будем использовать дальше.

Шаг 2.
На странице, на которой вы разместили кнопку авторизации(или ссылку, как в нашем примере), делаем так, чтобы при нажатии на нее нас перекинуло по адресу
http: //api.vk.com/oauth/authorize?client_id=ID&redirect_uri=REDIRECT&display=MODE
. Где ID - айди нашего приложения, REDIRECT - адрес скрипта - обработчика, MODE - режим отображения окна авторизации(page – форма авторизации в отдельном окне, popup – всплывающее окно, touch – авторизация для мобильных Touch-устройств , wap – авторизация для мобильных устройств с маленьким экраном или без поддержки Javascript). Это можно реализовать несколькими способами, но я напишу как делал сам.
<?php

$ID = ""; //наш Id приложения
$REDIRECT = ""; // адрес обработчика
echo "
<script>
function authVk(){
location.href = 'http://api.vk.com/oauth/authorize?client_id=".$ID."&redirect_uri=".$REDIRECT."&display=page';
}
</script>
<a href=\"#\" onclick=\"authVk();\" >Вконтакте</a>";
?>

Теперь нас при нажатии на ссылку переадресовывает туда куда нужно.

Шаг 3.

Создадим сам скрипт - обработчик, который будет работать непосредственно с пользователем, его данными и выполнять авторизацию.
<?php

$SECRET = ""; // секретный код, полученный в панели управления приложением на vkontakte
if ($code = $_GET['code']){
if($curl = curl_init()){
$St = 'https://api.vk.com/oauth/token?client_id='.$ID.'&code='.$code.'&client_secret='.$SECRET;
curl_setopt($curl,CURLOPT_URL,$St);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // только так можно "обуть" защищенный режим с помощью cUrl*a
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // только так можно "обуть" защищенный режим с помощью cUrl*a
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);

$stream = curl_exec($curl);
$data = json_decode($stream);

if($data->access_token){
$token = $data->access_token;
$userId = $data->user_id;                         // Id пользователя который авторизовался
}

if($curl = curl_init()){
$url = 'https://api.vkontakte.ru/method/getProfiles?uids='.$userId.'&fields=photo_big,sex,bdate,screen_name&access_token='.$token; // теперь можно воспользоваться методом getPrifiles, где параметр fields принимает значение всех необходимых вам от пользователя данных. 
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$stream = curl_exec($curl);
$data1 = json_decode($stream);
$first_name = $data1->response[0]->first_name;    // получаем фамилию пользователя
$last_name = $data1->response[0]->last_name;      // получаем имя пользователя
$photo = $data1->response[0]->photo_big;          // получаем авку пользователя
$sex = $data1->response[0]->sex;                  // получаем пол пользователя
$bdate = $data1->response[0]->bdate;              // получаем дату рождения пользователя
$login = $data1->response[0]->screen_name;        // получаем логин пользователя
$first_name = iconv('UTF-8', 'windows-1251', $first_name);
$last_name = iconv('UTF-8', 'windows-1251', $last_name);
}
}
}
?>
Для лучшего закрепления информации о методе getProfiles, процитирую оф. документацию.

Возвращает информацию о пользователях в виде набора массива объектов, каждый из которых может иметь поля uid, first_name, last_name, nickname, sex, bdate (birthdate), city, country, timezone, photo, photo_medium, photo_big, photo_rec.
Если в параметре fields было указано поле contacts, то будут доступны также поля: home_phone, mobile_phone.
Если в параметре fields было указано поле education, то будут доступны также поля: university, university_name, faculty, faculty_name, graduation.
Если в параметре fields было указано поле counters, а в параметре uids задан только один идентификатор, то будет доступно поле counters в котором будет находится объект со счетчиками различных объектов у пользователя.
Значения uid, first_name и last_name возвращаются всегда, вне зависимости от выбранных полей и их количества.

Вот как-бы и все) И да, не забываем, что в настройках приложения нужно будет указать в форме "Адрес сайта" путь к обработчику, то есть site.ru/auth.php, к примеру.

URL: https://visavi.net/articles/418