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

Posted

技术标签:

【中文标题】在 Chrome 控制台中使用 Postman 工具/cURL/ 测试 CORS【英文标题】:Testing CORS with the Postman tool/ cURL/ in Chrome console 【发布时间】:2016-11-01 09:19:12 【问题描述】:

我正在使用 Postman 工具测试 CORS,并且不断得到

access-control-allow-origin → null

对于GETOPTIONS 的请求

http://localhost:4000/api/accounts?Host=http://localhost:4200/&X-Origin=http://jquery.com

同样使用Origin 代替X-Origin 不会改变结果。 同时,如果我像这样使用 cURL

 curl -H "Origin: http://jquery.com" --verbose http://localhost:4000/api/accounts

我确实获得了对 API 的访问权限

< access-control-allow-origin: http://jquery.com

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

$.get("http://localhost:4000/api/accounts").then(function(val)console.log(val);)

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

现在我的问题如下:

    如何使用 Postman 正确测试 CORS?我注意到,当将服务器上的允许来源选项设置为 * 时,邮递员确实返回

    access-control-allow-origin → *

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

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

【问题讨论】:

【参考方案1】:

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

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

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

用户代理验证其所在位置的值和来源 请求发起的匹配。

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

【讨论】:

【参考方案2】:

你可以试试

curl -X OPTIONS 'https://domain/path/file.png' -H "Origin: https://yoursitedomain" -H "Access-Control-Request-Method: GET" -v -o /dev/null

【讨论】:

以上是关于在 Chrome 控制台中使用 Postman 工具/cURL/ 测试 CORS的主要内容,如果未能解决你的问题,请参考以下文章

关于http测试总结

Postman之API测试使用全指南

Postman配合Postman Intercepter使用

Chrome的Postman的使用

如何在Chrome下使用Postman进行rest请求测试

会话 cookie 在 Postman 中成功运行,而不是 Chrome