2016-02-12 3 views
3

Когда сессия истекла, пользователь не может войти в систему без обновления страницы, так как срок действия _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) { 
    } 
    }); 

заранее.

ответ

1

В вашей функции визуализации вы должны проверить конкретное исключение TokenMismatchException. Так может быть, вы можете попробовать что-то вроде этого:

if ($exception instanceof \Illuminate\Session\TokenMismatchException) { 
     return response()->json('msg', 'Your session has expired. Please try again.'); 
    } 

Вы также можете пройти новый csrf_token вместе с JSON, так что вы можете заменить старый с новым и отправить запрос на форму еще раз.

if ($exception instanceof \Illuminate\Session\TokenMismatchException) { 
      return response()->json(['msg'=> 'Your session has expired. Please try again.', 'token'=> csrf_token()]); 
     } 

Я еще не протестировал этот код. Но это должно заставить вас начать.

Кроме того, если вы хотите, вы можете использовать пакет: https://github.com/GeneaLabs/laravel-caffeine

+0

Эй, я сделал то, что, котор вы предложили. проверьте мой код. Кроме того, я считаю, что laravel-caffeine работает только для форм на php-странице, а не в формах ajax. –

+0

Кажется мне хорошо. Вы пробовали этот код? Несоответствие токенов - это функция безопасности, поэтому такой подход также откроет двери любому, кто пытается отправить запрос на наш сервер с недопустимым токеном. –

+0

не работает. вторая попытка входа в систему также дает такое же исключение. потому что токен сеанса на задней панели снова обновлен. есть ли у вас лучшие решения? –

Смежные вопросы