Laravel 4, исключение несоответствия токена в filters.php с использованием CSRF

У меня проблема примерно с 1 недели, и когда я оставляю открытой страницу своего приложения, но не использую ее в течение 4 или 5 часов и возвращаюсь, чтобы сделать запрос (нажмите кнопку, чтобы загрузить что-то или что-то в этом роде) каждый раз в консоли отображать это:

{
"error":{
"type":"Illuminate\\Session\\TokenMismatchException",
"message":"",
"file":"C:\\xampp182\\htdocs\\mysite\\app\\filters.php",
"line":97
}
}

Я использую CSRF protección в моей передаче запроса POST для запроса AJAX этой конфигурации

$.ajax({
url: '/path/to/file',
type: 'default GET (Other values: POST)',
dataType: 'default: Intelligent Guess (Other values: xml, json, script, or html)',
data: {param1: 'value1'},
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
})
.done(function() {
console.log("success");
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});

Это мое filters.php

/*
|--------------------------------------------------------------------------
| CSRF Protection Filter
|--------------------------------------------------------------------------
|
| The CSRF filter is responsible for protecting your application against
| cross-site request forgery attacks. If this special token in a user
| session does not match the one given in this request, we'll bail.
|
*/

Route::filter('csrf', function($route, $request)
{
if (strtoupper($request->getMethod()) === 'GET')
{
return; // get requests are not CSRF protected
}

$token = Request::ajax() ? Request::header('x-csrf-token') : Input::get('_token');

if (Session::token() != $token)
{
throw new Illuminate\Session\TokenMismatchException; //Line 97
}
});

редактировать

Я вижу проблему, Session :: token () и $ token различны, но есть ли способ регенерировать или поместить оба токена с одинаковым значением?

0

Решение

Вот как работает защита CSRF. По истечении времени сеанса генерируется новый токен. Никто обычно не будет заполнять форму в течение 4-5 часов. Если вы делаете это только для тестирования на вашем локальном хосте, вы можете изменить lifetime в app/config/session к более высокой стоимости, и это должно работать.

В противном случае вы можете изменить:

throw new Illuminate\Session\TokenMismatchException; //Line 97

в нечто подобное

 return Redirect:back()->withInput(Input::except('token'))->with('_token',Session::token());
0

Другие решения

У меня была эта проблема при входе в систему также. Время от времени это исключение происходило, поэтому я останавливался и пытался воспроизвести его. Я добился успеха, сделав это

Сначала я загружаю страницу входа.

Затем я удалил куки.

Затем, не перезагружая страницу входа, я ввел имя пользователя и пароль и попытался войти.

Поскольку сеанс был удален (когда я удалил куки), было нормальным, что этот код не собирался проходить, и он генерировал исключение TokenMismatchException.

Route::filter('csrf', function() {
if ( Session::getToken() != Input::get('_token')) {
throw new Illuminate\Session\TokenMismatchException;
}
});

Поэтому я решил добавить перенаправление на страницу входа с сообщением, информирующим пользователя о том, что сеанс может истечь.

Route::filter('csrf', function() {
if ( Session::getToken() != Input::get('_token')) {
return Redirect::to('/admin/login')->with('warning', 'Your session has expired. Please try logging in again.');
}
});

Таким образом, после перезагрузки страницы создается новый сеанс и проблема решается.

0

Просто поместите код ниже в ваши фильтры:

if (Session::token() !== $token)
{
return Redirect::back()->withInput(Input::except('_token'));
}
0