Я застрял на этом уже 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("pushProfile") }}\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"
}
Я что-то пропустил?
Спасибо!