Как и обещал некоторый обитателям форума, я создам урок по серверной авторизации ВКонтакте 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. удачи, если что - спрашивайте!