邮递员

这个问题已经被问过好几次了,但我还是不明白:

当我读到

没有“访问控制-允许-起源”标头

问题,它说应该在请求的服务器上设置一个设置,以允许跨域: add_header 'Access-Control-Allow-Origin' '*';

但是,请告诉我为什么当从 邮递员(它是一个客户端)询问时,它的工作像一个魅力,我有一个来自请求的服务器的响应?

谢谢你

251041 次浏览

正如@Musa 评论的那样,原因似乎是:

Postman 不关心 SOP,它是一个开发工具,而不是浏览器

顺便说一下,这里有一个 铬合金扩展,以便让它在你的浏览器上工作(这是一个为 chrome,但你可以找到任何一个为 FF 或 Safari)。

检查 给你,如果你想了解更多关于 交叉起源和为什么它的工作扩展。

CORS (跨来源资源共享)和 SOP(同源策略)是服务器端配置。

与客户有关

  • 大多数 浏览器 执行它可以防止与 CSRF相关的问题攻击。
  • 大部分 开发工具 我不在乎都是这样。

如果你使用一个网站并且你填写了一个表格来提交信息(例如你的社会安全号码) ,你需要确保信息正在被发送到你认为它正在被发送的网站。因此,浏览器被设计成默认情况下说,“不要将信息发送到正在访问的域以外的域”。

最终,这变得过于局限,但默认的想法仍然保留在浏览器中。不要让网页发送信息到不同的域。但这些都是浏览器检查。Chrome 和 firefox 等浏览器已经内置了这样的代码: “在发送此请求之前,我们将检查目的地是否与所访问的页面相匹配”。

Postman (或 cmd 行上的 CURL)没有内置这些检查。你手动与一个网站交互,这样你就可以完全控制你发送的内容。

虽然这里的所有答案都很好地解释了什么是 cors,但是对你的问题的直接答案将是由于以下差异邮递员和浏览器。

Browser: 在向 API 端点发送任何新请求之前,发送 OPTIONS调用来检查服务器类型并获取头信息。检查 Access-Control-Allow-Origin。考虑到这一点,Access-Control-Allow-Origin头只是指定哪些所有的 CROSS ORIGINS 是允许的,尽管默认情况下浏览器将只允许相同的原点。

邮递员: 直接发送 GETPOSTPUTDELETE等请求,而不检查服务器类型,并通过对服务器的 OPTIONS调用获得头 Access-Control-Allow-Origin

通常,Postman 用于调试,并在开发阶段使用。但是,如果你想阻止它甚至从邮递员尝试这一点。

    const referrer_domain = "[enter-the-domain-name-of-the-referrer]"
//check for the referrer domain
app.all('/*', function(req, res, next) {
if(req.headers.referer.indexOf(referrer_domain) == -1){
res.send('Invalid Request')
}


next();
});

使用浏览器/chrome 邮递员插件像网站一样检查 CORS/SOP。 使用桌面应用程序来避免这些控件。