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

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

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

Сообщение Александр » 05 ноя 2011, 17:10

Серверная авторизация ВКонтакте на базе протокола 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

  1. <?
  2. /* http://flapps.ru/forum/ - форум о создании приложений */
  3.  
  4. // id приложения
  5. define("CLIENT_ID", "743131");
  6. // защищенный ключ
  7. define("SECRET", "qweRtyuiop12asdFghjk");
  8. // куда перенаправим пользователя после авторизации
  9. define("OAUTH_CALLBACK", "callback.php");
  10. // настройки доступа
  11. define("SCOPE", "friends,photos,wall");
  12. // путь к папке со скриптами
  13. define("PATH", "http://flapps.ru/example/oauth20/");
  14.  
  15. // включим сессию
  16. session_start();
  17. ?>



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

  1. <?
  2. /* http://flapps.ru/forum/ - форум о создании приложений */
  3.  
  4. require_once("config.php");
  5. // получили параметр code
  6. if($_REQUEST['code']) {
  7.     // получаем access_token
  8.     $resp = file_get_contents('https://api.vk.com/oauth/access_token?client_id='.CLIENT_ID.'&code='.$_REQUEST['code'].'&client_secret='.SECRET);
  9.     $data = json_decode($resp, true);
  10.  
  11.     if($data['access_token']){
  12.         // запишем данные в сессию
  13.         $_SESSION['access_token'] = $data['access_token'];
  14.         $_SESSION['user_id'] = $data['user_id'];
  15.         // переадресуем пользователя на нужную страницу
  16.         header('Location: '.PATH.'index.php');
  17.         exit();
  18.     }
  19. }
  20. ?>

Внимательно читайте официальную документацию! С момента публикации этой статьи могли произойти изменения. Например, сейчас (2012.11.04) написано, что при получении access_token нужно снова передать redirect_uri. В этом коде это не сделано, но тем не менее работает.


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

  1. <?
  2. /* http://flapps.ru/forum/ - форум о создании приложений */
  3.  
  4. require_once("config.php");
  5. //перенаправляем на авторизацию
  6. //header('Location: http://api.vk.com/oauth/authorize?clien ... type=code');
  7. header('Location: '.PATH.'login.php');
  8. ?>



5. Файл login.php

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



6. Файл index.php

В этом скрипте мы получим профиль пользователя
  1. <?
  2. /* http://flapps.ru/forum/ - форум о создании приложений */
  3.  
  4. require_once("config.php");
  5.  
  6. if(isset($_SESSION['access_token'])) {
  7.     $uid = $_SESSION['user_id'];
  8.    
  9.     // получим профиль пользователя
  10.     $resp = file_get_contents('https://api.vkontakte.ru/method/getProfiles?uids='.$uid.'&fields=photo_big&access_token='.$_SESSION['access_token']);
  11.     $data = json_decode($resp, true);
  12.     //print_r($data); // расскоментировать эту строчку, чтобы увидеть ответ сервера
  13.    
  14.     // выведем полученные данные
  15.     echo 'Здравствуй, '.$data[response][0][first_name].' '.$data[response][0][last_name].
  16.         '<br /><img src="'.$data[response][0][photo_big].'" />';
  17.    
  18. } else {
  19.     require_once("redirect.php");
  20. }
  21.  
  22.  
  23. /* http://flapps.ru/forum/ - форум о создании приложений */
  24. ?>


Исходник: Чтобы увидеть ссылку - зарегистрируйтесь

За это сообщение автора Александр поблагодарили - 5:
Koval, KupueXA, maksimn, ruslanio, ukhov
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Google
 



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

Сообщение ukhov » 05 ноя 2011, 21:43

отличный урок)
Изображение
Аватара пользователя
ukhov
Модератор
Модератор
 
Сообщения: 1343
Зарегистрирован: 04 янв 2011, 21:19
Откуда: Санкт-Петербург
Благодарил (а): 85 раз.
Поблагодарили: 155 раз.

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

Сообщение maksimn » 06 ноя 2011, 18:01

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

Метод wall.post недоступен? У меня выводит ошибку: Permission to perform this action is denied by user [request_params], хотя при авторизации я указал в правах wall.
maksimn

 
Сообщения: 59
Зарегистрирован: 26 мар 2011, 10:46
Благодарил (а): 4 раз.
Поблагодарили: 2 раз.

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

Сообщение Asped » 07 ноя 2011, 01:11

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

Метод wall.post недоступен? У меня выводит ошибку: Permission to perform this action is denied by user [request_params], хотя при авторизации я указал в правах wall.


Тоже самое было у меня с видео. Все методы доступны, включая расширенные. Если твоя последовательность действия была такой: Поставил образец -> запустил и проверил работу -> потом дописал уже что-то на что изначально не было прав. Не будет работать. Нужно заного залогинится, получить токен. В общем как-то так.

А у меня вопрос... Как правильно написать вывод видео. Список и все, что к ниму относится я получаю, но он не выводится.
  1.  
  2. $resp = file_get_contents('https://api.vkontakte.ru/method/video.get?gid='.$gid.'&width=320&count=3&access_token='.$_SESSION['access_token']);
  3.     $data = json_decode($resp, true);
  4.    
  5.     $i = 1;
  6.     $i++;
  7.     echo '<br />video<br />'.$data[response][i][title].' '.$data[response][i][player]. ' ';
  8.    
  9.  

Где у меня ошибка? Делал по этому уроку и уроку "Вывод видеозаписей (video.get) ".
Аватара пользователя
Asped
WEB Team
WEB Team
 
Сообщения: 184
Зарегистрирован: 02 янв 2011, 20:34
Откуда: Волгоград
Благодарил (а): 5 раз.
Поблагодарили: 8 раз.

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

Сообщение maksimn » 07 ноя 2011, 16:27

Дело в том, что при подтверждением прав даже отсутствует пункт "Приложению будет доступны методы для работы с Вашей стеной". Это баг "Вконтакте"?
maksimn

 
Сообщения: 59
Зарегистрирован: 26 мар 2011, 10:46
Благодарил (а): 4 раз.
Поблагодарили: 2 раз.

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

Сообщение maksimn » 07 ноя 2011, 16:29

Asped, делал все заново. Такая же проблема.
maksimn

 
Сообщения: 59
Зарегистрирован: 26 мар 2011, 10:46
Благодарил (а): 4 раз.
Поблагодарили: 2 раз.

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

Сообщение Asped » 07 ноя 2011, 18:03

maksimn писал(а):Asped, делал все заново. Такая же проблема.


Ну у меня это само как-то "починилось".
Аватара пользователя
Asped
WEB Team
WEB Team
 
Сообщения: 184
Зарегистрирован: 02 янв 2011, 20:34
Откуда: Волгоград
Благодарил (а): 5 раз.
Поблагодарили: 8 раз.

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

Сообщение tranquility404 » 08 ноя 2011, 20:02

Проблема в файле 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 возвращает информацию. Причем инфа верная. Но наш сервер всё равно выводит то что я привел выше
как лечить?
tranquility404

 
Сообщения: 8
Зарегистрирован: 18 окт 2011, 20:41
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение andrei2295kmail » 20 ноя 2011, 10:43

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

п»ї
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
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.

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

Сообщение andrei2295kmail » 20 ноя 2011, 10:55

помогите) пожалуйста
andrei2295kmail

 
Сообщения: 188
Зарегистрирован: 07 ноя 2011, 10:51
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.

След.

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



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

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