使用Postman工具/ cURL /在Chrome控制台中测试CORS

use*_*827 7 curl cors google-chrome-devtools postman

我正在使用Postman工具测试CORS并且我经常得到

access-control-allow-origin ? null
Run Code Online (Sandbox Code Playgroud)

对于GETOPTIONS要求

http://localhost:4000/api/accounts?Host=http://localhost:4200/&X-Origin=http://jquery.com
Run Code Online (Sandbox Code Playgroud)

也使用OriginX-Origin不是改变结果.同时,如果我像这样使用cURL

 curl -H "Origin: http://jquery.com" --verbose http://localhost:4000/api/accounts
Run Code Online (Sandbox Code Playgroud)

我确实可以访问API

< access-control-allow-origin: http://jquery.com
Run Code Online (Sandbox Code Playgroud)

我还使用httpchrome javascript控制台打开jQuery网站以执行此代码:

$.get("http://localhost:4000/api/accounts").then(function(val){console.log(val);})
Run Code Online (Sandbox Code Playgroud)

它打印了API返回的JSON对象.

现在我的问题如下:

  1. 如何使用Postman正确测试CORS?我注意到,当设置服务器上的allow origin选项时,*Postman确实会返回

    access-control-allow-origin ? *

只有当我明确允许一组来源时才会出现上述问题:

`origin: ["https://www.getpostman.com/", "http://localhost:4200/", "http://jquery.com"]`
Run Code Online (Sandbox Code Playgroud)
  1. 我注意到允许http://jquery.com/http://jquery.com不允许来源的请求Origin=http://jquery.com
  2. 我注意到,即使请求来自非授权来源,cURL也会返回资源的内容(在本例中为JSON数据).这是正常的还是意味着我忘了在服务器上配置暴露这些数据的东西?

小智 14

你可以试试

curl -X OPTIONS 'https://domain/path/file.png' -H "Origin: https://yoursitedomain" -H "Access-Control-Request-Method: GET" -v -o /dev/null
Run Code Online (Sandbox Code Playgroud)


Gid*_*zer 7

Origin从客户端发送的标头是请求源自的方案,域和端口(如果不是80).尾部/在标题中无效.您也不能发送多个来源.在Access-Control-Allow-Origin从服务器发送可以是*,允许所有的起源,或者你从请求头传回相同的起源.

例如,如果您http://www.telerik.com/在Chrome中发出请求,则请求标头包含Origin:http://www.telerik.com(浏览器自动发送此请求),并且服务器的响应标头包含Access-Control-Allow-Origin:http://www.telerik.com.

至于你的上一个问题,根据规范,用户代理负责执行CORS,所以我怀疑cURL不会验证请求和响应是否匹配.

用户代理验证请求源自的位置的值和来源是否匹配.

资料来源: https ://www.w3.org/TR/cors/