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

Готовые уроки IFrame + ВКонтакте API
Ответить
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

Сообщение sasha^ »

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

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

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

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

В бд создаем таблицу запросом

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `users` (  `id` int(6) NOT NULL AUTO_INCREMENT,  `vk_id` int(13) NOT NULL,  `last_activity` int(13) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
3) Файл настроек - config.php

Код: Выделить всё

<?define("APP_ID", "***"); // id приложенияdefine("APP_SECRET", "***"); // secret приложенияdefine("PATH", "***"); // путь к скриптам в виде http://имя_сайта.com/папка/, обязательно со слешем в конце!define("SCOPE", "wall,notify,friends,status,photos"); // права приложения define("DB_HOST", "***"); // сервер БДdefine("DB_USER", "***"); // пользователь БДdefine("DB_PASS", "***"); // пароль от БДdefine("DB_NAME", "***"); // имя БД define("CALLBACK", "callback.php"); // перенаправить после авторизации session_start();?>
4)index.php - главный файл

Код: Выделить всё

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

Код: Выделить всё

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

Код: Выделить всё

<?header("Content-Type: text/html; charset=utf-8");require_once("config.php"); // подключаем конфигrequire_once("oauth.class.php"); // подключаем класс oauthoauth::getAccessToken() ? header('Location: '.PATH.'index.php') : exit("Ошибка получения access_token"); // получаем access_token?>
7) Я написал вспомогательные классы для работы с OAuth 2 для ВК... их изменять не нужно(если вы не хотите изменить поля в бд или еще что-то...).. они используют сессии для хранения данных
 всомогательные классы
oauth.class.php

Код: Выделить всё

<? /** * oauth class for vk.com with using $_SESSION and constants * * @autor Alexander Hurov * @version 1.0 */ class oauth {    static function getAccessToken() { // метод получения access_token        $data = json_decode(file_get_contents('https://oauth.vk.com/access_token?client_id='.                APP_ID.'&client_secret='.APP_SECRET.'&code='.$_GET['code'].'&redirect_uri='.PATH.CALLBACK),true);        if($data['access_token']) {            $_SESSION['access_token'] = $data['access_token'];            $_SESSION['user_id'] = $data['user_id'];            return true;        }        return false;    }        static function getLink() { // получения ссылки для авторизации        return 'http://api.vk.com/oauth/authorize?client_id='.APP_ID.'&redirect_uri='.PATH.CALLBACK.'&display=popup&scope='.SCOPE.'&response_type=code';    }        static function api($method,$params) { // выполнение запроса к апи        $q = json_decode(file_get_contents('https://api.vk.com/method/'.$method.'?'                                            .self::params($params).'&access_token='.$_SESSION['access_token']),true);        return $q['response'] ? $q['response'] : false;    }        static function params($p) { // функция перебираем параметры для get-запроса        $arr = array();        foreach($p as $k=>$v) {            $arr[] = $k.'='.urlencode($v);        }        return implode('&',$arr);    }}?>
user.class.php

Код: Выделить всё

<? /** * user class for vk.com with using $_SESSION and constants and mysqli * * @autor Alexander Hurov * @version 1.0 */ class user {    var $db; // ссылка на подключение к БД    var $last_activity; // дата последней активности(заход на главную в данном случае...)    var $db_id; // id в БД    var $error = false; // ошибка...        function user($db) { // конструктор, получает данные о человеке или добавляет в бд        $this->db = $db;        $resp = $this->db->query("SELECT * FROM users WHERE vk_id = ".intval($_SESSION['user_id']));        if($resp && $resp->num_rows > 0) {            $result = $resp->fetch_assoc();            $this->last_activity = $result["last_activity"];            $this->db_id = $result["id"];        }        elseif(!$resp) $error = "Ошибка получения данных";        else {            $this->last_activity = time();            $resp = $this->db->query("INSERT INTO users(vk_id,last_activity) VALUES(".intval($_SESSION['user_id']).",".$this->last_activity.")");            $resp ? $this->db_id = $this->db->insert_id : $this->error = "Ошибка занесения в бд";        }    }    function setLastActivity() { // устанавливает дату последней активности        $time = time();        $resp = $this->db->query("UPDATE users SET last_activity = ".$time." WHERE vk_id = ".intval($_SESSION['user_id']));        if($resp) {            $this->last_activity = $time;            return true;        }else {            $error = "Ошибка обновления данных";            return false;        }    }}?>
Временный пример - http://288664.xxx01xxx.web.hosting-test.net/ (он может и не работать через какое-то время!)
Исходник - http://yadi.sk/d/mpTcvZqe8W6AW

P.S. удачи, если что - спрашивайте!
Аватара пользователя
tofido
Сообщения: 113
Зарегистрирован: 02 май 2012, 15:44

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

Сообщение tofido »

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