Ошибка 419 при втором входе в систему после выхода из SPA в Laravel API и Vue.js - PullRequest
0 голосов
/ 23 мая 2019

Я получаю ошибку срок действия страницы истек (er.419) при попытке войти после предыдущего выхода из системы.

Я работаю над страницами аутентификации для SPA, созданными с помощью Laravelи Vue.js.Это работает хорошо при первом входе в систему, но после выхода из системы он показывает ошибку при отправке второго входа в систему.

Я думаю, что проблема в CSRF, отправленном ранее и (возможно), истекшем после выхода из системы.

Myрабочий процесс выглядит следующим образом:

компонент входа в систему имеет скрытую форму, отправленную в качестве метода POST в Laravel API со значением токена csfr из HTML-тега META, установленного при создании приложения с помощью шаблона Laravel:

meta name = "login-status" content = "{{Auth :: check ()}}"

Выход из системы выполняется по запросу выборки в компоненте vue.Так что никакого обновления не делается.

Спасибо за любые предложения!

1 Ответ

1 голос
/ 23 мая 2019

Из документов laravel (https://laravel.com/docs/5.8/csrf#csrf-introduction):

Laravel автоматически генерирует CSRF-токен для каждого активного сеанса пользователя, управляемого приложением. Этот токен используется для проверки того, что аутентифицированный пользователь являетсяодин фактически делает запросы к приложению.

Когда вы выходите из системы, вы лишаете законной силы свой текущий сеанс - это означает, что токен csrf, который вы кэшировали в своей мета, становится недействительным.

Решение 1

Обновите страницу после успешного выхода из системы, чтобы php мог вывести активный токен csrf в ваш метатег. Например:

fetch('/api/logout', {
    method: 'post'
}).then(() => {
    window.location.href = '/login';
});

Решение 2

Рассмотрите возможность использования группы промежуточного программного обеспечения api. Это будет означать, что приложение не будет запускать промежуточное программное обеспечение App\Http\Middleware\VerifyCsrfToken. Имейте в виду, что у вас больше не будет доступа к сеансутак что вам нужно будет изучить методы аутентификации без сохранения состояния, например, с помощью JWT.

Laravel даже предоставляет пакет для аутентичныхобледенение API.(https://laravel.com/docs/5.8/passport)

...