diff --git a/README.md b/README.md index 0e4d555..4df86ab 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ # vk-apps-launch-params + Пример работы с параметрами запуска: -* [PHP](#php) -* [Java (1.8)](#java1p8) -* [Python 3](#python3) + +- [PHP](#php) +- [Java (1.8)](#java1p8) +- [Python 3](#python3) +- [Node.js](#nodejs) @@ -24,9 +27,9 @@ foreach ($query_params as $name => $value) { $sign_params[$name] = $value; } -ksort($sign_params); // Сортируем массив по ключам +ksort($sign_params); // Сортируем массив по ключам $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. +$sign = rtrim(strtr(base64_encode(hash_hmac('sha256', $sign_params_query, $client_secret, true)), '+/', '-_'), '='); // Получаем хеш-код от строки, используя защищеный ключ приложения. Генерация на основе метода HMAC. $status = $sign === $query_params['sign']; // Сравниваем полученную подпись со значением параметра 'sign' @@ -144,3 +147,47 @@ status = is_valid(query=query_params, secret=client_secret) print("ok" if status else "fail") ``` + + + +## Пример проверки подписи на Node.js + +```javascript +const fs = require('fs') //модуль для ФС +const crypto = require('crypto') //модуль для криптографии Nodejs +const { stringify, parse } = require('querystring') //методы для парсинга строки + +const URL = + '?vk_user_id=494075&vk_app_id=6736218&vk_is_app_user=1&vk_are_notifications_enabled=1&vk_language=ru&vk_access_token_settings=&vk_platform=android&sign=exTIBPYTrAKDTHLLm2AwJkmcVcvFCzQUNyoa6wAjvW6k', + CLIENT_SECRET = 'wvl68m4dR1UpLrVRli' + +const isVKParam = e => e[0].startsWith('vk_') + +const checkVKQueryParamsSign = params => { + const listOfParams = Object.entries(params) //перевод в обьекта параметро в список + .filter(isVKParam) //фильтрация параметров VK + .sort((a, b) => { + if (a[0] < b[0]) { + return -1 + } + if (a[0] > b[0]) { + return 1 + } + return 0 + }) //сортировка по алфавиту + const paramsStr = stringify( + listOfParams.reduce((obj, [k, v]) => ({ ...obj, [k]: v }), {}) + ) //перевод параметров в строковый вид + + const hmac = crypto.createHmac('sha256', CLIENT_SECRET) //инициализация генератора подписи + hmac.update(paramsStr) //добавление строки с параметрами + const sign = hmac + .digest('base64') + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=/g, '') //генерация подписи + return sign === params.sign //сравнение подписей +} + +console.log(checkVKQueryParamsSign(parse(URL))) +``` diff --git a/package.json b/package.json index 06b5cff..eab0915 100644 --- a/package.json +++ b/package.json @@ -26,5 +26,15 @@ "gh-pages": "^2.0.1", "react": "^16.6.0", "react-dom": "^16.6.0" + }, + "prettier": { + "useTabs": true, + "printWidth": 90, + "tabWidth": 2, + "singleQuote": true, + "trailingComma": "es5", + "jsxBracketSameLine": false, + "parser": "flow", + "semi": false } }