Postman: nginx secure link

В предыдущей статье рассматривался вариант защищённых ссылок, которые предоставляет модуль ngx_http_secure_link_module веб-сервера nginx. В этой статье рассмотрим, как тестировать этот вид ссылок в программе Postman, - как автоматически вычислять md5 хэш от переменных и постоянных параметров.

Динамические параметры Postman

В программе Postman можно использовать переменные, которые могу выступать и частью URL, и значениями параметров запроса. Так ссылка /s/api/v1/auth/?md5=1pzX968MiqPu_ZvYYht5Xg&expires=1704067200 из прошлой статьи с применением переменных должна стать такого вида: /s/api/v1/auth/?md5={{md5}}&expires={{expires}}

Переменные удобно привязывать к настройкам окружения - кнопка с глазом - "Environment quick look". Настройки окружения удобно делать для нескольких инсталляций сайтов (боевой, тестовый, локальный и пр.). В программе Postman просто переключать окружение и отправлять запрос на нужный домен. При этом все прочие параметры запроса остаются и не нужно их менять вручную или создавать дублирующие запросы под каждую инсталляцию сайта. Выглядит это так:

Простые статичные значения параметров можно задать напрямую для каждого окружения. В моём примере так может быть настроено для параметра {{domain}} - это заранее известные, не меняющиеся адреса сайтов (тестового, боевого и прочих - в зависимости от окружения).

Но бывают также динамические значения параметров - те, которые меняются с каждым запросом, зависят от чего-то. В моём примере - это {{expires}} (время по которое будет действительной защищённая ссылка) и {{md5}} (хеш, который вычисляется от набора других параметров).

Динамические значения параметров

В Postman есть встроенный язык программирования (JavaScript), на котором в частности перед выполнением запроса можно производить вычисление значений динамических параметров. Т.е. сначала вычисляем значение параметров, затем они автоматически подставляются в параметры запроса и запрос выполняется с этими вычисленными значениями. Это избавляет от необходимости вручную производить вычисления и подставлять значения в параметры запроса, но заставляет вникнуть в систему работы с динамическими параметрами Postman.

Например, для того, чтобы подставить конкретное значение времени, когда ссылка перестанет действовать, код в Postman будет выглядеть так:

pm.environment.set("expires", 1704067200);

Этот небольшой скрипт нужно вписывать на вкладке Pre-req. в Postman. Подробнее об этом написании скриптов внутри Postman - в документации программы.

Со статическим значением всё понятно. А вот как можно сделать параметр {{expired}} динамическим - через один час после текущего времени:


var timeStamp = Math.round(new Date().getTime() / 1000.) + 3600;  // Plus 1 hour
pm.environment.set("expires", timeStamp);

Получение текущего IP клиента

Одним из параметров для реализации secure link может быть IP адрес клиента. Получить IP адрес компьютера в сети Internet нельзя напрямую из JavaScript. Но выход всё равно есть (если не хочется статично прописать IP), - можно запросить IP адрес на каком-нибудь сайте. Например, на Stackoverflow перечислено множество таких онлайн сервисов. Я тут применил один из них. Так в Postman можно получить IP адрес клиента в Internet:


const requestParams = {
    url: "https://ipapi.co/json/",
    method: "GET",
    header: {
        "cache-control": "no-cache",
        "content-type": "application/json"
    }
}

// Вычисляем текущий IP запросом к внешнему сервису
pm.sendRequest(requestParams, function (err, res) {
    const jsonResponse = res.json();

    let myIp = "127.0.0.1";

    if (!!jsonResponse.ip) {
        myIp = jsonResponse.ip;
    }
});

В результате в JavaScript переменной myIp будет либо реальный внешний адрес компьютера, либо локальный адрес 127.0.0.1 в случае проблем определения.

Формирование md5 в Postman

Теперь переходим к самой сложной части, - как в Postman получить md5 хеш перед каждым запросом. Сложность в том, что функции хеширования алгоритмом md5 - в JavaScript нет. Но есть реализации этого метода в различных библиотеках. Проблема только в том, что внутри Postman мы ограничены в возможностях подключения внешних ресурсов. Но по счастливому стечению обстоятельств в Postman уже подключена библиотека CryptoJS, в которой есть реализация алгоритма md5. В документации библиотеки не так уж полно и ясно освещён момент работы с хешированием md5, - пришлось многое додумывать самостоятельно.

При вычислении хеша для secure link есть хитрости. Сначала надо получить бинарное значение хеша, затем преобразовать его в base64 и в конце ещё сделать замену нескольких специальных символов.

В целом рабочий скрипт Postman для secure link параметров выглядит так:

var timeStamp = Math.round(new Date().getTime() / 1000.) + 3600;
pm.environment.set("expires", timeStamp);

const requestParams = {
    url: "https://ipapi.co/json/",
    method: "GET",
    header: {
        "cache-control": "no-cache",
        "content-type": "application/json"
    }
}

// Вычисляем текущий IP запросом к внешнему сервису
pm.sendRequest(requestParams, function (err, res) {
    const jsonResponse = res.json();

    let myIp = "127.0.0.1";

    if (!!jsonResponse.ip) {
        myIp = jsonResponse.ip;
    }

    const secureLinkForHash = timeStamp +
        "/s/api/v1/auth/" + myIp + " " +
        pm.environment.get("api_secret");

    let md5Hash = CryptoJS.MD5(secureLinkForHash);

    var hash2 = md5Hash.toString(CryptoJS.enc.Base64);

    hash2 = hash2.replace(/=/g, '')
        .replace(/\+/g, '-')
        .replace(/\//g, '_');

    pm.environment.set("md5", hash2);
});

В этом варианте остаётся жестко зафиксированной часть URL - /s/api/v1/auth/ - я уже решил на этом остановиться и эту часть нужно поменять на нужное значение в каждом запросе из коллекции Postman.

Postman - торт

В очередной раз убедился, какая же полезная и удобная программа, этот Postman. Удалось автоматизировать даже вычисление довольно сложного хеша на базе нескольких динамических параметров.

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа