JWT 刷新操作写在 middleware ('auth:API') 是否是 bug? 请管理管处理
无论是第三本教材 还是 jwt的案例代码,都是把刷新操作放在了 middleware(‘auth:api’)中,
如:
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);
}
public function refresh()
{
return $this->respondWithToken(auth()->refresh());
}
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth()->factory()->getTTL() * 60
]);
}
那么问题来了 如果失效的 JWT_TTL 是 1分钟 而JWT_REFRESH_TTL是10分钟,
在2分钟后 token 肯定失效了, 但是根JWT_REFRESH_TTL10分钟 我们可以请求刷新一个新的token,但是 refresh 方法写在了 登陆后的操作中,那么本身失效了,无法登陆成功,又怎么才能去请求一个新的token呢?
:joy: 求解答
是的,所以你要在token生效时间内去刷新
刷新 token 的用途是在 token 即将过期之前换取一个新的token, 以实现无痛刷新。 如果 token 已经过期就不存在刷新 token 的问题,应该是重新登录获取 token 了。 理解这个场景再去设置相应的参数自然就明白了。
@zxdstyle 实在不好意思 还是要 请教下 这个文章下面关于 时间的我看了, 那么有个问题哈,
用户登录态失效有两种情况,这也是token为什么有两种过期时间
JWT_TTL
和JWT_REFRESH_TTL
JWT_TTL
是代表当前token的失效时间,在这个时间之内你的登录态是正常的,这个时间到了,你可以用旧token去换新tokenJWT_REFRESH_TTL
是代表token的刷新上限时间,在这个时间内,你可以正常刷新token,举个例子,你JWT_TTL
定义为120(2个小时),JWT_REFRESH_TTL
定义为1440(24个小时),那么24个小时之内你可以最少需要换1440/120-1次token,这个时间到了那就需要重新登录了,无痛刷新有两种方案,一种是教程的,通过前端的过期时间判断当前token是否失效,然后去主动请求刷新token的接口,另一种就是通过中间件先判断登录态,根据抛出的异常去决定是刷新token还是重新登录,两种方案各有利弊,看需求取舍