如何在 google 云 运行 中允许 CORS?

How to allow CORS in google cloud run?

我有一个 React 微服务(通过 nginx)部署到 google 云 运行 上,其后端环境变量设置为另一个 google 云 运行 实例运行正在为后端服务的 ning gunicorn。

我的 Flask 应用程序是按照我能找到的关于允许 CORS 的所有内容设置的:

app = Flask(__name__)
app.config.from_object(config)
CORS(app, resources={r"/*": {"origins": "*"}})
app.config['CORS_HEADERS'] = 'Content-Type'
return app

# Different file, a blueprint's urls:

@blueprint.route('/resources')
@cross_origin()
def get_resources():
...

但我仍然感到害怕 Access to XMLHttpRequest at 'https://backend/resources/' from origin 'https://frontend' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

有没有人了解 this/know 在解决这个问题的其他地方?我想用我的微服务设置 GKE,但最初选择了阻力最小的路径来在云中建立 POC。我的后端与我的 Cloud SQL 实例通信,我非常接近!!

谢谢

我最近也在努力解决这个问题......我的问题是尝试使用一些 JS 库来发出我的 URL 请求 "easier" 而不是在 headers请求端(不是服务器端)。切换到只使用直接 XMLHttp,它开始工作正常。我也从 application/json 切换到 application/x-www-form-urlencoded。我不知道这是否有所作为,但出于完整性考虑将其包括在内。

你也不应该(我说不应该,但你知道那是怎么回事)需要除以下以外的任何东西:

CORS(应用程序)。所有 @cross-region 的东西,以及配置部分都只是为了缩小 CORS 访问范围,所以它不是完全开放的,但是你在初始代码中已经完全开放了(CORS(app, resources={r"/*": {"origins": "*"}}) 是一样的我相信 CORS(app)).

长话短说,尝试查看请求 object,而不是 Flask 端。

编辑:在我无法让 "fetch" 库工作后添加对我有用的请求代码:

var xhttp = new XMLHttpRequest();
xhttp.open("POST", <url>, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhttp.send(Data)

您设置的内容超出了您的需要。除非你需要为不同的端点提供不同的 CORS 访问,最简单的例子只需要调用 CORS(app):

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route("/resources")
def get_resources():
  return "Hello, cross-origin-world!"

if __name__ == "__main__":
    app.run('0.0.0.0', 8080, debug=True)

你会看到 header 存在:

$ curl -I localhost:8080/resources
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 26
Access-Control-Allow-Origin: *
Server: Werkzeug/1.0.1 Python/3.7.4
Date: Tue, 21 Apr 2020 17:19:25 GMT

一切都是自己造成的。

正如 Dustin Ingram 所提到的,如果您为 Flask 启用 CORS,它将起作用。我仍然不知道为什么我会遇到 CORS 问题,我从一开始就为我的 Flask 应用程序启用了 CORS。

在我删除所有内容并重新部署之后,CORS 问题就消失了。但是,我最终还是得到了 404、405 和 308。

有几个问题,我所有的缺点,结合在一起给了我这些问题。在 create-react-app(我认为 webpack 正在这样做)中,传递到 docker 运行时的环境变量没有得到尊重,所以我在 Cloud 运行 中设置的环境变量根本不起作用.目前我选择了 process.env.VARIABLE || 'hardcoded-url' 路线。一旦我弄明白了,我还记得 flask URL 中的尾部斜线是不好的……那些给了我 308s,永久重定向。一旦弄明白了这一点,我在手动部署期间意识到,我并没有将云构建映像切换到最新版本。叹。一旦我开始部署最新的图像,一切都开始工作了。耶!

感谢 Dustin 和 Gabe 花时间了解我的愚蠢。