Исключение Laravel TokenMismatch при отправке токена в заголовке
Я отправляю CSRF токен в заголовке при выполнении запроса ajax.
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': getCookie("XSRF-TOKEN")
}
});
В приведенном выше коде я получаю токен из файла cookie "XSRF-TOKEN
" и устанавливаю в заголовке "X-CSRF_TOKEN
" глобально для всех запросов ajax.
Я проверил в инструменте разработчиков Chrome, что этот заголовок отправляется.
Но Laravel по-прежнему выдает Исключение tokenmismatch.
Примечание Я не могу получить токен из html, такого как мета-тег или поля ввода, потому что html содержимое кэшируется, поэтому я хотел бы установить файл cookie "XSRF-ТОКЕН", который laravel устанавливает в каждом ответе.
3 answers
Токен, сгенерированный Laravel csrf_token()
, и токен, установленный в файле cookie, не совпадают.
Теперь проблема в том, что заголовок "X-CSRF-ТОКЕН" используется для отправки токена, сгенерированного функцией csrf_token()
.
Поэтому, если вы хотите отправить csrf-токен, полученный из файла cookie, вам следует использовать заголовок "X-XSRF-ТОКЕН".
Следовательно, приведенный выше код должен быть похож на
$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': getCookie("XSRF-TOKEN")
}
});
Попробуйте вместо этого сделать вот так: https://laravel.com/docs/5.3/csrf#csrf-x-csrf-token
Добавьте это в свой <head></head>
внутренний файл блейда
<meta name="csrf-token" content="{{ csrf_token() }}">
И в вашем JS получите маркер следующим образом:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').val()
}
});
-- редактировать --
Вместо этого вы можете использовать поле ввода, если вы не хотите использовать тег meta
и поместить его в свой <body></body>
<input type="hidden" name="csrf-token" value="{{ csrf_token() }}">
'X-CSRF-TOKEN': $('input[name="csrf-token"]').val()
У меня такая же проблема, как у вас; возможно, этот ответ поможет..Похоже, что ваш токен csrf обновлен: https://stackoverflow.com/a/43893114/5586645