【问题标题】:How to refresh the laravel_token on API calls with Passport如何使用 Passport 刷新 API 调用的 laravel_token
【发布时间】:2018-08-26 18:27:17
【问题描述】:

我使用 Laravel 5.6、Vue 2.5 和 Laravel Passport 创建了一个运行良好的 SPA。我真的很喜欢 Laravel 和 Vue,因为它们让使用 API 构建 SPA 变得非常简单且充满乐趣。

按照the docs 中所述设置 Laravel Passport 后,登录以及对 API 的调用根据正确返回并存储在 cookie 中的“laravel_token”按预期工作。

但是,我的问题是我的用户使用该应用程序的时间很长,没有重新加载页面,而只是使用 axios 对 API 执行调用。不知何故,Laravel 不会在 API 调用中刷新“laravel_token”(和相应的 cookie)(当我调用“web”路由时它会这样做)。因此,“laravel_token”会在某个时间点过期,用户需要重新登录。

如何强制 Laravel 在每次从 axios 调用 API 路由时刷新“laravel_token”(从而延长其有效性)?

非常感谢任何帮助!

【问题讨论】:

  • 确定用户必须再次登录之前的长度,然后如果它过期,那就是硬奶酪。对于那些更频繁地使用该应用程序的人,您应该检查 jwt 到期时间并决定何时发送刷新令牌请求。 RTM:laravel.com/docs/5.6/passport#refreshing-tokens
  • 感谢您的快速回答。我也可以使用它来刷新令牌的 JWT 版本的“laravel_token”吗?更一般地说,我的问题是,如果这真的有必要。当我的用户在令牌的生命周期内与 API 交互时,我的理解是它应该被延长 - 无论如何这不会在 API 调用中自动发生(但它会在 Web 调用中发生)。
  • 嗨。你在用axios吗?如果是这样,当尝试使用过期的laravel_token 向您的 api 发送请求时,为所有 401 响应添加一个拦截器(github.com/axios/axios#interceptors),向用户发送他们的会话过期并且他们或 SPA 需要的警报或其他内容再次刷新页面。

标签: php laravel vuejs2 jwt laravel-passport


【解决方案1】:

我过去通过创建一个简单的路由(在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)

我在这里更详细一点:https://stackoverflow.com/a/57290268/6038111

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 2018-12-09
      • 2018-01-11
      • 2018-09-13
      • 1970-01-01
      • 2021-12-26
      • 2019-04-06
      • 2015-11-24
      • 2019-08-01
      相关资源
      最近更新 更多