Laravel 5.5: 403 Запрещено при создании AJAX POST - PullRequest
0 голосов
/ 07 ноября 2018

Я застрял на этом уже 2 дня, и все разрешения, которые я искал в StackOverflow и Laracasts, оказались неокончательными.

Я использую Laravel 5.5 с jQuery и тестирую в Firefox.

Мои вызовы AJAX GET работают нормально, однако, когда я пытаюсь вставить запись в свою базу данных, я получаю ошибку 403.

Мой заголовок содержит токен CSRF:

<meta name="csrf-token" content="{{ csrf_token() }}">

Модели создаются для каждой таблицы, вызываемой в моем контроллере:

public function pushProfile(Request $request){
        $userid = \Auth::user()->id;
        $data = $request->message;
        $stat = \App\Character::where('owner', $userid)->first();
        $mess = \App\Message::firstOrCreate([
            'posterID' => $userid,
            'loc_x' => '0',
            'loc_y' => '0',
            'characterID' => $stat->id,
            'type' => 'profile'
        ]);
        $mess->content = $data;
        $mess->save();
        return response()->json(['success'=>'Message has been saved!']);
    }

Вот вызов AJAX, он в основном проверяет мои Quilljs Delta. Этот Delta является объектом JSON, форматирующим сообщение от WYSIWYG. Затем каждую 5-ю секунду он должен пытаться отправить его в мою базу данных.

Я знаю, что сторона Quilljs работает нормально, потому что мои дельты правильно отображаются в моей консоли. Но сам вызов POST не проходит аутентификацию по какой-то причине? (Это всего лишь мое предположение, мне кажется, что это единственная причина, по которой он отправил бы 403).

setInterval(function() {
      if (change.length() > 0) {
        console.log('Saving changes', change);
        /* AJAX setup */
        $.ajaxSetup({
          headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          }
        });
        $.ajax({
            headers: {
              'Content-Type':'application/json'
            },
            method: 'POST',
            url: '{{ url("/pushProfile") }}',
            data: {
              message:
              { 
                doc: JSON.stringify(quill.getContents())
              },
              _token: $('meta[name="csrf-token"]').attr('content')
            },
            dataType: 'JSON',
            error: function(jqXHR, textStatus, errorThrown) {
              console.log(JSON.stringify(jqXHR));
              console.log("AJAX error: " + textStatus + ' : ' + errorThrown);
            },
            success: function (data) { 
                $(".writeinfo").append(data.msg); 
                console.log("Success!!!");
            }
        });
        change = new Delta();
      }
    }, 5*1000);

Чтобы убедиться, что проблема возникла не из CSRF, я немного перебил себя и после попытки настроить токен сначала в ajaxSetup, а затем только в данных AJAX, я просто назначил его в обоих. Ни один из этих сценариев ничего не изменил.

Конечно, я назначил промежуточное ПО «Интернет» на своем почтовом маршруте для проверки вышеупомянутого токена CSRF. Я использую следующий маршрут:

Route::group(['middleware' => ['web']], function () {
  Route::post('/pushProfile','MessageSend@pushProfile')->name('pushProfile');
});

Я также попытался назначить URL-адрес следующим образом:

url: '/pushProfile',

К сожалению, безрезультатно ... Это просто возвращает 404 вместо 403, который у меня сейчас есть:

{
"readyState":4,
"responseText":"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html>
    <head>\n<title>403 Forbidden</title>\n</head>
    <body>\n<h1>Forbidden</h1>\n
    <p>You don't have permission to access 
    /folder/public/{{ route(&quot;pushProfile&quot;) }}\n
    on this server.<br />\n</p>\n
    <hr>\n
    <address>Apache/2.4.35 (Win64) PHP/7.2.10 Server at localhost Port 80</address>\n
    </body>
    </html>\n",
"status":403,
"statusText":"Forbidden"
}

Я что-то пропустил? Спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

Я нашел решение, и, о боже, это было так просто, мне стыдно за себя:

Я вызывал AJAX из файла .js, используя маршрут блейда. Перемещение вызова в блейд-файл решило всю проблему, поскольку блейд-маршруты отображаются только в файлах .blade.php ...

Я оставляю проблему там на тот случай, если кто-нибудь натолкнется на ту же проблему:)

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