Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Готовые уроки IFrame + ВКонтакте API
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение Александр »

Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

В этом уроке описана Серверная авторизация для подключения сайтов (Authorization Code Flow).


Процесс авторизации сайта состоит из 4-х шагов:
1. Открытие окна браузера для аутентификации пользователя на сайте ВКонтакте.
2. Разрешение пользователем доступа к своим данным.
3. Передача сайту значения code для получения ключа доступа.
4. Получение сервером приложения ключа доступа access_token для доступа к API ВКонтакте.

Общая суть хорошо описана в официальной документации. Здесь я приведу пример с готовым кодом, чтобы понять его, вам нужно прочитать документацию, либо читать её в процессе изучения кода.


1. Создаём Вконтакте приложение

Заходим на http://vkontakte.ru/editapp?act=create&site=1
Вводим название и выбираем «Веб-сайт».

В настройках приложения можно узнать его ID и Защищенный ключ.


2. Создаём файл настроек config.php

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

<?/* http://flapps.ru/forum/ - форум о создании приложений */ // id приложенияdefine("CLIENT_ID", "743131");// защищенный ключdefine("SECRET", "qweRtyuiop12asdFghjk");// куда перенаправим пользователя после авторизацииdefine("OAUTH_CALLBACK", "callback.php");// настройки доступаdefine("SCOPE", "friends,photos,wall");// путь к папке со скриптамиdefine("PATH", "http://flapps.ru/example/oauth20/"); // включим сессиюsession_start();?>

3. Файл callback.php, на который будет перенаправлен пользователь, после авторизации

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

<?/* http://flapps.ru/forum/ - форум о создании приложений */ require_once("config.php");// получили параметр codeif($_REQUEST['code']) {    // получаем access_token    $resp = file_get_contents('https://api.vk.com/oauth/access_token?client_id='.CLIENT_ID.'&code='.$_REQUEST['code'].'&client_secret='.SECRET);    $data = json_decode($resp, true);     if($data['access_token']){        // запишем данные в сессию        $_SESSION['access_token'] = $data['access_token'];        $_SESSION['user_id'] = $data['user_id'];        // переадресуем пользователя на нужную страницу        header('Location: '.PATH.'index.php');        exit();    }}?>
Внимательно читайте официальную документацию! С момента публикации этой статьи могли произойти изменения. Например, сейчас (2012.11.04) написано, что при получении access_token нужно снова передать redirect_uri. В этом коде это не сделано, но тем не менее работает.


4. Файл redirect.php, который будет переадресовывать пользователя на страницу авторизации

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

<?/* http://flapps.ru/forum/ - форум о создании приложений */ require_once("config.php");//перенаправляем на авторизацию//header('Location: http://api.vk.com/oauth/authorize?client_id='.CLIENT_ID.'&redirect_uri='.PATH.OAUTH_CALLBACK.'&display=popup&scope='.SCOPE.'&response_type=code');header('Location: '.PATH.'login.php');?>

5. Файл login.php

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

<?require_once("config.php");$link = 'http://api.vk.com/oauth/authorize?client_id='.CLIENT_ID.'&redirect_uri='.PATH.OAUTH_CALLBACK.'&display=popup&scope='.SCOPE.'&response_type=code';?><button onclick="location.href='<? echo $link ?>';">Войти ВКонтакте</button><br /><a href="http://flapps.ru">http://flapps.ru</a>

6. Файл index.php

В этом скрипте мы получим профиль пользователя

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

<?/* http://flapps.ru/forum/ - форум о создании приложений */ require_once("config.php"); if(isset($_SESSION['access_token'])) {    $uid = $_SESSION['user_id'];        // получим профиль пользователя    $resp = file_get_contents('https://api.vkontakte.ru/method/getProfiles?uids='.$uid.'&fields=photo_big&access_token='.$_SESSION['access_token']);    $data = json_decode($resp, true);    //print_r($data); // расскоментировать эту строчку, чтобы увидеть ответ сервера        // выведем полученные данные    echo 'Здравствуй, '.$data[response][0][first_name].' '.$data[response][0][last_name].        '<br /><img src="'.$data[response][0][photo_big].'" />';    } else {    require_once("redirect.php");}  /* http://flapps.ru/forum/ - форум о создании приложений */?>
Исходник: http://flapps.ru/example/vk_oauth_2_0.rar
Аватара пользователя
ukhov
Модератор
Модератор
Сообщения: 1343
Зарегистрирован: 04 янв 2011, 21:19

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение ukhov »

отличный урок)
maksimn
Сообщения: 59
Зарегистрирован: 26 мар 2011, 10:46

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение maksimn »

Спасибо за урок!

Метод wall.post недоступен? У меня выводит ошибку: Permission to perform this action is denied by user [request_params], хотя при авторизации я указал в правах wall.
Аватара пользователя
Asped
WEB Team
WEB Team
Сообщения: 184
Зарегистрирован: 02 янв 2011, 20:34

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение Asped »

maksimn писал(а):Спасибо за урок!

Метод wall.post недоступен? У меня выводит ошибку: Permission to perform this action is denied by user [request_params], хотя при авторизации я указал в правах wall.
Тоже самое было у меня с видео. Все методы доступны, включая расширенные. Если твоя последовательность действия была такой: Поставил образец -> запустил и проверил работу -> потом дописал уже что-то на что изначально не было прав. Не будет работать. Нужно заного залогинится, получить токен. В общем как-то так.

А у меня вопрос... Как правильно написать вывод видео. Список и все, что к ниму относится я получаю, но он не выводится.

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

 $resp = file_get_contents('https://api.vkontakte.ru/method/video.get?gid='.$gid.'&width=320&count=3&access_token='.$_SESSION['access_token']);    $data = json_decode($resp, true);       $i = 1;    $i++;    echo '<br />video<br />'.$data[response][i][title].' '.$data[response][i][player]. ' ';    
Где у меня ошибка? Делал по этому уроку и уроку "Вывод видеозаписей (video.get) ".
maksimn
Сообщения: 59
Зарегистрирован: 26 мар 2011, 10:46

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение maksimn »

Дело в том, что при подтверждением прав даже отсутствует пункт "Приложению будет доступны методы для работы с Вашей стеной". Это баг "Вконтакте"?
maksimn
Сообщения: 59
Зарегистрирован: 26 мар 2011, 10:46

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение maksimn »

Asped, делал все заново. Такая же проблема.
Аватара пользователя
Asped
WEB Team
WEB Team
Сообщения: 184
Зарегистрирован: 02 янв 2011, 20:34

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение Asped »

maksimn писал(а):Asped, делал все заново. Такая же проблема.
Ну у меня это само как-то "починилось".
tranquility404
Сообщения: 8
Зарегистрирован: 18 окт 2011, 20:41

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение tranquility404 »

Проблема в файле callback.php.
Сервер при обмене данными с вконтактом выдает следующую ошибку

Warning: file_get_contents(https://api.vk.com/oauth/access_token?c ... ----------) [function.file-get-contents]: failed to open stream: No such file or directory in /home/---------------------------/callback.php on line 8

API возвращает информацию. Причем инфа верная. Но наш сервер всё равно выводит то что я привел выше
как лечить?
andrei2295kmail
Сообщения: 188
Зарегистрирован: 07 ноя 2011, 10:51

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение andrei2295kmail »

не работает(((

п»ї
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/a/andrei8/musicavtor.ru/public_html/config.php:1) in /home/a/andrei8/musicavtor.ru/public_html/config.php on line 16

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/a/andrei8/musicavtor.ru/public_html/config.php:1) in /home/a/andrei8/musicavtor.ru/public_html/config.php on line 16

Warning: Cannot modify header information - headers already sent by (output started at /home/a/andrei8/musicavtor.ru/public_html/config.php:1) in /home/a/andrei8/musicavtor.ru/public_html/redirect.php on line 7
andrei2295kmail
Сообщения: 188
Зарегистрирован: 07 ноя 2011, 10:51

Re: Серверная авторизация ВКонтакте на базе протокола OAuth 2.0

Сообщение andrei2295kmail »

помогите) пожалуйста
Ответить