2014-09-26 1 views
0

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

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

Я использую CSRF Proteccion в запросе 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 :: маркер() и $ лексема различны, но есть способ, чтобы восстановить или положить оба маркера с тем же значением?

+0

Может быть, этот ответ полезным. [Токен Несовпадение Исключение при входе в систему (Laravel)] [1] [1]: HTTP: // StackOverflow.ком/вопросы/22066241/маркера несовпадение-исключений на входе-Laravel/28361491 # 28361491 –

ответ

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

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

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

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

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

Поскольку сеанс был удален (когда я удалил файлы cookie), было нормально, что этот код не пройдет, и он выкинет исключение 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')); 
} 
Смежные вопросы