-
Notifications
You must be signed in to change notification settings - Fork 41
Лабораторная работа №7
Разработчики:
- Виноградова Мария (ИДБ-13-13)
- Муталимов Тимур (ИДБ-13-14)
- Володина Ксения (ИДБ-13-12)
- Бобоходжиев Тимур (ИДБ-13-12)
- Яковлев Никита (ИДБ-13-12)
На примере vk.com
Open API — система для разработчиков сторонних сайтов, которая предоставляет возможность легко авторизовывать пользователей ВКонтакте на Вашем сайте. Кроме этого, с согласия пользователей, вы сможете получить доступ к информации об их друзьях, фотографиях, аудиозаписях, видеороликах и прочих данных ВКонтакте для более глубокой интеграции с Вашим проектом.
В рамках подключения к Open API создается приложение, которое позволяет использовать на Вашем сайте все текущие методы ВКонтакте API. Помимо этого, Open API упрощает регистрацию новых пользователей на Вашем сайте, если у них уже есть учетная запись ВКонтакте.
Диаграмма прецедентов:
Подключаем внешнюю аутентификацию на личную страницу:
Создайте приложение (если еще не создано), с типом "Веб-сайт".
На выбор:
Для использования обычной инициализации необходимо добавить следующий блок кода внутри тега < 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 является обязательным условием успешной инициализации. При обычной инициализации контейнер будет создан автоматически в случае его отсутствия.
Подключаем проверку аутентификации на сервере:
Для того, чтобы Вы могли проверить, что пользователь действительно авторизовался через платформу 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 приложения.
Авторизация пользователя
Для работы с авторизацией пользователя в Open API используются методы объекта VK.Auth:
Виджет авторизации вы найдете здесь.
Дополнительно: Лекция по ИБ