domain.com заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: он не имеет статуса HTTP ok

Обработка предполетных запросов из приложения React в Symfony сейчас становится слишком сложной, я пытаюсь исправить это в течение последних 8 часов. Вот ошибка, которую я получаю,

Access to XMLHttpRequest at 'https://mylocaldomain.com/validate-token' from origin 'http://myreactapplocal:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

Я попытался добавить код из этого сообщения в здесь в public / index.php, и это сработало, я пытаюсь реализовать то же самое в слушателе, поскольку я не хочу редактировать public / index.php, и он не работает через слушателя, ниже мой код слушателя



namespace App\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\KernelEvents;

class CorsListener implements EventSubscriberInterface
{


    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            RequestEvent::class => 'onRequestEvent',
            ResponseEvent::class => 'onResponseEvent',
        ];
    }


    public function onRequestEvent(RequestEvent $event)
    {
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();
        $method  = $request->getRealMethod();
        if ('OPTIONS' === $method) {
            $response = new Response();
            $response->headers->set('Access-Control-Allow-Headers', 'X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method,Access-Control-Request-Headers, Authorization');
            $event->setResponse($response);
        }
    }

    public function onResponseEvent(ResponseEvent $event)
    {
        // Don't do anything if it's not the master request.
        if (!$event->isMasterRequest()) {
            return;
        }
        $response = $event->getResponse();
        $response->headers->set('Access-Control-Allow-Origin', '*');
        $response->headers->set('Access-Control-Allow-Methods', 'GET,POST,PUT,OPTIONS,PATCH,DELETE');
        $response->headers->set('Access-Control-Allow-Headers', 'Content-Type,Authorization');
    }
}

Приветствуется любая помощь / способ решения этой проблемы!


person SantMania    schedule 06.07.2021    source источник
comment
Вы проверяли этот пакет github.com/nelmio/NelmioCorsBundle? Или слушатель этого пакета github.com/nelmio/NelmioCorsBundle/blob/ master / EventListener /   -  person qdequippe    schedule 06.07.2021
comment
Да, я просмотрел этот пакет. К сожалению, мне не удалось установить его в нашем проекте. Причина в том, что для этого требуется композитор 2, а нам нужен композитор 1.10, так как наш проект имеет некоторую зависимость. Я просмотрел их CorsListener, они возвращают те же параметры, Access-Control-Allow-Methods, Access-Control-Request-Headers и Access-Control-Allow-Origin. То есть я добавляю прямо в свой слушатель.   -  person SantMania    schedule 06.07.2021
comment
Вы проверили, что ваш слушатель работает, сделав простой запрос без использования вашего приложения, например, с вашим браузером или почтальоном. Можете ли вы проверить, что ваш слушатель зарегистрирован и настроен bin/console debug:event-dispatcher OR debug:container   -  person qdequippe    schedule 06.07.2021
comment
Привет @qdequippe Спасибо, да, я попытался использовать почтальон, добавив оператор дампа для его печати, и я попробовал контейнер отладки, мой слушатель зарегистрирован. Когда я попробовал дамп, я увидел переменные, которые я печатаю. Однако теперь я попытался распечатать ответ в index.php и corslistener, я обнаружил здесь одно отличие, которое является версией. Когда я добавил заголовки в index.php, он добавляет версию как 1.1, но когда я делаю то же самое в corslistener, по умолчанию он принимает как 1.0, как вы думаете, может быть проблема?   -  person SantMania    schedule 06.07.2021
comment
Что вы имеете в виду под версией? Вы уверены, что код в index.php не отменяет ваш слушатель?   -  person qdequippe    schedule 06.07.2021
comment
Это не отменяет, всякий раз, когда я пытаюсь прослушать, я удаляю код в index.php.   -  person SantMania    schedule 06.07.2021


Ответы (1)


У меня также была эта проблема с использованием angular и symfony

Для меня установка кода на index.php решила эту проблему.

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: *");
header("Access-Control-Allow-Methods: *");
header("Allow: *");
$method = $_SERVER['REQUEST_METHOD'];
if ($method === "OPTIONS") {
    die();
}
person Thomas    schedule 06.07.2021
comment
Привет, @thomas, спасибо за ответ, но я не хочу изменять index.php, хочу установить его как часть слушателя или где-то еще, но не как часть index.php. - person SantMania; 06.07.2021