我用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路线?
非常感谢任何帮助!
答案 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);
}
);