首页 > 解决方案 > 无法使用 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',但只是得到“输入意外结束”错误。

对于某些背景,以下工作正常

我已经设置auth_backendairflow.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 文件中。

标签: javascriptpythonairflow

解决方案


所描述的行为是有道理的,因为浏览器使用 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,指的是原始问题评论中的问题。


推荐阅读