开发者问题收集

当令牌过期时,Laravel 护照会获取新的访问令牌

2020-08-29
2030

我想实现一个短时间的令牌。假设是 1 天。此外,我的路由有 auth:api 中间件:

Route::middleware('auth:api')->post('auth/test', 'AuthController@test');

当令牌过期时,用户将从客户端注销(带有 401 响应代码)。从 UX 的角度来看,这不是一个好主意。我该如何处理?

注意: 我已经在 CodeIgniter 中实现了这样的场景。我有一个有效期为 10 分钟的访问令牌和一个非常长的刷新令牌(可能一年)。我在数据库中有一个刷新令牌的引用。因此,在 10 分钟内,如果令牌有效,则无需触及数据库。如果它已过期,我会根据刷新令牌向用户返回一个新令牌。

1个回答

一种方法是在路由上使用 中间件 ,该中间件将在应用程序处理请求后执行其任务。因此,在您的中间件中,您可以检查响应是否为 401(未授权),如果是,那么您可以从标头中获取过期的令牌,并从过期的令牌中重新生成新的访问令牌并将其返回给用户。

编辑另一种方法

如果用户未进行身份验证,Laravel 将抛出 AuthenticationException

此异常由 Illuminate/Foundation/Exceptions/Handler.php 中的 render 方法处理,并将依次调用 unauthenticated() 方法,该方法定义在您的 app/Exceptions/Handler.php 中:因此您可以在此方法中编写逻辑,从过期令牌生成新令牌,然后将其返回给用户,如

protected function unauthenticated($request, AuthenticationException $exception)
{
    // generate new token and return it to the user and redirect user to the 
    //intended route.

    return redirect()->intended('defaultpage');
}
Saddam
2020-08-29