javascript - 无法使用 JavaScript Fetch API 调用 Apache Airflow REST API(CORs 错误)
问题描述
使用 Apache Airflow REST API,并遇到 CORS 问题。
在 JavaScript 中使用 fetch API 调用端点时,出现以下错误:
Access to fetch at 'my_url/api/v1/dags/example_bash_operator/tasks' from origin 'my_url' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
这就是我所说的:
let url = "my_url/api/v1/dags/example_bash_operator/tasks";
let username = 'my_username';
let password = 'my_password';
let headers = new Headers();
headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
fetch(url, {
headers: headers,
method: 'GET',
})
.then(response => response.json())
.then(data => {
console.log('Success:', data);
})
.catch((error) => {
console.error('Error:', error);
});
我也尝试添加mode: 'no-cors'
,但只是得到“输入意外结束”错误。
对于某些背景,以下工作正常:
- 启动气流网络服务器和调度程序
- 访问气流用户界面
- 访问 SwaggerUI 验证 Swagger 并使用此工具调用 REST 端点
- 在新浏览器选项卡的地址栏中调用 my_url(返回预期的 JSON)
我已经设置auth_backend
了airflow.cfg
:
auth_backend = airflow.api.auth.backend.default
尽管使用最新的 REST API 版本,我认为这没有什么不同,因为一切都设置为拒绝。
我还按照文档中的描述设置了访问控制标头:airflow.cfg
access_control_allow_headers = origin, content-type, accept
access_control_allow_methods = POST, GET, OPTIONS, DELETE
access_control_allow_origin = my_url
...并且还尝试使用通配符access_control_allow_origin
:
access_control_allow_origin = *
因此,REST 调用通过 Swagger 和浏览器地址栏可以正常工作,但我无法使用 JS 进行 fetch 调用。请注意,JS 与气流文件位于同一服务器(和同一根目录)上的 index.html 文件中。
解决方案
所描述的行为是有道理的,因为浏览器使用 CORS 来防止来自不同资源的脚本的攻击。您仍然可以通过 Swagger、Postman 或其他工具获取,甚至通过浏览器通过地址栏。但是如果策略不允许从不同的来源获取,那么浏览器会阻止从您的脚本中获取,这可能是在不同的端口上提供的。Origin 包含主机和端口。
您的主要问题,我目前无能为力。我遇到了无法通过 (docker-compose) 环境变量在 Airflow 2.0 服务器/API 中设置源策略的问题AIRFLOW__API__ACCESS_CONTROL_ALLOW_ORIGIN
。也许这与您的问题有关,因为我可以从您问题的 url(包含 v1)中看到您也在使用 Airflow 2.x。
顺便说一句,来自chrome的消息是CORS error: Preflight Missing Allow Origin Header
,指的是原始问题评论中的问题。
推荐阅读
- docker - GitHub Docker 操作拉取请求分支
- google-chrome-extension - LocalStorage 在我的 chrome 扩展中不起作用
- summernote - Summernote 从 php 中获得很多价值
- node.js - 通过 Google Cloud 构建触发器部署“sh: 1: jest: Permission denied”
- pandas - 按最后一行的百分比选择列索引
- spring - Spring:@Autowired 注释 - 在哪里查看实际更改?
- excel - 在vba excel中循环
- reactjs - 如何解决 useEffect 中的依赖关系问题?
- python - 如何将pygame中的多个图像添加到网格上?
- google-cloud-platform - 运行 gcloud 命令时,我收到“错误:可达性检查失败”。