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