Ошибка CORS в Python Falcon даже с головами для Auth Pre-Flight

Получение этих ошибок при использовании глагола OPTIONS в Angular2 http.get(url, options), даже если в Falcon Rest API установлены соответствующие заголовки CORS.

XMLHttpRequest не может загрузить http://localhost:8000/names. Поле заголовка запроса Авторизация не разрешена Access-Control-Allow-Headers в ответе перед полетом.

resp.set_header("Access-Control-Allow-Origin", "*")
        resp.set_header("Access-Control-Allow-Credentials", "true")
        resp.set_header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT")
        resp.set_header("Access-Control-Allow-Headers",
                       "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers")

Для не OPTIONS / обычных запросов http.get() это работает нормально.

1 ответ

Решение

Решил это, используя falcon_cors, в частности, установив allow_all_methods = True

pip install сокол-корс

from falcon_cors import CORS

cors = CORS(allow_origins_list=['http://localhost:3000'],
            allow_all_headers=True,
            allow_all_methods=True)

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

Я пробовал, руководствуясь lwcolton на github здесь

А также установить allow_all_headers= Верно, allow_all_methods= Верно

т.е. аналогично приведенному выше ответу /questions/11987861/oshibka-cors-v-python-falcon-dazhe-s-golovami-dlya-auth-pre-flight/11987872#11987872, но еще два параметра для добавления

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])

Я предлагаю просмотреть документацию по этому поводу.

Также, resp.set_header('Access-Control-Allow-Origin', '*')не рекомендуется использовать в производственной среде. Иметь некоторые источники и методы из белого списка и на основе запроса, если вы исходите из источника из белого списка, вы можете указать здесь то же происхождениеresp.set_header('Access-Control-Allow-Origin', req.headers["ORIGIN"]).

Ниже приведен код, который я предпочитаю:

whitelisted_origins = ["http://localhost:4200"]
whitelisted_methods = ["GET", "POST", "OPTIONS"]

class CORSComponent:

    def process_request(self, req, resp):
        success = False
        # validate request origin
        if ("ORIGIN" in req.headers):
            # validate request origin
            if (req.headers["ORIGIN"] in whitelisted_origins):
                # validate request method
                if (req.method in whitelisted_methods):
                    success = True
                else:
                    # you can put required resp.status and resp.media here
                    pass
            else:
                # you can put required resp.status and resp.media here
                pass
        else:
            # you can put required resp.status and resp.media here
            pass
        if success:
            resp.set_header('Access-Control-Allow-Origin', req.headers["ORIGIN"])
        else:
            # exit request
            resp.complete = True

    def process_response(self, req, resp, resource, req_succeeded):
        if (req_succeeded and
            "ORIGIN" in req.headers and
            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
            ))

После этого вы можете добавить это в промежуточное ПО, например:

api = falcon.API(middleware=[
    CORSMiddleware(),
])

Если вы не хотите использовать описанный выше метод, вы можете использовать соколиные корки.

from falcon_cors import CORS

cors = CORS(
    # allow_all_origins=False,
    allow_origins_list=whitelisted_origins,
    # allow_origins_regex=None,
    # allow_credentials_all_origins=True,
    # allow_credentials_origins_list=whitelisted_origins,
    # allow_credentials_origins_regex=None,
    allow_all_headers=True,
    # allow_headers_list=[],
    # allow_headers_regex=None,
    # expose_headers_list=[],
    # allow_all_methods=True,
    allow_methods_list=whitelisted_methods
)

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

К вашему сведению, методы, поддерживаемые Falcon 2.0.0 -
'CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'

Другие вопросы по тегам