Когда сессия истекла, пользователь не может войти в систему без обновления страницы, так как срок действия _token
в заголовках ajax истек (AKA TokenMismatchException
). Я не могу обработать исключение, перенаправляя пользователя на страницу входа в систему, потому что логин - это мода наложения и запрос обрабатывается через ajax.Как обрабатывать laravel TokenMismatchException при завершении сеанса
Я думал, что могу уловить исключение несоответствия в Handler.php
и вернуть ответ json с токеном сеанса. и на стороне клиента, используйте новый токен, чтобы продолжить предполагаемый процесс. Однако, когда я использую новый токен, переданный с сервера, токен сеанса будет снова изменен на стороне сервера, который приведет к другому TokenMismatchException
.
Так как же я должен обрабатывать исключение защищенным способом без обновления страницы?
Вот что я имею сейчас:
установки csrf_token
в глобальном файле JS:
$(function() {
$.ajaxSetup({
headers: { 'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content') }
});
});
метод визуализации в приложение/исключения/handler.php:
public function render($request, Exception $e)
{
if ($this->isHttpException($e))
{
return $this->renderHttpException($e);
}
else if ($e instanceof TokenMismatchException)
{
if ($request->ajax()) {
return response()->json([
'message' => 'TokenMismatchException',
'token' => csrf_token()
]);
}
}
else
{
return parent::render($request, $e);
}
}
в подлинности .js:
$.ajax({
type: "POST",
url: "/auth/login",
data: {
"email" : $('#login_email').val(),
"password" : $('#login_password').val(),
'remember': $('#login_remember').is(':checked')
},
success: function(response) {
if (response.message === 'TokenMismatchException') {
console.log(response); //message and token exist
//if catch the exception, use the new token to set up the ajax headers and login again
$.ajaxSettings.headers["X-CSRF-TOKEN"] = response.token;
console.log($.ajaxSettings.headers["X-CSRF-TOKEN"]);
$.ajax({
type: "POST",
url: "/auth/login",
data: {
"email" : $('#login_email').val(),
"password" : $('#login_password').val(),
'remember': $('#login_remember').is(':checked'),
},
success: function(res) {
console.log(res);
},
error: function(err) {
console.log(err);
}
});
}
console.log('logged in');
},
error: function(xhr, status, err) {
}
});
заранее.
Эй, я сделал то, что, котор вы предложили. проверьте мой код. Кроме того, я считаю, что laravel-caffeine работает только для форм на php-странице, а не в формах ajax. –
Кажется мне хорошо. Вы пробовали этот код? Несоответствие токенов - это функция безопасности, поэтому такой подход также откроет двери любому, кто пытается отправить запрос на наш сервер с недопустимым токеном. –
не работает. вторая попытка входа в систему также дает такое же исключение. потому что токен сеанса на задней панели снова обновлен. есть ли у вас лучшие решения? –