Итак, проблема была в отсутствующем в запросе параметре "X-XSRF-TOKEN" (причем, именно так, а не "X-CSRF-TOKEN", как можно было подумать). Это одна. Вторая - в шифровании этого параметра, но ее до конца понять не удалось.
С каждым POST-запросом этот параметр должен передаваться на сервер, поэтому, на jQuery будет такой код:
jQuery.ajaxSetup({
headers: {'X-XSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content')}
});
Здесь мы получаем значение параметра "csrf-token" из мета-тегов страницы. А записываем их туда, например, в основном файле представления:
<meta name="csrf-token" content="{{ csrf_token() }}"/>
Но даже если все это сделать, сервер все равно будет умирать с сообщением "DecryptException". Информацию об этой проблеме нашел вот
здесь. Правда, в итоге сделал вторым способом, так как в первом необходимость добавлять параметр каждому контроллеру показалась страшной.
То есть, я открыл файл "app/Http/Middleware/VerifyCsrfToken.php" и добавил в него такой код:
use Symfony\Component\Security\Core\Util\StringUtils;
...
protected function tokensMatch($request) {
$token = $request->session()->token();
$header = $request->header('X-XSRF-TOKEN');
return StringUtils::equals($token, $request->input('_token')) ||
($header && StringUtils::equals($token, $header));
}
Функцию, конечно же, внутрь класса.
Хотелось бы в комментариях увидеть ваше мнение. Бабы говорят, что второй вариант может нести какие-то уязвимости, но я пока не очень силен в этих вопросах, поэтому буду рад любому совету по этой теме.