Авторизация OAuth 2 + БД + классы для удобной работы

Готовые уроки IFrame + ВКонтакте API

Авторизация OAuth 2 + БД + классы для удобной работы

Сообщение sasha^ » 30 авг 2013, 19:44

Как и обещал некоторый обитателям форума, я создам урок по серверной авторизации ВКонтакте OAuth 2 с базой данный, а также решил написать пару удобных классов для работы....

В уроке я не буду многословен, весь код прокомментирован, поэтому все должно быть понятно...

1) Создать приложение вк, при выборе типа указать Веб-сайт, в настройках узнаем ID и секретный ключ

2) Для работы нам нужна база данных

В бд создаем таблицу запросом
  1. CREATE TABLE IF NOT EXISTS `users` (
  2.   `id` int(6) NOT NULL AUTO_INCREMENT,
  3.   `vk_id` int(13) NOT NULL,
  4.   `last_activity` int(13) NOT NULL,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


3) Файл настроек - config.php

  1. <?
  2. define("APP_ID", "***"); // id приложения
  3. define("APP_SECRET", "***"); // secret приложения
  4. define("PATH", "***"); // путь к скриптам в виде http://имя_сайта.com/папка/, обязательно со слешем в конце!
  5. define("SCOPE", "wall,notify,friends,status,photos"); // права приложения
  6.  
  7. define("DB_HOST", "***"); // сервер БД
  8. define("DB_USER", "***"); // пользователь БД
  9. define("DB_PASS", "***"); // пароль от БД
  10. define("DB_NAME", "***"); // имя БД
  11.  
  12. define("CALLBACK", "callback.php"); // перенаправить после авторизации
  13.  
  14. session_start();
  15. ?>


4)index.php - главный файл
  1. <?
  2. header("Content-Type: text/html; charset=utf-8");
  3. require_once("config.php"); // подключаем конфиг
  4. require_once("oauth.class.php"); // подключаем класс oauth
  5. require_once("user.class.php"); // подключаем класс user
  6.  
  7. if(!isset($_SESSION['access_token'])) { // если не авторизованы
  8.     header('Location: '.PATH.'login.php');
  9.     exit();
  10. }
  11.  
  12. $data = oauth::api("users.get",array("user_ids"=>$_SESSION['user_id'],"fields"=>"photo_big")); // отправляем запрос к апи
  13. $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); // создаем подключение к БД
  14. $db->set_charset("utf8"); // устанавливаем кодировку
  15. if($data) {
  16.     echo 'Привет, '.$data[0][first_name].' '.$data[0][last_name].
  17.          '</br><img src="'.$data[0][photo_big].'">';
  18.     $user = new user($db); // создаем экземпляр юзера, указывая подключение к бд
  19.     $user->setLastActivity(); // записываем дату последней активности(сейчас)
  20.     echo !$user->error ? '</br> Ваш id в БД: '.$user->db_id.'</br> Дата последней активности: '.$user->last_activity : $user->error; // выводим данные...
  21. }
  22. else {
  23.     echo "Не удалось выполнить запрос к API VK :(";
  24. }
  25. ?>


5)login.php - страница авторизации
  1. <?
  2. header("Content-Type: text/html; charset=utf-8");
  3. require_once("config.php"); // подключаем конфиг
  4. require_once("oauth.class.php"); // подключаем класс oauth
  5. ?>
  6. <a href="<?=oauth::getLink()?>">Войти через ВК</a>


6)callback.php - файл обратного вызова (сюда попадаем после авторизации вк)
  1. <?
  2. header("Content-Type: text/html; charset=utf-8");
  3. require_once("config.php"); // подключаем конфиг
  4. require_once("oauth.class.php"); // подключаем класс oauth
  5. oauth::getAccessToken() ? header('Location: '.PATH.'index.php') : exit("Ошибка получения access_token"); // получаем access_token
  6. ?>


7) Я написал вспомогательные классы для работы с OAuth 2 для ВК... их изменять не нужно(если вы не хотите изменить поля в бд или еще что-то...).. они используют сессии для хранения данных
 всомогательные классы
oauth.class.php
  1. <?
  2.  
  3. /**
  4.  * oauth class for vk.com with using $_SESSION and constants
  5.  *
  6.  * @autor Alexander Hurov
  7.  * @version 1.0
  8.  */
  9.  
  10. class oauth {
  11.     static function getAccessToken() { // метод получения access_token
  12.         $data = json_decode(file_get_contents('https://oauth.vk.com/access_token?client_id='.
  13.                 APP_ID.'&client_secret='.APP_SECRET.'&code='.$_GET['code'].'&redirect_uri='.PATH.CALLBACK),true);
  14.         if($data['access_token']) {
  15.             $_SESSION['access_token'] = $data['access_token'];
  16.             $_SESSION['user_id'] = $data['user_id'];
  17.             return true;
  18.         }
  19.         return false;
  20.     }
  21.    
  22.     static function getLink() { // получения ссылки для авторизации
  23.         return 'http://api.vk.com/oauth/authorize?client_id='.APP_ID.'&redirect_uri='.PATH.CALLBACK.'&display=popup&scope='.SCOPE.'&response_type=code';
  24.     }
  25.    
  26.     static function api($method,$params) { // выполнение запроса к апи
  27.         $q = json_decode(file_get_contents('https://api.vk.com/method/'.$method.'?'
  28.                                             .self::params($params).'&access_token='.$_SESSION['access_token']),true);
  29.         return $q['response'] ? $q['response'] : false;
  30.     }
  31.    
  32.     static function params($p) { // функция перебираем параметры для get-запроса
  33.         $arr = array();
  34.         foreach($p as $k=>$v) {
  35.             $arr[] = $k.'='.urlencode($v);
  36.         }
  37.         return implode('&',$arr);
  38.     }
  39. }
  40. ?>

user.class.php
  1. <?
  2.  
  3. /**
  4.  * user class for vk.com with using $_SESSION and constants and mysqli
  5.  *
  6.  * @autor Alexander Hurov
  7.  * @version 1.0
  8.  */
  9.  
  10. class user {
  11.     var $db; // ссылка на подключение к БД
  12.     var $last_activity; // дата последней активности(заход на главную в данном случае...)
  13.     var $db_id; // id в БД
  14.     var $error = false; // ошибка...
  15.    
  16.     function user($db) { // конструктор, получает данные о человеке или добавляет в бд
  17.         $this->db = $db;
  18.         $resp = $this->db->query("SELECT * FROM users WHERE vk_id = ".intval($_SESSION['user_id']));
  19.         if($resp && $resp->num_rows > 0) {
  20.             $result = $resp->fetch_assoc();
  21.             $this->last_activity = $result["last_activity"];
  22.             $this->db_id = $result["id"];
  23.         }
  24.         elseif(!$resp) $error = "Ошибка получения данных";
  25.         else {
  26.             $this->last_activity = time();
  27.             $resp = $this->db->query("INSERT INTO users(vk_id,last_activity) VALUES(".intval($_SESSION['user_id']).",".$this->last_activity.")");
  28.             $resp ? $this->db_id = $this->db->insert_id : $this->error = "Ошибка занесения в бд";
  29.         }
  30.     }
  31.     function setLastActivity() { // устанавливает дату последней активности
  32.         $time = time();
  33.         $resp = $this->db->query("UPDATE users SET last_activity = ".$time." WHERE vk_id = ".intval($_SESSION['user_id']));
  34.         if($resp) {
  35.             $this->last_activity = $time;
  36.             return true;
  37.         }else {
  38.             $error = "Ошибка обновления данных";
  39.             return false;
  40.         }
  41.     }
  42. }
  43. ?>


Временный пример - http://288664.xxx01xxx.web.hosting-test.net/ (он может и не работать через какое-то время!)
Исходник - http://yadi.sk/d/mpTcvZqe8W6AW

P.S. удачи, если что - спрашивайте!
sasha^

 
Автор темы
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: Авторизация OAuth 2 + БД + классы для удобной работы

Сообщение tofido » 31 авг 2013, 15:28

Спасибо за урок! Всё отлично работает)
Аватара пользователя
tofido

 
Сообщения: 113
Зарегистрирован: 02 май 2012, 15:44
Благодарил (а): 3 раз.
Поблагодарили: 2 раз.


Вернуться в Уроки IFrame ВКонтакте



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron