Ошибка Laravel 419 - проблема VerifyCsrfToken - PullRequest
0 голосов
/ 11 октября 2018

У меня есть несколько сайтов Laravel, размещенных на одном сервере.С последним сайтом, который я создал, контактная форма отказывается отправить, не выдавая ошибку 419.Я настроил маршрутизацию в своем файле web.php, как и на других веб-сайтах, на которых есть действующие рабочие контактные формы, и я генерирую и отправляю токен точно таким же образом - с помощью {{ csrf_field() }}.

* 1003.* Я нашел ответ на аналогичный вопрос о том, что вы можете отключить проверку Csrf, добавив записи в массив $except в app/Http/Middleware/VerifyCsrfToken.php.Я подтвердил, что это действительно разрешает ошибку 419:
protected $except = [
    'contact',
    'contact*',
];

Но, конечно, я хочу сохранить функциональность Csrf, и я только обновил массив $except для значения устранения неполадок.

Кто-нибудь знает, что может отличаться в новой среде Laravel, которая будет иметь такое поведение 419, несмотря на передачу сгенерированного токена?Я пытался обновить ряд настроек ENV и переключать различные функции, но ничто иное, как изменение массива $except, никак не повлияло на проблему.

Обновление

Поскольку произошлаПока я немного обсудил, я решил предоставить дополнительную информацию и код.

Во-первых, это форма ajax, но пока не выпрыгивайте из своего места.Я тестировал форму как с, так и без ajax.Если я хочу протестировать с ajax, я просто нажимаю кнопку, подключенную к слушателю jQuery.Если нет, я изменяю или удаляю идентификатор кнопки или запускаю $("#formName").submit(); в окне консоли.

Все вышеперечисленное (ajax, старомодная отправка и селектор jquery с .submit();) приводят кточно такой же ответ - ошибка 419.

И ради полноты, вот мой код ajax, который работает на всех других веб-сайтах, которые я размещаю.Я определил массив postData, чтобы сохранить все в порядке, и я добавил оператор console.log() сразу после него, чтобы (снова) подтвердить, что токен сгенерирован очень хорошо и правильно передается с запросом.

var postData = {

    name: $("#name").val(),
    email: $("#email").val(),
    message: $("#message").val(),

    _token: $("input[name=_token]").val()

};

console.log(postData);


$.post("/contact", postData, function (data) {

...

Есть идеи?Может ли быть проблема конфигурации с моим ENV или другим файлом?

Обновление прогресса!

Поскольку другие сайты работают очень хорошо, я клонировал старый сайт и просто переписал файлы, которые я изменилдля нового сайта, и БАМ!Теперь это работает.Сделав немного больше копания, я запустил php artisan --version на клонированной версии сайта по сравнению с нерабочей версией, и вот результаты:

Рабочая версия: Laravel Framework 5.7.3

Не работающая версия: Laravel Framework 5.7.9

Возможно, это ошибка в Laravel?Или, возможно, некоторые пакеты на моем сервере устарели и требуют обновления для работы с новой версией Laravel?

Ответы [ 3 ]

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

только что нашел вашу проблему в репозитории фреймворка.Это не проблема laravel, в вашей установке отсутствуют права на запись в папку хранилища, поэтому laravel не может записывать сеанс, журналы и т. Д.

Вы получаете ошибку 419, потому что не можете записать в файлыТаким образом, вы не можете создать сессию n, поэтому вы не можете проверить токен csrf.

Быстрое исправление: chmod -R 777 storage

Правильное исправление: переместите вашу установку в папку, где nginx /apache / ваш пользователь может написать.Если вы используете nginx / apache, переместите свое приложение туда и дайте необходимые разрешения для проекта (chown -R www-data: /path-to-project) Если вы используете php artisan serve, измените его разрешения для вашего пользователя: chown -R $(whoami) /path-to-project

Вы получаете егопусть писатели пишут и у тебя все хорошо.

0 голосов
/ 24 апреля 2019

Ознакомьтесь с моим ответом на этот вопрос, если это поможет вам достичь того, чего вы пытаетесь достичь Форма обратной связи: ошибка возврата 419 неизвестный статус laravel

0 голосов
/ 11 октября 2018

протестируйте этот код

Route::get('/contact', [
   'uses' => 'ContactController@index',
   'nocsrf' => true,
]);
Route::post('/contact', [
   'uses' => 'ContactController@contactSubmit',
   'nocsrf' => true,
]);

или вы можете удалить отверстие csrf

protected $except = [
    '*'
];
...