нет 'Access-Control-Allow-Origin' Symfony 3 и React - PullRequest
0 голосов
/ 11 декабря 2018

Я испытываю серьезное беспокойство.Я разрабатываю API с Symfony 3. Этот API запрашивается на лицевой стороне с React.Используемая задняя сторона сервера (API) - http://127.0.0.1:8000.. Используемый на лицевой стороне сервер - http://localhost:3000.

. Когда я вызываю API с передней стороны, у меня возникают две ошибки: - Метод 405Не разрешено - Доступ к XMLHttpRequest по адресу http://127.0.0.1:8000/users/email/settings' от источника http://localhost:3000' заблокирован: Политика CORS: Ответ на предпечатную проверку: заголовок «Access-Control-Allow-Origin» отсутствует.запрашиваемый ресурс.

Однако я указал правильный метод (патч) и настроил заголовок из API:

Вот подробный код:

API(обратно с Symfony)

    /**
 * @Route("/users/email/settings", methods={"PATCH"})
 * @param Request $request
 * @param FlashMessage $flashMessage
 */
public function usersEmailEditAction(Request $request, FlashMessage $flashMessage)
{
    if($request->getContent())
    {
        $data = json_decode($request->getContent(), true);

        $em = $this->getDoctrine()->getManager();

        $user = $this->get('security.token_storage')->getToken()->getUser();

        $editUser = $em->getRepository(User::class)->find($user->getId());

        if (!$editUser) {
            return $flashMessage->messageError("USER_NOT_FOUND", 1);
        }

        if (!$data['password']) {
            return $flashMessage->messageError("PASSWORD_NOT_FOUND", 1);
        }

        if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
            return $flashMessage->messageError("INVALID_EMAIL", 1, "format email invalid");
        }

        if (!filter_var($data['confirmEmail'], FILTER_VALIDATE_EMAIL)) {
            return $flashMessage->messageError("INVALID_EMAIL", 1, "format email invalid");
        }

        if ($data['email'] != $data['confirmEmail']) {
            return $flashMessage->messageError("NO_MATCHING_EMAIL", 1, "les emails sont différents");
        }

        // on vérifie le mot de passe
        $encoder = $this->get('security.password_encoder');

        $isPasswordValid = $encoder->isPasswordValid($user, $data['password']);

        // Le mot de passe n'est pas correct
        if (!$isPasswordValid) { 
            return $flashMessage->messageError("INCORRECT_PASSWORD", 1);
        }

        $editUser->setEmail($data['email']);
        $editUser->setUpdatedAt(new \DateTime());

        $em->flush();

        return $flashMessage->messageSuccess("EMAIL_UPDATED_SUCCESSFULLY", 0);



    }else {
        return $flashMessage->messageWarning("NOTHING_UPDATED", 2);
    }
}

возврат $ flashMessage

    public function messageSuccessAction($message, $code, $desc = null)
{
    $response = new Response();
    $response->setContent(json_encode([
        'error' => $code,
        'message' => $message
    ]));

    $response->headers->set('Content-Type', 'application/json');
    $response->headers->set('Access-Control-Allow-Origin', 'http://localhost:3000');
    $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS'); 

    return $response;

    //return new JsonResponse(array("error" => $code, "message" => $message));
}

public function messageErrorAction($message, $code, $desc = null)
{
    $response = new Response();
    $response->setContent(json_encode([
        'error' => $code,
        'message' => $message
    ]));

    $response->headers->set('Content-Type', 'application/json');
    $response->headers->set('Access-Control-Allow-Origin', 'http://localhost:3000');
    $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS'); 

    return $response;

    //return new JsonResponse(array("error" => $code, "message" => $message));
}

public function messageWarningAction($message, $code, $desc = null)
{

    $response = new Response();
    $response->setContent(json_encode([
        'error' => $code,
        'message' => $message
    ]));

    $response->headers->set('Content-Type', 'application/json');
    $response->headers->set('Access-Control-Allow-Origin', 'http://localhost:3000');
    $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS'); 

    return $response;
    //return new JsonResponse(array("error" => $code, "message" => $message));
}

Запрос API с фронта (используйте Axios)

    requestAPI = (myPassword, newEmail, confirmEmail) => {
    axios.patch('http://127.0.0.1:8000/users/email/settings', {
        crossdomain: true,
        password: myPassword,
        email: newEmail,
        confirmEmail: confirmEmail
      })
      .then(function (response) {
        console.log(response);
      })
      .catch(function (error) {
        console.log(error);
      });
}

Я тоже пробовал без междомена, но ничего.

У вас есть идеи?Спасибо за вашу помощь

1 Ответ

0 голосов
/ 11 декабря 2018

Является ли звонок, который случайно получает 405 Method Not Allowed, звонком OPTIONS?Также называется «запросом предварительной проверки» .

Для всех ваших потребностей в CORS вы должны включить NelmioCorsBundle , его легко настроить и вам не нужно устанавливатьсобственные заголовки CORS.

В данном случае ваш браузер сначала проверит, понимает ли сервер протокол CORS при вызове OPTIONS.Но это не отвечает вашему приложению, по крайней мере, не с правильными заголовками CORS, поэтому ваш вызов PATCH никогда не вызывается вашим браузером из-за этого.Сообщение об ошибке даже говорит так.«Ответ на предварительную проверку : На запрошенном ресурсе отсутствует заголовок« Access-Control-Allow-Origin ».»

...