如何使用Passport

时间:2018-03-17 21:03:22

标签: php laravel vuejs2 jwt laravel-passport

我用Laravel 5.6,Vue 2.5和Laravel Passport创建了一个SPA,效果很好。我非常喜欢Laravel和Vue,因为他们使用API​​构建SPA非常容易且非常有趣。

按照the docs中的说明设置Laravel Passport之后,登录以及对API的调用正在按照预期进行,基于' laravel_token'正确返回并存储在cookie中。

但是,我的问题是我的用户使用该应用程序很长时间,没有重新加载页面,只是使用axios执行针对API的调用。不知怎的,Laravel没有刷新laravel_token' API调用中的(和相应的cookie)(当我调用' web'路由时)。因此,laravel_token'在某个时间点到期,用户需要再次登录。

如何强制Laravel刷新' laravel_token' (从而延长其有效性)每次调用来自axios的API路线?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

过去,我通过创建一条简单的路由(在web中间件组中)来解决类似的问题,只要在打开浏览器选项卡的过程中,该会话就可以保持活动状态。

routes / web.php 中:

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

然后使用javascript定期ping此路由:

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

答案 1 :(得分:0)

Axios可以“拦截” /查看呼叫是否失败。在错误回调内部,我正在查看这是否是未经身份验证的错误,只需重新加载页面即可。

诚然,我很想能够在错误捕获的块内编写另一个Axios调用,以获取另一个会话令牌“ laravel_token”,但尚未找到一种方法。重新加载页面虽然会刷新laravel_token,所以现在可以解决我的问题。 ¯\ _(ツ)_ /¯

事后思考:我实际上是在想您可能无法通过Axios调用刷新laravel_token,因为您已经删除了会话。我猜你必须这样做。

// 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);
    }
);