VKWebAppCreateHash
VKWebAppCreateHash
генерирует хеш. Хеш помогает защититься от подмены данных, которые ВКонтакте отправляет мини-приложению или игре, например при показах рекламы.
Чтобы убедиться, что данные приходят именно от сервера ВКонтакте, достаточно вычислить хеш и сравнить с тем, что мини-приложение или игра получило в ответе.
Пример
bridge.send('VKWebAppCreateHash')
.then((data) => {
if (data.sign) {
// Хеш сгенерирован
}
})
.catch((error) => {
// Ошибка
console.log(error);
});
Платформы
Android, iOS, Mobile Web, Web
Параметры
Поле | Тип | Описание |
---|---|---|
request_id
необязательное | string | Идентификатор запроса. Используется для проверки соответствия запроса и ответа. |
Результат
Проверить результат можно:
- •
Используя объект
Promise
, который возвращается вызовомbridge.send(...)
. - •
С помощью событий
VKWebAppCreateHashResult
иVKWebAppCreateHashFailed
.
Подробнее о проверке результатов при вызовах VK Bridge.
Объект Promise
Если обращение к платформе прошло успешно, управление будет передано в then
-обработчик объекта Promise
. В качестве ответа платформа возвращает объект со следующими полями:
Поле | Тип | Описание |
---|---|---|
sign | string | Хеш, который генерирует сервер ВКонтакте, используя защищённый ключ и текущее значение времени. Такой же принцип используется для подписи параметров запуска. |
ts | integer | Дата и время в секундах, когда хеш был сгенерирован (Unix Timestamp). |
Если при обращении к платформе произошла ошибка, управление передаётся в метод catch
. В качестве ответа платформа возвращает объект с информацией об ошибке, общий для всех событий VK Bridge.
События
VKWebAppCreateHashResult
Сигнализирует, что хеш сгенерирован. В обработчик события на стороне пользователя передаются следующие данные:
{
detail: {
type: "VKWebAppCreateHashResult",
data: {
sign: "m7TwcoveOwy4BE180UCTwyTkPApprYP81RjrOEuQcos",
ts: 1664541985
}
}
}
Передаваемый объект подобен объекту, возвращаемому при успешном выполнении промиса.
VKWebAppCreateHashFailed
Информирует об ошибке, которая произошла при взаимодействии с платформой.
В обработчик события на стороне пользователя передаётся объект с информацией об ошибке, общий для всех методов VK Bridge.
Пример обработки событий
Смотрите раздел Обработка событий-результатов.
Вычисление хеша
Чтобы вычислить хеш:
- 1.Добавьте в ответ идентификатор пользователя
user_id
и идентификатор мини-приложения или игрыapp_id
. - 2.Отсортируйте параметры ответа по ключу (в алфавитном порядке) и объедините пары «ключ=значение» в строку с амперсандом в качестве разделителя.
- 3.Сериализуйте строку с помощью алгоритма хеширования HMAC-SHA256. В качестве ключа используйте защищённый ключ из настроек мини-приложения или игры. Выбранная реализация HMAC должна использовать хеш-функцию SHA-256.
- 4.Преобразуйте в строку двоичные данные, полученные на предыдущем шаге. Используйте алгоритм Base64.
Пример
$sign_param = 'fSibt9N1v3DYflFKFl2qyRk-g3szAKiGDL0p6fYGFSI';
$hash_params = [
'ts' => 1630076629,
'request_id' => '123',
];
// Добавляем идентификатор пользователя и мини-приложения или игры к ответу на событие.
$hash_params['user_id'] = 123;
$hash_params['app_id'] = 123;
// Сортируем массив по ключам.
ksort($hash_params);
// Формируем строку вида param_name1=value¶m_name2=value.
$sign_params_query = http_build_query($hash_params);
// Получаем хеш-код от строки, используя защищёный ключ приложения (метод HMAC).
$sign = rtrim(strtr(base64_encode(hash_hmac('sha256', $sign_params_query, $client_secret, true)), '+/', '-_'), '=');
// Сравниваем полученную строку со значением из VKWebAppCreateHash.
$status = $sign === $sign_param;
echo ($status ? 'ok' : 'fail')."\n";