Удаление конфиденциальной информации из заголовков HTTP в функциях Lambda

Мы можем избежать отображения конфиденциальной информации в заголовках, прерывая ответ HTTP, когда наша функция Lambda получает ошибку. Мы можем быстро создать функцию, которая возвращает только нужные нам свойства и скрывает остальные.

1. Сценарий

Пример Corp имеет несколько микросервисов. Некоторые из этих сервисов работают на основе функций Lambda. Одна из таких функций использует сторонний API для получения некоторых данных. Приложение использует популярный HTTP-клиент axios для выполнения запросов и аутентифицируется с помощью JWT.

Однажды сторонний API ответил ошибкой. Алиса, которая является разработчиком в компании Example Corp, посмотрела логи и, к своему удивлению, увидела нечто подобное:

{
  // lots of other properties
  "headers": {
    "Accept": "application/json",
    "Authorzation": "Bearer <JWT TOKEN HERE>",
    "User-Agent": "axios/0.27.2"
  },
  "method": "get",
}
// more properties
Вход в полноэкранный режим Выход из полноэкранного режима

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

2. Решение

Она хотела применить решение конкретно к запросам, которые приложение делало к стороннему API. Она решила выделить клиент axios для этих вызовов и использовать функцию-перехватчик для удаления конфиденциальной информации из ответа.

2.1. Код

Ей не пришлось проделывать много работы. В итоге ее код был похож на следующий:

import axios from 'axios';

const axiosInstance = axios.create();
axiosInstance.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    const sanitizedError = {
      message: error.message,
      name: error.name,
      stack: error.stack,
      method: error.config.method,
      url: error.config.url,
      status: error.stats,
    };

    return Promise.reject(sanitizedError);
  }
);


// Lambda handler
export const handler = async () => {
  try {
    const { data } = await axiosInstance.get('<URL_TO_CALL>', {
      headers: {
        Authorization: 'Bearer TOKEN',
      },
    });
    // process response
  } catch (error) {
    console.log('An error occurred', error);
    throw error;
  }
};
Войти в полноэкранный режим Выход из полноэкранного режима

Перехватчик axios доступен как на стороне request, так и на стороне response. Здесь мы реализуем перехватчики для response, но перехватчики request работают аналогично.

2.2. Перехватчик

Перехватчики ответа (предоставляемые методом axios.interceptors.response.use()) останавливают ответ и позволяют нам реализовать пользовательскую логику до того, как мы увидим результат.

Аналогично Promises перехватчик принимает два аргумента функции.

Первая функция (successHandler) перехватывает ответ, когда все работает, как ожидалось. Ее аргументом будет объект response. В данном примере мы не хотим ничего делать с ответом, поэтому мы возвращаем его.

Второй аргумент (errorHandler) — это функция, которая изменяет брошенные ошибки. Промежуточное ПО предоставляет объект error в качестве аргумента функции обратного вызова. Мы можем создать пользовательский объект с нужными нам свойствами. Как показано в фрагменте кода, мы игнорируем объект axios config, который содержит токен. Мы сохраняем только те свойства, которые хотим использовать: name, message, method и несколько других.

Давайте теперь вызовем функцию Lambda. Мы должны увидеть только те свойства, которые мы задали в объекте sanitizedError. sanitizedError не содержит headers, поэтому мы больше не увидим в логах заголовок Authorization.

Важно вернуть отклоненный Promise (или выбросить ошибку), иначе axios будет считать ответ успешным.

3. Резюме

Когда запрос axios выбрасывает ошибку, мы увидим весь объект ответа в журналах. Ответ может содержать конфиденциальную информацию, например, токены авторизации. Мы можем удалить эти поля, перехватив ответ и отклонив обещание с помощью пользовательского объекта ошибки.

4. Ссылки, дальнейшее чтение

Перехватчики Axios — Подробнее о перехватчиках Axios

Оцените статью
Procodings.ru
Добавить комментарий