Авторизація через соціальні мережі: ВКонтакте

19

Від автора: у даному уроці ми з Вами поговоримо про авторизацію користувачів на сайті. Але мова піде не про класичну авторизації, а авторизації з використанням ресурсів соціальної мережі ВКонтакте. У даний момент соціальні мережі користуються величезною популярністю серед користувачів Інтернету і іноді дуже зручно використовувати у себе на сайті для авторизації безпосередньо інформацію додану користувачем в соціальну мережу.

Авторизація через соціальні мережі: ВКонтактеАвторизація через соціальні мережі: ВКонтакте

Введення

Для авторизації через соціальну мережу ВКонтакте, використовується відкритий протокол OAuth 2.0. OAuth — це відкритий протокол авторизації, який дозволяє отримати Вам – розробникам доступ до ресурсів користувача зберігаються наприклад в соціальній мережі ВКонтакте. При цьому користувачеві не потрібно повідомляти Вам свій логін і пароль для доступу до його даних.

Дана система авторизації працює наступним чином. Для початку користувач повинен пройти авторизацію в соціальній мережі, для цього зі свого сайту Ви перенаправляти його на певну адресу соціальної мережі (про який ми ще поговоримо). Потім після успішної авторизації — Вконтаке, назад перенаправляє користувача на Ваш сайт, при цьому Вам буде переданий спеціальний код, який необхідний для отримання даних користувача і свідчить про успішну авторизацію.

Тепер, так як ми будемо працювати безпосередньо з соціальною мережею, наш скрипт повинен розташовуватися на реальному сервері. Так як проходитиме постійний обмін даними між нашим скриптом і сервісом ВКонтакте. При цьому на локальному комп’ютері (наприклад Denwer) скрипт працювати не буде.

Для зручності роботи з віддаленим сервером, ми будемо використовувати текстовий редактор Notepad++, який містить вбудований плагін по роботі з протоколом FTP. Використовуючи який, ми можемо відкривати і редагувати файли скрипта безпосередньо на віддаленому сервері. Для цього запускаємо текстовий редактор відкриваємо меню Plugins, далі NppFTP і активуємо Show NppFTP Window. При цьому буде відкрито вікно огляду файлів і папок віддалених серверів. У даному вікні необхідно відкрити налаштування (кнопка Settings), а саме налаштування профілю (Profile Settings) і додати новий профіль для з’єднання з ftp сервером (при цьому необхідно вказати налаштування підключення).

Авторизація через соціальні мережі: ВКонтакте

Потім, клацнувши по кнопці Connect виконуємо з’єднання через FTP:

Авторизація через соціальні мережі: ВКонтакте

Для додавання нових файлів, досить правою кнопкою клацнути по відповідній папці і вибрати Create new file. Відкрити відповідний файл можна подвійним клацанням миші.

Створення програми в контакті

Для створення механізму авторизації через соціальну мережу ВКонтакте, у Вас обов’язково повинен бути її акаунт. Також необхідно створити програму, тому як дані користувачів отримає саме Ваше створене додаток, яке також необхідно для ідентифікації того, хто отримує дані.

Отже, створюємо додаток, для цього переходимо за посиланням https://vk.com/editapp?act=create:

Авторизація через соціальні мережі: ВКонтакте

Вводимо назву додатка і відзначаємо галочкою пункт веб-сайт, вводимо шлях до сайту та його базовий домен (шлях до сайту може містити домен і папку, в якій розташований сайт або тестовий скрипт) і натискаємо «Підключити додаток».

Авторизація через соціальні мережі: ВКонтакте

Далі необхідно підтвердити створення додаток шляхом введення спеціального коду, який прийде на Ваш мобільний телефон. Після цього Ваш додаток створено.

Авторизація через соціальні мережі: ВКонтакте

Далі переходимо на вкладку настоянки і копіюємо ідентифікатор додатка і його секретний ключ, які знадобляться надалі. ВАЖЛИВО: ні кому не повідомляйте ідентифікатор додатка і його секретний ключ і не викладайте їх у відкритий доступ, так як вони можуть бути використані зловмисниками.

Ще хотів би звернути Вашу увагу на наступну сторінку: http://vk.com/developers.php?oid=-1&p=%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2. Документація по темі даного уроку.

Авторизація ВКонтакте

Насамперед давайте створимо сторінку з посиланням Авторизація, клікнувши на яку користувач буде перенаправлено на сторінку авторизації ВКонтакте. Для цього створимо файл index.php:

Тестовий сайт

Авторизація

Дана сторінка виглядає наступним чином:

Авторизація через соціальні мережі: ВКонтакте

Як Ви бачите шлях на засланні Авторизація веде на допоміжний файл auth.php, яка буде обробляти дані нашого скрипта. Тепер давайте створимо файл конфігурації config.php і додамо кілька констант:

session_start();
define(«APP_ID»,’ідентифікатор програми’);
define(«APP_SECRET»,’Секретний ключ’);
define(«REDIRECT_URI»,’http://avtomirock.esy.es/auth.php’);
define(«URL_ACCESS_TOKEN»,’https://oauth.vk.com/access_token’);
define(«URL_AUTH «,’http://oauth.vk.com/authorize’);
define(«URL_GET_USER»,’https://api.vk.com/method/users.get’);

Де: APP_ID – ідентифікатор Вашого додатки, APP_SECRET – секретний ключ, REDIRECT_URI – шлях на який ВКонтакте надішле перенаправляє користувача, URL_ACCESS_TOKEN – шлях по якому необхідно виконати запит для отримання access_token (ключ доступу до даних користувача), URL_AUTH – шлях сторінки авторизації ВКонтакте, URL_GET_USER – шлях по якому необхідно виконати запит для отримання даних користувача. Тепер створимо новий файл (Auth_VK.php) і додамо в нього наступний код:

code = $code;
}
public function set_token($token) {
$this->token = $token;
}
public function set_uid($id) {
$this->uid = $id;
}
public function redirect($url) {
header(‘HTTP/1.1 301 Moved Permanently’);
header(«Location:».$url);
exit();
}
}
?>

Даний клас – це логічне ядро нашого скрипта. Властивості класу: $code – код який надішле ВКонтакте в результаті успішної авторизації користувача, $token – access_token – ключ доступу до даних користувача; $uid – ідентифікатор користувача в системі ВКонтакте. У конструкторі класу ми підключимо файл конфігурації. Метод redirect() – необхідний для перенаправлення користувача за адресою, яка передається в аргументі при виклику метода. Допоміжні методи set_code(), set_token(), set_uid() – необхідні для встановлення закритих властивостей класу. Тепер давайте створимо файл auth.php і додамо в нього наступний код:

redirect(URL_AUTH.»?».$query);
}
?>

Тобто на початку підключаємо раніше створений клас, потім створюємо його об’єкт. Як я говорив раніше після успішної авторизації, ВКонтакте надіслано на даний файл дані, використовуючи GET параметри (тобто через адресний рядок). Це буде параметр code – спеціальний код, необхідний для отримання access_token. Тому якщо цієї функції немає, значить необхідно перенаправити користувача на сторінку авторизації ВКонтакте. При цьому через адресний рядок необхідно передати наступні параметри:

client_id – ідентифікатор програми користувача;

scope – права доступу додатки (offline — означає доступ до даних користувача в будь-який час);

redirect_uri – шлях по якому буде висланий параметр code. Ця адреса має знаходитися в межах домену, зазначеного в налаштуваннях програми.;

response_type – відповіддю від сервера повинен бути параметр code.

Тепер давайте виконаємо авторизацію (переходимо за посиланням Авторизция):

Авторизація через соціальні мережі: ВКонтакте

Вводимо логін і пароль, а потім потрібно дозволити програмі отримувати доступ до даних користувача (в даному випадку в ролі користувача виступаємо ми дозволяємо своїм додатком отримати наші дані). Після успішної авторизації Вконтакте перенаправляє нас назад на сторінку auth.php і через адресний рядок передає параметр code.

Авторизація через соціальні мережі: ВКонтакте

Отримання access_code

Далі необхідний отримати ключ доступу до даних користувача, використовуючи отриманий параметр code. Для цього в файл auth.php додамо наступний код:

if($_GET[‘code’]) {
$o->set_code($_GET[‘code’]);
$res = $o->get_token();
}
if($_GET[‘error’]) {
exit($_GET[‘error_description’]);
}

До речі, якщо під час авторизації виникли помилки, то замість параметра code, прийде параметр error – код помилки, разом з її описом — error_description. Тому якщо ми дійсно отримали code, значить, запишемо його у властивість класу і викличемо метод get_token(), який отримає access_token. Тепер в клас Auth_Vk додамо код методу get_token():

public function get_token() {
if(!$this->code) {
exit(«Не вірний код»);
}
$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);
$ob = json_decode($result);
if($ob->access_token) {
$this->set_token($ob->access_token);
$this->set_uid($ob->user_id);
return TRUE;
}
elseif($ob->error) {
$_SESSION[‘error’] = «Помилка»;
return FALSE;
}
}

Для отримання access_token необхідно надіслати запит за адресою, що зберігається в константі URL_ACCESS_TOKEN, і передати такі параметри, використовуючи метод GET:

client_id – ідентифікатор програми;

client_secret – секретний код;

code – отриманий code;

redirect_uri – тут потрібно вказати ту ж адресу, що і для отримання code.

Запит відправляти будемо використовуючи бібліотеку CURL. При цьому відповідь від сервера ВКонтакте прийде у форматі рядка JSON. Отже, використовуючи функцію json_decode(), декодируем дану рядок в об’єкт. Об’єкт ми отримаємо наступного виду:

Авторизація через соціальні мережі: ВКонтакте

У випадку помилки ми отримаємо наступне:

Авторизація через соціальні мережі: ВКонтакте

Тобто ми отримаємо об’єкт у якого буде або властивість access_token, або властивість error. Тому, якщо ми отримуємо access_token – запишемо його значення та ідентифікатор користувача відповідні властивості класу і повернемо TRUE, якщо ж прийде помилка — запишемо її у сесію і повернемо FALSE.

Отримання даних користувача

Після того, як ми отримали ключ доступу access_token – можна отримати дані користувача. Для цього в файл auth.php додамо наступний код (після виклику методу get_token()):

if($res) {
$o->get_user();
}
else {
exit($_SESSION[‘error’]);
}

Тепер давайте опишемо метод get_user(), який отримає і поверне дані користувача:

public function get_user() {
if(!$this->token) {
exit(‘Wrong code’);
}
if(!$this->uid) {
exit(‘Wrong code’);
}
$query = «uids=».$this->uid.»&fields=first_name,last_name,nickname,screen_name,sex,bdate,city, country,timezone,photo,photo_medium,photo_big,has_mobile,rate,contacts, education,online,counters&access_token=».$this->token;
//echo $query;
$kur = curl_init();
curl_setopt($kur, CURLOPT_URL, URL_GET_USER.»?».$query);
curl_setopt($kur, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($kur, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($kur,CURLOPT_RETURNTRANSFER,TRUE);
$result2 = curl_exec($kur);
curl_close($kur);
$_SESSION[‘user’] = json_decode($result2);
$this->redirect(«http://avtomirock.esy.es»);
}

Для отримання даних користувача необхідно надіслати запит за адресою, що зберігається в константі URL_GET_USER і надіслати наступні дані, використовуючи метод GET:

uids – ідентифікатор користувача, отриманий разом з access_token;

fields – які дані необхідно отримати (докладніше про даних можна подивитися в документації http://vk.com/developers.php?oid=-1&p=users.get)

access_token – access_token отриманий раніше.

Як зазвичай запит відправляємо використовуючи бібліотеку CURL. Дані як завжди прийдуть у форматі JSON рядка, тому декодируем їх і зберігаємо в сесії для подальшого виведення на екран. І відразу виконуємо редирект на головну сторінку нашого сайту. Давайте роздрукуємо об’єкт даних користувача, який ми отримай після декодування JSON рядки:

Авторизація через соціальні мережі: ВКонтакте

Тепер залишилося вивести дані користувача в потрібному Вам місці, або зберегти їх в базі даних і т. д. Я виведу дані користувача відразу під посиланням Авторизація:

response[0];
//print_r($user);
}
?>
Авторизація через соціальні мережі: ВКонтакте

first_name;?>

last_name;?>

На цьому даний урок завершено. Всього Вам доброго і вдалого кодування!!!