Получение ошибки HTTP 403 при запросе с помощью NodeJS при работе с Python, cURL,

#node.js #request

Вопрос:

Я пытаюсь отправить запрос POST с помощью NodeJS, который содержит данные Json, но я получаю ошибку 403 Forbidden.

Чего я не понимаю, так это того, что один и тот же запрос отлично работает, когда я отправляю его с использованием других языков/программного обеспечения, таких как cURL, Python и Postman.

Для этого я использую пакет запроса и автоматически сгенерированный код почтальона :

 var request = require('request');
var options = {
  'method': 'POST',
  'url': apiDomain,
  body: myPayload

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
 

Но, как упоминалось выше, он продолжает возвращать ошибку 403.
Я также попытался отправить запрос с помощью axios, пакетов с обещаниями запроса, но та же проблема, даже с X-Requested-With заголовком, который упоминался в других темах StackOverlow.

Я заметил, что он работает и возвращает нужные данные, когда запрос настроен на использование прокси-сервера Fiddler Everywhere, что делается путем настройки следующих параметров :

 ca: fs.readFileSync("/path/to/FiddlerCertificate.cer").toString(),
rejectUnauthorized: false,
agent: new HttpsProxyAgent("http://127.0.0.1:8866")
 

Единственное различие между запросом почтальона (который работает) и запросом NodeJS заключается в заголовке «Соединение: поддерживать связь», который присутствует в запросе, выполненном с использованием NodeJS…

ИЗМЕНИТЬ : Проблема может быть связана с TLS. Но это не объясняет, почему NodeJS не выполняет такие действия автоматически, как cURL или Python…

Ответ №1:

Наконец — то я нашел решение. Анализируя пакеты с помощью Wireshark и Fiddler, я заметил, что NodeJS использует TLSv1.3, когда Postman использует TLSv1.2. Именно это вызвало разницу между инструментами, которые я использовал для тестирования.

Чтобы заставить модули запросов и обещаний NodeJS работать с TLSv1.2, вам просто нужно добавить следующее в объект параметров запроса :

 agentOptions: {
    secureProtocol: 'TLSv1_2_method'
}
 

Комментарии:

1. Вы пишете «TSL», но имели ли вы в виду «TLS»? Безопасность Транспортного Уровня

2. @Wyck Да, TLS. Я отредактировал ответ, спасибо!