修改说明:这个问题是关于为什么XMLHttpRequest/fetch等。在浏览器上,Postman不受相同访问策略限制(您会收到提到CORB或CORS的错误)。这个问题不是关于如何修复“No‘Access Control Allow Origin’…”错误。这是关于它们发生的原因。
请停止发布:阳光下每种语言/框架的CORS配置。而是找到相关语言/框架的问题。允许请求绕过CORS的第三方服务用于关闭各种浏览器的CORS的命令行选项
我试图通过连接RESTful API内置Flask来使用JavaScript进行授权。但是,当我发出请求时,我会收到以下错误:
XMLHttpRequest cannot load http://myApiUrl/login.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'null' is therefore not allowed access.
我知道API或远程资源必须设置标头,但当我通过Chrome扩展Postman发出请求时,为什么它会起作用?
这是请求代码:
$.ajax({
type: 'POST',
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain: true,
xhrFields: {
withCredentials: true,
},
})
.done(function (data) {
console.log('done');
})
.fail(function (xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
警告:使用访问控制允许来源:*会使您的API/网站易受跨站点请求伪造(CSRF)攻击。在使用此代码之前,请确保您了解风险。
如果您使用的是PHP,这很容易解决。只需在处理请求的PHP页面的开头添加以下脚本:
<?php header('Access-Control-Allow-Origin: *'); ?>
如果您使用的是Node red,则必须通过取消注释以下行,在Node red/settings.js文件中允许CORS:
// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
origin: "*",
methods: "GET,PUT,POST,DELETE"
},
如果您使用的是与问题相同的Flask;你必须先安装烧瓶胸衣
pip install -U flask-cors
然后在应用程序中包含Flask cors包。
from flask_cors import CORS
一个简单的应用程序如下所示:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route("/")
def helloWorld():
return "Hello, cross-origin-world!"
有关详细信息,请查看Flask文档。
解决方案和问题来源
您正在向不同的域发出XMLHttpRequest,例如:
域一:some-Domain.com域二:some-different-Domain.com
域名的这种差异触发了名为SOP(同源策略)的CORS(跨源资源共享)策略,该策略强制在Ajax、XMLHttpRequest和其他HTTP请求中使用相同的域(因此是源)。
当我通过Chrome扩展发出请求时,为什么它会起作用邮递员
客户端(大多数浏览器和开发工具)可以选择强制执行同源策略。
大多数浏览器强制执行同源策略,以防止与CSRF(跨站点请求伪造)攻击相关的问题。
Postman作为一种开发工具,在某些浏览器强制执行SOP时选择不强制执行SOP,这就是为什么您可以通过Postman发送请求,而不能使用浏览器通过JS通过XMLHttpRequest发送请求。