Falcon CORS 中间件无法正常工作

Falcon CORS middleware does not work properly

我使用 Falcon CORS 只允许从多个域访问我的 Web 服务。但是不能正常使用。

让我解释一下,如果我们看一下我的实现:

ALLOWED_ORIGINS = ['*']
crossdomain_origin = CORS(allow_origins_list=[ALLOWED_ORIGINS], log_level='DEBUG')

app = falcon.API(middleware=[RequireJSON(), JSONTranslator(), cors.middleware])

当我向我的 API 服务发出任何 post 请求时,我收到此警告:

Aborting response due to origin not allowed

但是,然后我从 API 那里得到了正确的回复。
这是关于此模块的官方文档:https://github.com/lwcolton/falcon-cors

您的代码与 falcon-cors 文档的示例不匹配:

import falcon
from falcon_cors import CORS    
cors = CORS(allow_origins_list=['http://test.com:8080'])    
api = falcon.API(middleware=[cors.middleware])
#                            ^^^^^^^^^^^^^^^

注意 cors.middleware 变量被传递到 api 调用中。在您的代码中,您正在创建 crossdomain_origin 但未将其传递到 API 设置中。

如果这不能解决问题,请提供一个工作代码示例,包括 Falcon 资源 类,它易于测试和重现,我很乐意提供帮助。

编辑:

从下面的评论来看,听起来 falcon-cors 工作正常,问题可能是 origin header 从请求中被省略了。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

The Origin header indicates the origin of the cross-site access request or preflight request.

旁注:

ORIGIN '*' 不适用于某些浏览器.. 特别是 IE。过去,我不得不将 ORIGIN header 动态设置为 HTTP header 中请求的 'host' 名称,以便为我设置的站点支持通配符域名主机。

我按照指导试过了by lwcolton on github here

同时设置allow_all_headers=True, allow_all_methods=True

即与@Ryan

相同
from falcon_cors import CORS

cors = CORS(
    allow_all_origins=True,
    allow_all_headers=True,
    allow_all_methods=True,
)

api = falcon.API(middleware=[cors.middleware])

还有另一种方法可以不使用 falcon-cors

来实现

您可能想在官方文档中查看此内容 - how-do-i-implement-cors-with-falcon

class CORSComponent:

    def process_response(self, req, resp, resource, req_succeeded):
        resp.set_header('Access-Control-Allow-Origin', '*')

        if (req_succeeded
            and req.method == 'OPTIONS'
            and req.get_header('Access-Control-Request-Method')
        ):
            # NOTE: This is a CORS preflight request. Patch the
            #   response accordingly.

            allow = resp.get_header('Allow')
            resp.delete_header('Allow')

            allow_headers = req.get_header(
                'Access-Control-Request-Headers',
                default='*'
            )

            resp.set_headers((
                ('Access-Control-Allow-Methods', allow),
                ('Access-Control-Allow-Headers', allow_headers),
                ('Access-Control-Max-Age', '86400'),  # 24 hours
            ))

When using the above approach, OPTIONS requests must also be special-cased in any other middleware or hooks you use for auth, content-negotiation, etc. For example, you will typically skip auth for preflight requests because it is simply unnecessary; note that such request do not include the Authorization header in any case.

您现在可以将其放入中间件

api = falcon.API(middleware=[
    CORSComponent()
])