#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. Я отредактировал ответ, спасибо!