MENU

Laravel+JWT token无痛刷新实现

前言

最近使用JWT token作为后端api接口一个票据,具体做下无痛刷新token的方法,之前JWT都是过期用户要让用户重新登录并且刷新token方式实现,而这次的无痛刷新更是完善用户体验,无需重新登录刷新token。

具体实现

  • 新建一个中间件并且继承JWTAuth的基础中间件BaseMiddleware

  • 接着完善handle方法

    <?php
    
      namespace App\Http\Middleware;
      
      use Closure;
      use Tymon\JWTAuth\Facades\JWTAuth;
      use Tymon\JWTAuth\Exceptions\JWTException;
      use Tymon\JWTAuth\Exceptions\TokenExpiredException;
      use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
      use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
      
      class RefreshToken extends BaseMiddleware
      {
      
          /**
           * Handle an incoming request.
           *
           * @param  \Illuminate\Http\Request  $request
           * @param  \Closure  $next
           * @return mixed
           */
          public function handle($request, Closure $next)
          {
              //检查请求中是否带有token 如果没有token值则抛出异常
              $this->checkForToken($request);   
              try{
                  //从请求中获取token并且验证token是否过期  若是不过期则请求到控制器处理业务逻辑  若是过期则进行刷新
                  if ($request->user = JWTAuth::parseToken()->authenticate()) {       
                      return $next($request);
                  }
                  throw new UnauthorizedHttpException('jwt-auth', '未登录');
              }catch (TokenExpiredException $exception){
                  try{
                      //首先获得过期token 接着刷新token 再接着设置token并且验证token合法性
                      $token = JWTAuth::refresh(JWTAuth::getToken());
                      JWTAuth::setToken($token);
                      $request->user = JWTAuth::authenticate($token);
                      $request->headers->set('Authorization','Bearer '.$token); // token被刷新之后,保证本次请求在controller中需要根据token调取登录用户信息能够执行成功
                  }catch (JWTException $exception){
                      throw new UnauthorizedHttpException('jwt-auth', $exception->getMessage());
                  }
              }
              //将token值返回到请求头
              return $this->setAuthenticationHeader($next($request), $token);
          }
      }
    
  • Kernel中注册中间件

    /**
       * The application's route middleware.
       *
       * These middleware may be assigned to groups or used individually.
       *
       * @var array
       */
      protected $routeMiddleware = [
          ......
          'token.refresh' => \App\Http\Middleware\RefreshToken::class,   //token.refresh、RefreshToken均为博主自己取的名字 可以自行修改
      ];
    
  • 在路由中使用这个中间件就可以实现无痛刷新(当然还需要前端配合跟换token值,后端是已经完成啦)

参考文章:
Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证以及无痛刷新访问令牌
jwt-auth官方wiki

标签: php, laravel
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码