通过node.js模块发送的HTTPS请求与XMLHttpRequest之间有什么区别?
我正在尝试向amazon aws发送HTTPS GET请求以从javascript(XMLHttpRequest)获取安全令牌,并且始终失败并且“Access-Control-Allow-Origin”不允许“Origin http://my_ip”,但如果我通过node.js模块发送相同的HTTPS GET请求,它可以正常工作。
我对此感到困惑,因为如果服务器确实支持CORS,那么来自任何地方的任何请求都应该失败,但它通过node.js,但不通过XMLHttpRequest。
此失败
var url_ = "https://sts.amazonaws.com/?Action=GetSessionToken" +
"&DurationSeconds=3600" +
"&AWSAccessKeyId=XXXXXXXXXXXXXXX" +
"&Version=2011-06-15" +
"&Timestamp=" + encode(timestamp) +
"&Signature=" + encode(hash) +
"&SignatureVersion=2&SignatureMethod=HmacSHA256";
// Simple GET request
$.get(url_, function(data) {
alert("response: " + data);
});
此作品
var https = require('https');
var options = {
host : 'sts.amazonaws.com',
method : 'GET',
path : '/?Action=GetSessionToken' +
'&DurationSeconds=3600' +
'&AWSAccessKeyId=XXXXXXXXXXXXXX' +
'&Version=2011-06-15' +
'&' + timestamp +
'&' + signature +
'&SignatureVersion=2&SignatureMethod=HmacSHA256'
};
https.get(options, function(res) {
res.on('data', function(d) {
process.stdout.write(d);
});
}).on('error', function(e) {
console.error(e);
});
有谁能解释一下这是如何运作的?
答案 0 :(得分:8)
浏览器受Same Origin Policy约束。 Node.js不是。
也就是说,浏览器会让脚本只通过XHR向与加载脚本的页面相同的域中的站点发出HTTP请求。但是,Node.js将允许对任何域的HTTP请求。
(现在使用CORS的浏览器故事稍微复杂一些,但这仍然是基本问题。)
编辑 - 详细说明,现在我已经重新阅读了你的问题:CORS是一个合作协议。互联网上的服务器通常会向任何人提供内容;这就是运行Web服务器的重点。除非请求者询问,否则CORS与HTTP请求无关。如果您有URL“http://x.y.z/something”,并在浏览器的地址栏中输入,那么浏览器将毫不犹豫地向该站点发出HTTP请求。同源策略(和CORS)仅在来自另一个域(而不是“x.y.z”)的站点的页面中的某些代码尝试通过XHR运行HTTP请求时才会发挥作用。在这种情况下,浏览器会向“x.y.z”网站询问访问权限;默认答案是“否”,但这是浏览器强加该规则,而不是服务器。
答案 1 :(得分:2)
环境不同。您通常可以在任何地方自由发送任何HTTP请求(就像您现在正在通过向此站点发送请求一样)。
Node.js代表您提供的程序执行,因此可能是受信任的。这就是默认情况下没有限制的原因。如果您希望包含并运行不受信任的代码,可以添加任意限制 - 只需检查您最喜欢的搜索引擎中的“Node.js不受信任的代码”,以获取有关沙盒可用的一些想法。
另一方面,浏览器几乎总是运行不受信任的代码,但代表用户并拥有所有可能的权限。由于浏览器的环境必须是标准化的,所有浏览器都必须以相同的方式工作,因此作者之间就一系列安全策略达成了一致意见,并且他们在浏览器中实现了对根据same origin policy及以后的CORS以及{{{}}传出的XHR连接的控制权。 3}}。 浏览器本身控制这些限制而不是JavaScript或远程服务器。如果您选择其他语言,您将获得完全相同的环境限制。答案 2 :(得分:1)
node.js是服务器端语言。不要被.js扩展名混淆。当你刚接触它时,这总会导致很多混乱。所以它很像php或C ++。你可以随时随地发送任何请求。访问任何站点(因此https请求)。但在浏览器javascript中,这是一种客户端语言。浏览器不允许您从其他服务器访问页面。说你在host.com:80。您只能从host.com:80/*not host2.com或甚至something.host.com
访问数据这个ddoes不适用于node.js