Промежуточное программное обеспечение 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()
])