Для того, чтобы не писать сильно большую статью я сократил код лишь до необходимого минимума. Т.е. никаких проверок, мощных фильтров на ошибки и прочего. Только то, что непосредственно необходимо для авторизации, для понимания происходящего. Так же, статья рассчитана, что вы обладаете хотя-бы базовыми знаниями PHP и HTML. Подробно будут описаны только функции и приёмы которые очень редко встречаются.
Перед тем, как начать, хочу немного объяснить алгоритм.
- Создаём приложение на офф сайте вк
- Получаем его ID
- Делаем на сайте ссылку, в которой отправляем запрос вк-серверу
- Получаем code в ответ
- Делаем ещё один запрос, в котором вставляем ид приложения, защищенный ключ и как раз этот code
- Получаем access_token, нужный для дальнейшего использования API. С этого момента можно считать, что пользователь авторизован. Неверному пользователю токен не дают
- ???
- профит!!!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>'; ?>
Набросал на скорую руку. При каких-то ошибках или вдруг потребуются подробности - пишите в этой теме, отвечу как только смогу.