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

При запуске игры на указанный в настройках URL передаются дополнительные параметры, содержащие в себе данные о пользователе и источнике запуска.

  • api_url (string) — URL сервиса API, по которому необходимо осуществлять запросы.

  • api_id (integer) — идентификатор запущенного приложения.

  • api_settings — битовая маска настроек прав доступа текущего пользователя в приложении.

  • api_result (string) — результат первого запроса к API, который выполняется при загрузке приложения.

  • access_token — ключ доступа для вызова методов API.

  • auth_key (string) — ключ, необходимый для авторизации пользователя на стороннем сервере.

  • hash (string) — хеш запроса (данные после символа # в строке адреса).

  • is_app_user (integer, [0,1]) — если пользователь установил приложение – 1, иначе — 0.

  • is_secure (integer, [0,1]) — если пользователем используется защищенное соединение – 1, иначе — 0.

  • is_play_machine(integer, [0,1] — если приложение было запущено через Play Machine.

  • language (integer) — идентификатор языка пользователя, просматривающего приложение.

  • lc_name, ads_app_id — служебные параметры.

  • parent_language (integer) — идентификатор языка, которым можно заменить язык пользователя (возвращается для неофициальных языковых версий).

  • platform (string) — идентификатор платформы, на которой запускается игра. Содержит одно из значений:

    • html5_ios — мобильное приложение ВКонтакте для iOS;
    • html5_android — мобильное приложение ВКонтакте для Android;
    • html5_mobile — мобильная версия сайта ВКонтакте;
    • web — десктопная версия сайта ВКонтакте.
  • referrer (string) — обозначение места, откуда пользователь перешёл в приложение.

  • sign (string) — подпись параметров запуска (пришла на замену auth_key как усиленная альтернатива).

  • sign_keys (string) – параметры, необходимые для генерации sign.

  • timestamp (integer) — время генерации sign.

  • user_id (integer) — идентификатор пользователя, со страницы которого было запущено приложение. Если приложение запущено не со страницы пользователя, содержит 0.

  • viewer_id (integer) — идентификатор пользователя, который запустил приложение.

  • viewer_type — тип пользователя, который просматривает приложение.

Параметр sign

Чтобы получить подпись параметров запуска (sign), отфильтруйте вернувшиеся параметры по параметрам, перечисленных в sign_keys, затем объедините пары «ключ=значение» с амперсандом & в качестве разделителя. От полученной после объединения строки вычисляется хеш-код алгоритмом SHA256 в бинарном представлении с методом HMAС, подписанный защищённым ключом из настроек вашего приложения, и затем кодируется base64 encode.

sign позволяет защититься от подмены любого из параметров, переданных в игру, в то время как auth_key защищает от подмены только api_id и viewer_id.

Пример проверки подписи на PHP

PHP<?php $client_secret = 'xxxxx'; $url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $query_params = []; $parsed = parse_url($url, PHP_URL_QUERY); parse_str($parsed, $query_params); // Получаем query-параметры из URL $sign_params = []; $sign_keys = explode(',', $query_params['sign_keys']); foreach ($sign_keys as $key) { $sign_params[$key] = $query_params[$key]; } $sign_params_query = http_build_query($sign_params); // Формируем строку вида "param_name1=value&param_name2=value" $sign = rtrim(strtr(base64_encode(hash_hmac('sha256', $sign_params_query, $client_secret, true)), '+/', '-_'), '='); // Получаем хеш-код от строки, используя защищеный ключ приложения. Генерация на основе метода HMAC. $auth_key = md5($sign_params['api_id'] . '_' . $sign_params['viewer_id'] . '_' . $client_secret); $sign_status = $sign === $query_params['sign']; // Сравниваем полученную подпись со значением параметра 'sign' echo 'status: ' . ($sign_status ? 'ok' : 'fail')."\n"; echo date('Y-m-d H:i:s', $query_params['timestamp']) . PHP_EOL;

Пример проверки подписи на Node.js

JavaScriptconst qs = require('querystring'); const crypto = require('crypto'); const urlParams = qs.parse(URL_PARAMS); const signKeys = new URLSearchParams(URL_PARAMS) .get('sign_keys') .split(','); const ordered = {}; signKeys.forEach(key => ordered[key] = urlParams[key]); const stringParams = qs.stringify(ordered); const paramsHash = crypto .createHmac('sha256', secretKey) .update(stringParams) .digest() .toString('base64') .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=$/, ''); console.log(paramsHash === urlParams.sign);

Параметр auth_key

auth_key нужен для проверки подлинности сессии на сервере: чтобы вы могли быть уверены, что данные запроса не подменялись на стороне клиента.

Мы не рекомендуем использовать параметр auth_key, так как в будущем он будет упразднён. Для проверки подлинности сессии используйте параметр sign.

auth_key вычисляется на сервере ВКонтакте следующим образом:

JavaScriptauth_key = md5(api_id + '_' + viewer_id + '_' + api_secret)

Здесь

  • api_id — идентификатор вашего приложения,
  • viewer_id — идентификатор пользователя,
  • api_secret — защищённый ключ (вы можете узнать его в разделе редактировании приложения на вкладке РедактированиеНастройки, поле Защищённый ключ).

Чтобы не производить дополнительную авторизацию пользователя на своём сервере, всегда проверяйте ключ auth_key на правильность.