当 NodeJS 使用 Python、cURL、
Getting an HTTP 403 error on a request with NodeJS when it works with Python, cURL,
我正在尝试使用包含 Json 数据的 NodeJS 发出 POST 请求,但我收到 403 禁止错误。
我不明白的是,当我使用 cURL、Python 和 Postman 等其他 languages/software 发出同一个请求时,它工作得很好。
为此,我使用了请求包和自动生成的 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,request-promise 包发送请求,但同样的问题,即使使用其他 StackOverlow 主题中提到的 X-Requested-With
header。
我注意到它正在工作,并且当请求配置为使用 Fiddler Everywhere 代理时,它 returns 需要的数据,这是通过设置以下选项来完成的:
ca: fs.readFileSync("/path/to/FiddlerCertificate.cer").toString(),
rejectUnauthorized: false,
agent: new HttpsProxyAgent("http://127.0.0.1:8866")
邮递员请求(有效)和 NodeJS 请求之间的唯一区别是“连接:keep-alive”header,它出现在使用 NodeJS 完成的请求中...
EDIT :问题可能来自 TLS。但这并不能解释为什么 NodeJS 不能像 cURL 或 Python...
那样自动执行操作
我终于找到了解决办法。
通过使用 Wireshark 和 Fiddler 分析数据包,我注意到当 Postman 使用 TLSv1.2 时,NodeJS 使用 TLSv1.3。这就是导致我用来测试的工具之间存在差异的原因。
要强制 NodeJS 请求和请求承诺模块使用 TLSv1.2,您只需将以下内容添加到您的请求选项对象中:
agentOptions: {
secureProtocol: 'TLSv1_2_method'
}
我正在尝试使用包含 Json 数据的 NodeJS 发出 POST 请求,但我收到 403 禁止错误。
我不明白的是,当我使用 cURL、Python 和 Postman 等其他 languages/software 发出同一个请求时,它工作得很好。
为此,我使用了请求包和自动生成的 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,request-promise 包发送请求,但同样的问题,即使使用其他 StackOverlow 主题中提到的 X-Requested-With
header。
我注意到它正在工作,并且当请求配置为使用 Fiddler Everywhere 代理时,它 returns 需要的数据,这是通过设置以下选项来完成的:
ca: fs.readFileSync("/path/to/FiddlerCertificate.cer").toString(),
rejectUnauthorized: false,
agent: new HttpsProxyAgent("http://127.0.0.1:8866")
邮递员请求(有效)和 NodeJS 请求之间的唯一区别是“连接:keep-alive”header,它出现在使用 NodeJS 完成的请求中...
EDIT :问题可能来自 TLS。但这并不能解释为什么 NodeJS 不能像 cURL 或 Python...
那样自动执行操作我终于找到了解决办法。 通过使用 Wireshark 和 Fiddler 分析数据包,我注意到当 Postman 使用 TLSv1.2 时,NodeJS 使用 TLSv1.3。这就是导致我用来测试的工具之间存在差异的原因。
要强制 NodeJS 请求和请求承诺模块使用 TLSv1.2,您只需将以下内容添加到您的请求选项对象中:
agentOptions: {
secureProtocol: 'TLSv1_2_method'
}