Авторизация пользователя
При запуске игры на указанный в настройках 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
$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¶m_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
const 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
вычисляется на сервере ВКонтакте следующим образом:
auth_key = md5(api_id + '_' + viewer_id + '_' + api_secret)
Здесь
- •
api_id
— идентификатор вашего приложения, - •
viewer_id
— идентификатор пользователя, - •
api_secret
— защищённый ключ (вы можете узнать его в разделе редактировании приложения на вкладке Редактирование → Настройки, поле Защищённый ключ).
Чтобы не производить дополнительную авторизацию пользователя на своём сервере, всегда проверяйте ключ auth_key
на правильность.