这里是文章模块栏目内容页
laravel中间件实现jwt到期通知客户端刷新token的方案
   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"


更多栏目
相关内容