VK API. Авторизация для сайта

Для того, чтобы не писать сильно большую статью я сократил код лишь до необходимого минимума. Т.е. никаких проверок, мощных фильтров на ошибки и прочего. Только то, что непосредственно необходимо для авторизации, для понимания происходящего. Так же, статья рассчитана, что вы обладаете хотя-бы базовыми знаниями PHP и HTML. Подробно будут описаны только функции и приёмы которые очень редко встречаются.

Перед тем, как начать, хочу немного объяснить алгоритм.


  1. Создаём приложение на офф сайте вк

  2. Получаем его ID

  3. Делаем на сайте ссылку, в которой отправляем запрос вк-серверу

  4. Получаем code в ответ

  5. Делаем ещё один запрос, в котором вставляем ид приложения, защищенный ключ и как раз этот code

  6. Получаем access_token, нужный для дальнейшего использования API. С этого момента можно считать, что пользователь авторизован. Неверному пользователю токен не дают

  7. ???

  8. профит!!!11


Для начала нужно создать "приложение". Это можно сделать вот здесь: https://vk.com/editapp?act=create

Всё просто. Ставим тычинку напротив веб-сайта и заполняем инфу.
Да, серьёзно, локальные хосты (localhost) тоже можно указывать и они работают вполне исправно.

После создания, всё что необходимо, это открыть настройки приложения и скопировать id приложения и защищенный ключ куда-нибудь. Вскоре они нам понадобятся.

Следующим шагом можно приступить к части кода. Я создам новый файл с ссылкой, пускай это будет authreg.php. Так же, я создам другой файл, который будет обрабатывать всё остальное. Назову его auth_vk.php.

Открываем authreg.php. В нём будет лежать просто ссылка.

<?php
    $id_app     = 'ВАШ ID';                             //Айди приложения
    $url_script = 'https://localhost/auth_vk.php'; //ссылка на скрипт auth_vk.php
    ?>
<a href='<?php echo 'https://oauth.vk.com/authorize?client_id='.$id_app.'&redirect_uri='.$url_script.'&response_type=code'; ?>'>Войти через ВК</a></p>

Всё. Этот файл более нам не понадобится.

Откроем auth_vk.php.

В этом примере я сохраню всё авторизационные данные в сессии. Вы же можете сделать иначе.
Первым делом я открою небольшое условие на проверку пришедшего к нам в GET от сервера ВК значения code.
Следом мы отправим серверу ВК пришедшее значение code + защищенный ключ и id приложения чтобы получить access_token, а так же сразу его используем, получив имя и фамилию того, кто у нас нажал на кнопку. Запишем в сессию весь результат и отправим пользователя на другую страницу сайта. На практике я бы порекомендовал доработать этот скрипт и записать нового пользователя в бд и так далее.
[spoiler title='Немного о том, как должны выглядеть запросы к апи вк'] Для того чтобы вызвать метод API ВКонтакте, Вам необходимо осуществить POST или GET запрос по протоколу HTTPS на указанный URL:

https://api.vk.com/method/'''METHOD_NAME'''?'''PARAMETERS'''&access_token='''ACCESS_TOKEN'''

METHOD_NAME – название метода из списка функций API,
PARAMETERS – параметры соответствующего метода API,
ACCESS_TOKEN – ключ доступа, полученный в результате успешной авторизации приложения.

(с) Из официальной документации[/spoiler]

<?php
session_start ();
if  (!empty($_GET ['code']))  {
 $id_app     =     'ИД ПРИЛОЖЕНИЯ' ;                      //Айди приложения
 $secret_app =    'Защищенный ключ';         // Защищённый ключ. Можно узнать там же где и айди
 $url_script   =    'https://localhost/auth_vk.php'; //ссылка на этот скрипт
 $token = json_decode(file_get_contents('https://oauth.vk.com/access_token?client_id='.$id_app.'&client_secret='.$secret_app.'&code='.$_GET['code'].'&redirect_uri='.$url_script), true);
 $fields       = 'first_name,last_name';
 $uinf = json_decode(file_get_contents('https://api.vk.com/method/users.get?uids='.$token['user_id'].'&fields='.$fields.'&access_token='.$token['access_token'].'&v=5.80'), true); 
 $_SESSION['name']         = $uinf['response'][0]['first_name'];
 $_SESSION['name_family']  = $uinf['response'][0]['last_name'];
 $_SESSION['uid']          = $token['user_id'];
 $_SESSION['access_token'] = $token['access_token'];

header("Location: /mypage.php");
    }
?>

Функция file_get_contents здесь используется для того, чтобы получить ответ от GET в php без перезагрузки страницы. Сразу в переменную. Удобно.
Функция json_decode позволяет декодировать JSON-строки.
[spoiler title='Немного о JSON. Для справки.']JSON-строки выглядят примерно вот так:

{"response":[{"cid":1,"name":"Москва"}]}

[/spoiler]

В переменную fields можно добавить ещё другие вещи, которые позволяет использовать данный метод. С именем и фамилией можно получить так же аватарку, онлайн, город, пол и многое другое.
Подробнее про метод users.get: https://vk.com/dev/users.get
Подробнее про параметр fields: https://vk.com/dev/fields

Собственно, всё. Авторизация уже совершена. Тем не менее, для того чтобы удостовериться в том, что всё как надо, предлагаю ещё создать mypage.php, туда мы отправляемся в конце скрипта и для проверки выведем на экран там всё из сессий, что мы получили.
Содержимое mypage.php:

<?php
session_start();
echo 'user id = '.$_SESSION['uid'].'<br>';
echo 'access token = '.$_SESSION['access_token'].'<br>';
echo 'username = '.$_SESSION['name'].'<br>';
echo 'name family = '.$_SESSION['name_family'].'<br>';
?>

Набросал на скорую руку. При каких-то ошибках или вдруг потребуются подробности - пишите в этой теме, отвечу как только смогу.