Postman скрипт для обновления токена авторизации
Недавно по работе занимался тестированием очередного апи и столкнулся с таким неудобством, что все запросы требуют авторизации, а токен живёт всего 5 минут. Из-за этого приходилось постоянно делать запрос авторизации и обновлять токен вручную.
В какой-то момент мне это надоело, и я задумался, как это дело автоматизировать. Узнал, что можно написать Pre-request скрипт для коллекции в постмане, который будет выполняться перед каждым запросом, а уже в этом скрипте делать запрос токена авторизации.
С какими сложностями мне пришлось столкнуться… Ну во-первых, пришлось немного полазить в доке постмана, но там только поверхностно описано, не смог найти как сделать запрос. Гуглёж вопросов других бедолаг мне тоже не особо помог, т.к. там были немного другие кейсы.
Мне неожиданно помогла локально запущенная лама, которая мощно сходу дала мне хорошую подсказку, как сделать в скрипте постмана запрос с телом urlencoded и сохранить из него ответ в переменные. Чем я собственно и хотел поделиться.
Итак исходное положение. Имеем некую коллекцию запросов в постмане и все креды для авторизации сохранённые в переменных.
У нас есть запрос Auth, который получает токен авторизации.
curl --location 'https://your-pretty-url.com/oauth' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=your_client_id' \
--data-urlencode 'client_secret=you_client_secret' \
--data-urlencode 'grant_type=client_credentials'

В ответе получаем следующий объект:
{
access_token: string,
expires_in: number,
token_type: "Bearer"
}
В коллекции у нас настроена авторизация, а все остальные рабочие запросы её наследуют.

Далее мною был написан следующий Pre-request скрипт:

// Названия переменных коллекции.
const token_life_time_name = 'token_life_time'
const token_time_name = 'token_time'
const client_id_name = 'client_id'
const client_secret_name = 'client_secret'
const auth_base_url_name = 'auth_base_url'
const token_name = 'token'
// Берём из переменных коллекции время жизни
// токена и время последнего обновления токена.
// Пишем '+' чтобы преобразовать строку к числу.
const token_life_time = +pm.collectionVariables.get(token_life_time_name)
const last_token_time = +pm.collectionVariables.get(token_time_name)
// Вычисляем сколько секунд прошло с последнего
// обновления токена и пишем в лог.
// Делим на 1000 чтобы получить значение в секундах.
let expiration_token = (Date.now() - last_token_time) / 1000
console.log('expiration token ' + expiration_token)
// Если с последнего обновления токена прошло больше
// времени чем время жизни токена, то заходим в условие.
if (expiration_token > token_life_time) {
console.log('getting new token')
// Тело запрос urlencoded.
const body = [
{ 'key': 'client_id', 'value': pm.collectionVariables.get(client_id_name) },
{ 'key': 'client_secret', 'value': pm.collectionVariables.get(client_secret_name) },
{ 'key': 'grant_type', 'value': 'client_credentials' },
]
// Объект запроса в постман.
const postRequest = {
url: pm.collectionVariables.get(auth_base_url_name) + '/oauth2/token',
method: 'POST',
header: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
},
body: {
mode: 'urlencoded',
urlencoded: body,
}
}
// Отправляем запрос и обрабатываем ответ.
// Сохраняем в переменные сам токен и его время жизни.
// В принципе, время жизни можно и не сохранять,
// а захардкодить в этом скрипте в константу, т.к. оно обычно не меняется.
pm.sendRequest(postRequest, (error, response) => {
const access_token = response.json().access_token
const expires_in = response.json().expires_in
pm.collectionVariables.set(token_name, access_token)
pm.collectionVariables.set(token_life_time_name, expires_in)
})
// Устанавливаем текущее время как время обновления токена.
pm.collectionVariables.set(token_time_name, Date.now())
}
Для работы этого скрипта вам нужно в переменных коллекции создать все переменные которые используются в функциях pm.collectionVariables.get и pm.collectionVariables.set или подставить в скрипт свои названия. Ну или по ситуации подправить под себя скрипт и указать свои значения переменных.
После этого этого пробуем выполнять любой запрос в коллекции и в консоли постмана можем наблюдать логи нашего скрипта.

Время жизни токена в моём случае составляет 300 секунд. И поэтому в логах мы видим, если expiration token > 300, то видим лог «getting new token», а стрелкой на рисунке как раз запрос в котором берётся новый токен, как видно он в консоли отображается светло серым цветом, по сравнению с запросами, которые мы выполняем из коллекции.
Если expiration token < 300, то нет необходимости обновлять токен и сразу выполняется наш тестируемый запрос.
Вот так, сам не смог найти быстрого решения, поэтому решил поделиться, строго не судите, это вроде бы моя первая публикация.