Доброго времени суток, сегодня речь пойдет об авторизации пользователей на вашем сайте через социальную сеть «Вконтакте». Данный способ авторизации довольно популярен и его любят пользователи, ведь подобное решение избавляет от необходимости заполнять кучу полей формы, придумывать и запоминать пароль, ждать письма, подтверждать авторизацию на сайте. Ну а мы не заморачиваемся с проверками регулярных выражений, экономим место на хостинге и получаем сразу заполненный профиль пользователя с аватаркой, которую, к слову, редко кто спешит добавлять.
Итак, приступим к технический части. Для этого мы создадим и настроим новое приложение в социальной сети. После чего напишем класс, который будет взаимодействовать с API «ВКонтакте»: устанавливать соединение и получать данные о пользователе. В результате проделанных действий, мы сможем авторизовать пользователя у себя на сайте.
Создаём новое приложение «ВКонтакте»
Перед тем, как писать код, нам нужно зарегистрировать новое приложение. Делается это просто, заходим в свой профиль, переходим в раздел приложения и в нем кликаем на кнопку «Управление». В этом разделе вы увидите список всех приложений, которыми вы пользуетесь и кнопку «Создать приложение», жмём по ней. Заполняем название и выбираем пункт «Веб-сайт».
После этого появятся два новых поля, которые также заполняем и жмём «Подключить сайт». В следующем окне вам останется подтвердить регистрацию.
Вот так просто и быстро регистрируется новое приложение «ВКонтакте». Теперь переходим в настройки и копируем ID приложения и защищенный ключ в блокнот. На этом работа с социальной сетью заканчивается.
Пишем класс для работы с API
Перед тем, как написать класс, мы определим его логику, которая будет содержать 3 свойства и 3 метода (включая конструктор).
class VKAuth{
public $settings = array();
public $auth_status = false;
public $user_info = array();
public function __construct($settings){
}
public function auth($code){
}
public function get_link(){
}
}
- settings – отвечает за хранение настроек для подключения к API;
- auth_status – статус аутентификации, если пользователь пройдет, то значение изменяться на true;
- В конструкторе мы будем принимать настройки для подключения, и сохранять в переменную settings;
- auth – метод, который будет производить соединение с API и вытягивать нужные нам данные (принимает код для получения ключа доступа);
- get_link – метод генерирующий путь ссылки для аутентификации.
Теперь давайте рассмотрим каждый из методов подробно:
1. Конструктор:
Как и было раннее оговорено, мы принимаем настройки и сохраняем их в переменную settings. Для надёжности проверяем наличие их при помощи функции isset().
public function __construct($settings){
if(isset($settings["client_id"], $settings["client_secret"], $settings["redirect_uri"])){
$this->settings = $settings;
}
}
2. Auth:
С начала мы проверяем наличие переменных code и settings. Если всё нормально, то формируем первый запрос, который будет состоять из массива данных, обёрнутых в две функции.
- urldecode() – декодирует %## символы в url;
- http_build_query() – генерирует строку запроса.
После того, как мы обратимся по сформированному адресу, нам в ответ придет json строка. Для удобства, получаемые данные мы преобразуем в массив, делается это путем передачи у функции json_decode() второго параметра true. Данный массив будет содержать три ячейки: access_token, expires_in и user_id.
Идём дальше, проверяем наличие токена и формируем новый запрос на получение данных пользователя. В нашей функции мы будем сохранять: id, имя, фамилию и аватарку. Для этого через запятую в ячейку fields поместим строку с параметрами «uid,first_name,last_name,photo_100». Какие ещё данные пользователя можно получить описаны в документации объекта user. Обращаемся по новой ссылке и получаем ответ в виде массива. Проверяем наличие принятых данных и сохраняем их в переменную user_info (принятый массив является многомерным, данные будут храниться в нулевой ячейке response), а так же значение auth_status меняем на true и возвращаем true.
public function auth($code){
if($code && $this->settings){
$query = urldecode(http_build_query(array(
"client_id" => $this->settings["client_id"],
"client_secret" => $this->settings["client_secret"],
"code" => $code,
"redirect_uri" => $this->settings["redirect_uri"]
)));
$token = json_decode(file_get_contents("https://oauth.vk.com/access_token?".$query), true);
if(isset($token["access_token"])){
$query = urldecode(http_build_query(array(
"uids" => $token["user_id"],
"fields" => "uid,first_name,last_name,photo_100",
"access_token" => $token["access_token"]
)));
$this->user_info = json_decode(file_get_contents("https://api.vk.com/method/users.get?".$query), true);
if(isset($this->user_info["response"][0]["uid"])){
$this->user_info = $this->user_info["response"][0];
$this->auth_status = true;
return true;
}
}
}
return false;
}
3. Get Link:
Первым делом проверяем наличие настроек, а далее формируем путь для ссылки. Функции, которые используются, описаны выше. Когда пользователь нажмёт на ссылку с этим путём, то его перебросит на страницу c параметром code в адресной строке – код для получения токена.
public function get_link(){
if($this->settings){
$query = urldecode(http_build_query(array(
"client_id" => $this->settings["client_id"],
"redirect_uri" => $this->settings["redirect_uri"],
"response_type" => "code"
)));
return "https://oauth.vk.com/authorize?".$query;
}
return false;
}
Простая авторизация
На этом этапе – всё довольно рационально. После того как вы подключите класс к файлу, останется получить экземпляр VKAuth, передав ему настройки. Ниже описываем простой обработчик, который отлавливает переменную $_GET[code] и проверяем аутентификацию.
require_once("VKAuth.php");
$vk = new VKAuth(array(
"client_id" => "ID_приложения",
"client_secret" => "защищенный_ключ",
"redirect_uri" => "адрес_сайта"
));
if(isset($_GET["code"])){
if($vk->auth($_GET["code"])){
// Делаем свои дела
}
}
Далее, чтобы произвести авторизацию, вам нужно будет проверить наличие пользователя у себя в базе данных и, если его нет, то добавить. В противном случае обновить его данные (перед обновлением желательно проверить - изменились ли они). Касательно базы данных обычно добавляют два поля: тип авторизации и id пользователя в социальной сети. Вот так осуществляется аутентификация и авторизация через социальную сеть «ВКонтакте».
В архиве вы найдёте готовый пример работы с классом VKAuth, где выводятся данные пользователя.