public function handle($request, Closure $next, ...$guards)
{
$refresh_token = '';
$jwt_expire = (env('JWT_TTL') / 2) * 60;
$expire = '';
$auth = auth('api');
try { //验证是否过期 token
$payload = $auth->getPayload();
$expire = $payload->get('exp');
if ($expire < time() + $jwt_expire) {
throw new TokenExpiredException('expire');
}
} catch (TokenExpiredException $e) {
//这里可能是jwttoken: 1、$redis_expire 段时间后才过期。 2、真实的已经过期。
//情况2时,刷新token 会报错。
/** */
try {
//刷新新的token
$refresh_token = $auth->refresh();
// Log::info('refresh', ['token'=> $refresh_token]);
} catch (JWTException $e) {
//真的过期了
return Response()->json(['message'=>'1.Authentication check failed'], 401);
}
} catch(TokenBlacklistedException $e) {
//因为token 在黑名单
return Response()->json(['message'=> $e->getMessage()], 401);
}catch (JWTException $e) {
//因为过期产生
return Response()->json(['message'=>'2.Authentication check failed'], 401);
}
try {
$this->authenticate($request, $guards);
} catch(\Illuminate\Auth\AuthenticationException $e) {
return Response()->json(['message'=>'3.Authentication check failed'], 401);
}
$response = $next($request);
if($refresh_token){
//返回header数据给客户端,告知请求refresh接口刷新取新token
$response->header("Authorization", "Bearer please refresh token" );
}
return $response;
}
客户端要统一处理访问返回的header数据,header返回里面有
Authorization
变量,就请求服务器端的要给刷新jwt token的接口,实现刷新token
这样处理的目的时,防止token设置几个小时到期,而用户的浏览器一直打开在线操作,刚好遇见 jwttoken到期,认证失败 的情况发生。
另外:
JWT_BLACKLIST_GRACE_PERIOD=120
这参数一定要设置 时间 120 秒,表示刷新token后,旧的token120秒后才过期。默认的 laravel jwttoken组件 是设置为0 的。即刷新token,旧token马上失效。失效了,当次请求也会失败的。
laravel 的jwt 组件 采用
"tymon/jwt-auth": "^1.0"