Как обновить laravel_token при вызовах API с помощью Passport

Я создал SPA с Laravel 5.6, Vue 2.5 и Laravel Passport, который работает довольно хорошо. Мне очень нравятся Laravel и Vue, поскольку они делают создание SPA с API очень простым и увлекательным занятием.

После настройки Laravel Passport, как описано в документации, вход в систему, а также вызовы API работают должным образом на основе 'laravel_token', который правильно возвращается и сохраняется в файле cookie.

Однако моя проблема в том, что мои пользователи используют приложение довольно долгое время, не перезагружая страницу, а только выполняя вызовы API с помощью axios. Каким-то образом Laravel не обновляет «laravel_token» (и соответствующий файл cookie) в вызовах API (он делает это, когда я вызываю «веб-маршрут»). Следовательно, laravel_token истекает в какой-то момент, и пользователю необходимо снова войти в систему.

Как я могу заставить Laravel обновлять laravel_token (и тем самым продлевать срок его действия) при каждом вызове маршрута API из axios?

Любая помощь очень ценится!


person Matthias    schedule 17.03.2018    source источник
comment
Определите продолжительность, прежде чем пользователь должен будет снова войти в систему, а затем, если он истечет, это твердый сыр. Тем, кто использует приложение чаще, следует проверить срок действия jwt и решить, когда отправлять запрос токена обновления. RTM: laravel.com/docs/5.6/passport#refreshing-tokens   -  person Lawrence Cherone    schedule 18.03.2018
comment
Спасибо за быстрый ответ. Могу ли я также использовать это, чтобы обновить laravel_token, который является версией токена JWT? В общем, мой вопрос заключался в том, действительно ли это необходимо. Поскольку мои пользователи взаимодействуют с API в течение срока действия токена, я понимаю, что его следует продлить - в любом случае это не происходит автоматически при вызовах API (но происходит при веб-вызовах).   -  person Matthias    schedule 18.03.2018
comment
Привет. Вы используете Axios? Если это так, при попытке отправить запросы на ваш api с истекшим laravel_token добавьте перехватчик (github.com/ axios / axios # interceptors) для всего ответа 401, который отправляет предупреждение или что-то в этом роде пользователю, что их сеанс истек, и им или SPA необходимо снова обновить страницу.   -  person Kenth John Israel    schedule 28.09.2018


Ответы (2)


Раньше я решал аналогичные проблемы, создав простой маршрут (в группе промежуточного программного обеспечения web), чтобы поддерживать сеанс в рабочем состоянии до тех пор, пока открыта вкладка браузера.

В routes / web.php:

Route::get('/keep-alive', function () {
    return response()->json(['ok' => true]);
})->middleware('auth');

А затем периодически пингуйте этот маршрут с помощью javascript:

setInterval(() => {
    axios.get('/keep-alive')
        .then(() => {})
        .catch(() => {})
}, 600000)

Я расскажу немного подробнее здесь: https://stackoverflow.com/a/57290268/6038111

person Travis Britz    schedule 12.03.2019

У Axios есть способ «перехватить» / посмотреть, не удалось ли выполнить вызов. Внутри обратного вызова ошибки я вижу, была ли это ошибка без аутентификации, и просто перезагружаю страницу.

По общему признанию, я хотел бы иметь возможность написать еще один вызов Axios внутри блока с ошибкой, чтобы захватить другой токен сеанса «laravel_token», но еще не нашел способа сделать это. Однако перезагрузка страницы обновит laravel_token, так что на данный момент это решает мою проблему. ¯ \ _ (ツ) _ / ¯

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

// Refresh Laravel Session for Axios
window.axios.interceptors.response.use(
    function(response) {
        // Call was successful, don't do anything special.
        return response;
    },
    function(error) {
        if (error.response.status === 401) {

            // Reload the page to refresh the laravel_token cookie.
            location.reload();
        }

        // If the error is not related to being Unauthorized, reject the promise.
        return Promise.reject(error);
    }
);
person fylzero    schedule 10.08.2019