Skip to content

Лабораторная работа №7

okoff edited this page Apr 19, 2017 · 38 revisions

Описание лабораторной работы №7

Разработчики:

  • Виноградова Мария (ИДБ-13-13)
  • Муталимов Тимур (ИДБ-13-14)
  • Володина Ксения (ИДБ-13-12)
  • Бобоходжиев Тимур (ИДБ-13-12)
  • Яковлев Никита (ИДБ-13-12)

Ознакомление

На примере vk.com

Open API — система для разработчиков сторонних сайтов, которая предоставляет возможность легко авторизовывать пользователей ВКонтакте на Вашем сайте. Кроме этого, с согласия пользователей, вы сможете получить доступ к информации об их друзьях, фотографиях, аудиозаписях, видеороликах и прочих данных ВКонтакте для более глубокой интеграции с Вашим проектом.

В рамках подключения к Open API создается приложение, которое позволяет использовать на Вашем сайте все текущие методы ВКонтакте API. Помимо этого, Open API упрощает регистрацию новых пользователей на Вашем сайте, если у них уже есть учетная запись ВКонтакте.

Диаграмма прецедентов: UML

Шаг 1

Подключаем внешнюю аутентификацию на личную страницу:

Создайте приложение (если еще не создано), с типом "Веб-сайт".

На выбор:

Обычная инициализация:

Для использования обычной инициализации необходимо добавить следующий блок кода внутри тега < head >:

<script src="https://vk.com/js/api/openapi.js?143" type="text/javascript"></script>
<script type="text/javascript">
      VK.init({
        apiId: ВАШ_APP_ID
      });
</script>

Асинхронная инициализация

В отличие от обычной, асинхронная инициализация Open API позволяет производить инициализацию платформы параллельно инициализации Вашего JavaScript-кода. Для использования асинхронной инициализации, добавьте следующий HTML и JavaScript код сразу же после открытия тега < body >:

<div id="vk_api_transport"></div>
<script type="text/javascript">
  window.vkAsyncInit = function() {
    VK.init({
      apiId: ВАШ_APP_ID
    });
  };
  setTimeout(function() {
    var el = document.createElement("script");
    el.type = "text/javascript";
    el.src = "https://vk.com/js/api/openapi.js?143";
    el.async = true;
    document.getElementById("vk_api_transport").appendChild(el);
  }, 0);
</script>

При использовании асинхронной инициализации наличие контейнера vk_api_transport является обязательным условием успешной инициализации. При обычной инициализации контейнер будет создан автоматически в случае его отсутствия.

Шаг 2

Подключаем проверку аутентификации на сервере:

Для того, чтобы Вы могли проверить, что пользователь действительно авторизовался через платформу Open API, в сессионных данных передается параметр sig. Он служит цифровой подписью данных. После авторизации сессионные данные записываются в cookie с именем vk_app_<APP_ID>, где <APP_ID> - это идентификатор Вашего приложения. Данные записаны в виде пар parameter_name=parameter_value, соединенных разделительным символом &:

<code>expire=1271238742&mid=100172&secret=97c1e8933e&sid=549b550f608e4a4d247734941debb5e68df50a66c58dc6ee2a4f60a2&sig=372df9795fe8dd29684a2f996872457c</code>

Параметр sig равен md5 от конкатенации следующих строк:

  • данных сессии expire, mid, secret, sid в виде пар parameter_name=parameter_value, расположенных в порядке возрастания имени параметра (по алфавиту);
  • защищенного ключа Вашего приложения.

В данном случае значение sig будет вычислено как md5-хеш от следующей строки:

<code>expire=1271238742mid=100172secret=97c1e8933esid=549b550f608e4a4d247734941debb5e68df50a66c58dc6ee2a4f60a26FF1PUlZfEyutJxctvtd</code>

Ниже представлен пример кода на языке PHP, который может быть использован для авторизации пользователя Open API на удаленной стороне:

function authOpenAPIMember() {
  $session = array();
  $member = FALSE;
  $valid_keys = array('expire', 'mid', 'secret', 'sid', 'sig');
  $app_cookie = $_COOKIE['vk_app_'.APP_ID];
  if ($app_cookie) {
    $session_data = explode ('&', $app_cookie, 10);
    foreach ($session_data as $pair) {
      list($key, $value) = explode('=', $pair, 2);
      if (empty($key) || empty($value) || !in_array($key, $valid_keys)) {
        continue;
      }
      $session[$key] = $value;
    }
    foreach ($valid_keys as $key) {
      if (!isset($session[$key])) return $member;
    }
    ksort($session);

    $sign = '';
    foreach ($session as $key => $value) {
      if ($key != 'sig') {
        $sign .= ($key.'='.$value);
      }
    }
    $sign .= APP_SHARED_SECRET;
    $sign = md5($sign);
    if ($session['sig'] == $sign && $session['expire'] > time()) {
      $member = array(
        'id' => intval($session['mid']),
        'secret' => $session['secret'],
        'sid' => $session['sid']
      );
    }
  }
  return $member;
}

$member = authOpenAPIMember();

if($member !== FALSE) {
  /* Пользователь авторизован в Open API */
} else {
  /* Пользователь не авторизован в Open API */
}

В этом примере константы имеют следующие значения:

  • APP_ID — ID Open API приложения.

  • APP_SHARED_SECRET — защищенный ключ Open API приложения.

Шаг 3

Авторизация пользователя

Для работы с авторизацией пользователя в Open API используются методы объекта VK.Auth:

Виджет авторизации вы найдете здесь.

Дополнительно: Лекция по ИБ

Clone this wiki locally