Подпись

Потихоньку начинаем приближать нашу api к vkma. Основное требование безопасности – это подпись параметров. Многие не понимают как принцип, так и смысл реализации подписи, об этом я и расскажу. Когда вы входите в ваш сервис, в него передаются некие данные для реализации проверки подлинности запросов пользователя. Основная цель подписи – узнать id пользователя и другие параметры в зависимости от задачи. Вот пример параметров (они могут быть другими, в зависимости от платформы, версий приложения и тд.): vk_user_id – основной параметр, ID пользователя; vk_app_id ID приложения, которое было запущенно; vk_is_app_user установлен ли сервис; vk_are_notifications_enabled показывает, разрешены ли уведомления; vk_language – язык пользователя; vk_ref откуда был совершён переход; vk_access_token_settings права доступа; vk_group_id ID сообщества; vk_viewer_group_role – роль пользователя из сообщества; vk_platform на какой платформе запущен сервис; vk_is_favorite индикатор добавления в избранное сервиса; vk_ts время генерации параметров запуска; sign сама подпись. Как видите, все нужные параметры начинаются с vk и сама подпись это sign.

Суть подписи в том, чтобы проверить все параметры, начинающиеся с vk_ и сравнить полученную строку с sign. Если они идентичны, то подпись мы проверили, и все данные, начинающиеся с vk_ – истинные. Проверка подписи полностью безопасна. На стороне её выполнить невозможно без специального защищённого ключа, который есть только у вас. Получить его можно в настройках приложения.

Устанавливаем нужные зависимости:

NPM :

npm i -s querystring crypto

YARN:

yarn add querystring crypto

Далее открываем папку module и создаем в ней sign.js:

'use strict';

const qs = require('querystring');
const crypto = require('crypto');

module.exports = (_token) => {
    if (_token) {
        let _url_params = qs.parse(_token);
        let ordered = {};
        Object.keys(_url_params).sort().forEach((key) => {
            if (key.slice(0, 3) === 'vk_') {
                ordered[key] = _url_params[key];
            }
        });
        const stringParams = qs.stringify(ordered);
        const paramsHash = crypto
            .createHmac('sha256', process.env.SECRET_CODE)
            .update(stringParams)
            .digest()
            .toString('base64')
            .replace(/\+/g, '-')
            .replace(/\//g, '_')
            .replace(/=$/, '');

        return paramsHash === _url_params?.sign ?
                              _url_params : undefined
    }
    else {
        return undefined;
    }
}

На выходе мы получаем либо все параметры запуска, либо undefined в зависимости от результата проверки подписи. Далее у нас есть в этом коде process.env.SECRET_CODE Переходим на страницу с нашими сервисами : https://vk.com/apps?act=manage Далее заходим "Редактировать" -> "Настройки" -> Защищённый ключ. Копируем строку в буфер и переходим далее в VS Code. Открываем .vscode/launch.json и добавляем защищённый ключ в env:

***
"env": {
          ***
          "SECRET_CODE": "hjdfgbdhjdjhfcvhjdf",
          ***
}
***

В дальнейшем, если защищённый ключ будет меняться, его будет достаточно поменять в env. На этом с проверкой подписи мы закончили, а применять её мы будем уже в следующей главе.

Last updated

Was this helpful?