Laravel JWT实现token刷新
前言
之前写过一篇文章Laravel+JWT token 无痛刷新实现
这篇文章解决了无痛刷新的效果,用户无感知的实现token的自动刷新。
但是之前对JWT这一块刷新了解还不够深,出现有个小问题。
当某一次刷新token的时候,由于业务逻辑代码中使用了根据token调用用户信息,而前一个token已经过期且被刷新,业务逻辑中还是使用之前的token调用用户信息,导致出现NULL的错误。
修正
在之前的代码中添加一行(在请求头中添加新token),让其在后续业务逻辑中正常使用。
$request->headers->set('Authorization','Bearer '.$token); // token被刷新之后,保证本次请求在controller中需要根据token调取登录用户信息能够执行成功
下面是完整代码:
<?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);
}
}
@