Вопрос или проблема
В настоящее время в своем проекте я реализовал CORS с использованием функции обратного вызова, как показано в официальной документации npm cors.
const whitelistedDomain = ['https://test1.com', 'https://test2.com', 'https://test3.com'];
const corsConfiguration = {
origin: (origin, callback) => {
if (whitelistedDomain.indexOf(origin) !== -1) {
logger.info('Разрешенный домен, обращающийся к серверу -> ' + origin);
callback(null, true);
} else {
callback(new Error(`Этот домен не в белом списке -> ${origin}`));
}
},
optionsSuccessStatus: 200, // Для поддержки устаревших браузеров
credentials: true,
};
app.use(cors(corsConfiguration));
Когда я запускаю это в локальной среде, я попытался вызвать API, поставив домен, не входящий в белый список, в заголовке запроса Origin. Сервер возвращает ошибку, как и предполагалось, а в журнале консоли отображается следующее:
Этот домен не в белом списке -> https://test4.com
Однако мое приложение было опубликовано на AWS ECS, и когда я попытался получить доступ к API, используя домен, не входящий в белый список, он по-прежнему смог успешно вызвать API, и CORS не сработал. В AWS Cloudwatch показан следующий журнал:
Этот домен не в белом списке -> undefined
Все работает нормально с доменом, не входящим в белый список, и он должен был записать это в Cloudwatch, но этого не произошло, что означает, что программа вообще не выполняет этот код.
Разрешенный домен, обращающийся к серверу -> {{разрешенный домен}}
Мне кажется, что что-то произошло на бэкенде AWS, поскольку задействованы балансировщики нагрузки, которые могут потреблять некоторые элементы в заголовке запроса?
Мой вопрос заключается в том, как мне отладить зависимость CORS в этой строке?
app.use(cors(corsConfiguration));
Я хочу получить доступ к интерфейсу CorsRequest и вывести в консоль IncomingHttpHeaders, которые находятся внутри самой библиотеки cors.
Ответ или решение
Для отладки настроек CORS в вашем приложении, работающем на AWS ECS, можно использовать несколько подходов для анализа и логирования информации о запросах, включая интерфейс CorsRequest
и заголовки IncomingHttpHeaders
. Вот шаги, которые помогут вам сделать это:
1. Редактирование конфигурации CORS:
Чтобы логировать информацию о заголовках запроса и проверить, корректно ли поступает заголовок Origin
, можно изменить вашу конфигурацию CORS следующим образом:
const corsConfiguration = {
origin: (origin, callback) => {
// Логируем весь объект запроса
console.log('Incoming Request Headers:', origin);
// Дополнительный лог для анализа
console.log('CorsRequest Object:', { requestOrigin: origin });
// Проверяем, есть ли origin в белом списке
if (whitelistedDomain.indexOf(origin) !== -1) {
logger.info('Whitelisted domain that is calling the server -> ' + origin);
callback(null, true);
} else {
callback(new Error(`This domain is not whitelisted -> ${origin}`));
}
},
optionsSuccessStatus: 200, // Для поддержки устаревших браузеров
credentials: true,
};
2. Использование Middleware для логирования заголовков:
Если вы хотите захватить больше информации из заголовков HTTP, добавьте middleware перед CORS, чтобы логировать все заголовки:
app.use((req, res, next) => {
console.log('Incoming Request Headers:', req.headers);
next(); // Продолжаем выполнение следующего middleware
});
app.use(cors(corsConfiguration));
3. Проверка конфигурации AWS:
Убедитесь, что в настройках вашего нагрузки (Load Balancer) не происходит фильтрация или изменение заголовков. Важно, чтобы заголовок Origin
передавался до вашего приложения. Зачастую Load Balancer может перехватывать CORS-запросы и не передавать их корректно. Проверьте следующее:
- Настройки CORS в Load Balancer: Если используется Application Load Balancer (ALB), проверьте настройки CORS, чтобы удостовериться, что заголовки не перехватываются.
- Проверка сетевых потоков: Убедитесь, что ваши сетевые правила безопасности и группы безопасности (Security Groups) позволяют прохождение трафика как для HTTP, так и для HTTPS.
4. Тестирование API:
Проверьте API, используя инструмент, как Postman
, чтобы имитировать вызовы из неразрешенных доменов. Таким образом, вы сможете увидеть, как ваше приложение реагирует вне браузера.
Заключение:
Корректное использование логов и анализ заголовков поможет выявить проблему. Учтите, что помимо конфигурации вашего приложения, проблемы с CORS также могут быть вызваны настройками инфраструктуры, такой как Load Balancer и правилами безопасности в AWS. Используйте приведенные рекомендации для углубленного анализа и логирования.