Почему не отправляется post запрос (cross domain) из vuejs(axios) в laravel?

На сайте с формой установлен vuejs, axios они лежат на домене: https://домен1.ру, Laravel развернут на IIS с доменом: https://домен2.ру, доступ к api осуществляется через Passport, все контроллеры созданы, через POSTMAN запросы уходят без всяких ошибок.

Но стоит мне отправить форму с https://домен1.ру на https://домен2.ру/api/createOrder то на сайте с формой падает ошибка "Access to XMLHttpRequest at 'https://домен2.ру/api/createOrder' from origin 'https://домен1.ру' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource."

Перерыл весь гугл и яндекс ничего того, что могло бы решить мою проблему не нашел. Надеюсь на вашу помощь.
Сервер возвращает нужные заголовки. На Laravel поставил посредник CORS.
В браузере в консоли-network при отправке формы две строки на этот API, одна с ошибкой CORS, вторая с заголовками и методом запроса OPTIONS и ответом 200.

Код submitForm:
formSubmit(e) {
            var payload = {
                id_service: this.servicesModel,
                object_type: this.typeObjModel,
                object_address: this.address,
                object_area: this.areaStr,
                branch_id: this.branchModel,
                order_name: this.orderName,
                order_phone: this.orderPhone,
                order_email: this.orderMail,
                comments: this.comments
            };
            e.preventDefault();
            let currentObj = this;
            axios.post('https://домен2.ру/api/createOrder',
            payload,{
                method: 'POST',
                mode: 'no-cors',
                headers: {
                    'Accept': 'application/json',
                    'WithCredentials': true,
                    'Access-Control-Allow-Origin': '*',
                    'Content-Type': 'application/json',
                    'Authorization': ''
                },
                withCredentials: true,
                credentials: 'same-origin',
            })
            .then(function (response) {
                currentObj.output = response.data;
            })
            .catch(function (error) {
                currentObj.output = error;
            });
        }

Ответ на POST в котором возникает ошибка CORS
Request URL: https://домен2.ру/api/createOrder/
Referrer Policy: no-referrer-when-downgrade
Provisional headers are shown
Accept: application/json, text/plain, */*
Access-Control-Allow-Headers: Origin, Accept, Content-Type, Authorization, Access-Control-Allow-Origin
Access-Control-Allow-Origin: *
Content-Type: application/json;charset=UTF-8
DNT: 1
Referer: https://домен1.ру/order.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 OPR/71.0.3770.234

Ответ на POST в котором метод меняется на OPTIONS
Request URL: https://домен2.ру/api/createOrder/
Request Method: OPTIONS
Status Code: 200 
Remote Address: IP(домен2.ру):443
Referrer Policy: no-referrer-when-downgrade
access-control-allow-origin: *
allow: OPTIONS, TRACE, GET, HEAD, POST
content-length: 0
date: Mon, 19 Oct 2020 13:00:09 GMT
public: OPTIONS, TRACE, GET, HEAD, POST
server: Microsoft-IIS/10.0
status: 200
:authority: домен2.ру
:method: OPTIONS
:path: /api/createOrder/
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
access-control-request-headers: access-control-allow-headers,access-control-allow-origin,authorization,content-type
access-control-request-method: POST
origin: https://домен1.ру
referer: https://домен1.ру/order.html
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: <cross-site
user-agent: <Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 OPR/71.0.3770.234

Middleware CORS.php
<?php

namespace App\Http\Middleware;

class Cors
{
    public function handle($request, \Closure $next)
    {
        $headers = [
            'Access-Control-Allow-Origin'      => '*',
            'Access-Control-Allow-Methods'     => 'GET, POST, PUT, PATCH, DELETE, OPTIONS',
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Max-Age'           => '86400',
            'Access-Control-Allow-Headers'     => 'Content-Type, Authorization, X-Requested-With, X-Auth-Token, Origin'
        ];

        if ($request->isMethod('OPTIONS'))
        {
            return response()->json('{"method":"OPTIONS"}', 200, $headers);
        }

        $response = $next($request);
        foreach($headers as $key => $value)
        {
            $response->header($key, $value);
        }

        return $response;
    }
}

Routes/api.php
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
Route::middleware('cors','auth:api')->group( function () {
    Route::post('/createOrder/', 'API\OnlineOrderController@store');
});

В kernel.php посредник добавлен, и по ответам postman все работает
  • Вопрос задан
  • 1860 просмотров
Пригласить эксперта
Ответы на вопрос 1
OCTAGRAM
@OCTAGRAM
Пожалуйста, обратите внимание: в Access-Control-Allow-Origin запрещено использовать звёздочку * для запросов с авторизационными данными. Там должен быть именно источник, как показано выше. Это дополнительная мера безопасности, чтобы гарантировать, что сервер действительно знает, кому он доверяет делать такие запросы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы