Промежуточное программное обеспечение Falcon CORS не работает должным образом

Я использую Falcon CORS разрешить доступ к моему веб-сервису только из нескольких доменов. Но это не работает должным образом. Позволь мне объяснить.

Посмотрите на мою реализацию:

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

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

Итак, когда я делаю любой пост-запрос к моей службе API, я получаю предупреждение журнала: Aborting response due to origin not allowed, Но тогда я получаю правильный ответ от моего API.

Вот официальные документы об этом модуле: https://github.com/lwcolton/falcon-cors

1 ответ

Решение

Ваш код не соответствует примеру документации сокола-корс:

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, который легко протестировать и воспроизвести, и я с радостью постараюсь помочь.

редактировать:

Из комментариев ниже, похоже, что соколиный коры работает правильно, скорее проблема может быть origin заголовок был опущен в запросе.

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

Заголовок Origin указывает источник запроса межсайтового доступа или запроса предварительной проверки.

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

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

то же самое, что и комментарий @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])

Примечание:

ORIGIN '*' не работает в некоторых браузерах, особенно в IE. Раньше мне приходилось динамически устанавливать заголовок ORIGIN на имя "хоста", запрошенное в заголовках HTTP, чтобы поддерживать хост с подстановочным доменом для сайта, который я настраивал.

Есть еще один способ реализовать это без использования сокол-коров.

Вы можете посмотреть на это в официальной документации - как-сделать-я-реализовать-корс-с-соколом

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

При использовании вышеупомянутого подхода запросы OPTIONS также должны иметь специальный корпус в любом другом промежуточном программном обеспечении или хуках, которые вы используете для аутентификации, согласования содержимого и т. Д. Например, вы обычно пропускаете аутентификацию для запросов предварительной проверки, потому что это просто не нужно; обратите внимание, что такой запрос ни в коем случае не включает заголовок авторизации.

Теперь вы можете поместить это в промежуточное ПО

api = falcon.API(middleware=[
    CORSComponent()
])
Другие вопросы по тегам