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
}
}