From 37505910ffee8218f7b28daf7e4d69992623595d Mon Sep 17 00:00:00 2001 From: Oleg Zuev Date: Thu, 21 Mar 2019 21:29:12 +0700 Subject: [PATCH 1/3] add nodejs example --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++----- package.json | 10 ++++++++++ 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0e4d555..200290f 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,45 @@ 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 = + 'https://example.com/?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 checkVKQueryParamsSign = params => { + const list_of_params = Object.entries(params) //перевод в обьекта параметро в список + .filter(e => e[0].startsWith('vk_')) //фильтрация параметров VK + .sort((a, b) => { + if (a[0] < b[0]) { + return -1 + } + if (a[0] > b[0]) { + return 1 + } + return 0 + }) //сортировка по алфавиту + const params_str = stringify( + list_of_params.reduce((obj, [k, v]) => ({ ...obj, [k]: v }), {}) + ) //перевод параметров в строковый вид + + const hmac = crypto.createHmac('sha256', CLIENT_SECRET) //инициализация генератора подписи + hmac.update(params_str) //добавление строки с параметрами + 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 } } From 7c0d312a985bd1cfd478b9655657c7e73335060d Mon Sep 17 00:00:00 2001 From: Oleg Zuev Date: Thu, 21 Mar 2019 22:32:02 +0700 Subject: [PATCH 2/3] refactoring nodejs example --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 200290f..b48352e 100644 --- a/README.md +++ b/README.md @@ -161,9 +161,11 @@ const URL = 'https://example.com/?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 list_of_params = Object.entries(params) //перевод в обьекта параметро в список - .filter(e => e[0].startsWith('vk_')) //фильтрация параметров VK + const listOfParams = Object.entries(params) //перевод в обьекта параметро в список + .filter(isVKParam) //фильтрация параметров VK .sort((a, b) => { if (a[0] < b[0]) { return -1 @@ -173,12 +175,12 @@ const checkVKQueryParamsSign = params => { } return 0 }) //сортировка по алфавиту - const params_str = stringify( - list_of_params.reduce((obj, [k, v]) => ({ ...obj, [k]: v }), {}) + const paramsStr = stringify( + listOfParams.reduce((obj, [k, v]) => ({ ...obj, [k]: v }), {}) ) //перевод параметров в строковый вид const hmac = crypto.createHmac('sha256', CLIENT_SECRET) //инициализация генератора подписи - hmac.update(params_str) //добавление строки с параметрами + hmac.update(paramsStr) //добавление строки с параметрами const sign = hmac .digest('base64') .replace(/\+/g, '-') From 99215b7e4aebf1fc84d65eb71fa8994b1007fe16 Mon Sep 17 00:00:00 2001 From: Oleg Zuev Date: Thu, 21 Mar 2019 22:34:42 +0700 Subject: [PATCH 3/3] fix example URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b48352e..4df86ab 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ const crypto = require('crypto') //модуль для криптографии const { stringify, parse } = require('querystring') //методы для парсинга строки const URL = - 'https://example.com/?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', + '?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_')