jwt 多guard 刷新token 失效
1. 运行环境
"tymon/jwt-auth": "^2.0",
1). 当前使用的 Laravel 版本
laravel 9.49
2). 当前使用的 php/php-fpm 版本
PHP 版本:php8.0
3). 当前系统
centos 8
4). 业务环境
开发环境
5). 相关软件版本
Nginx php mysql redis rabbitmq
2. 问题
token 过期刷新 token response 是返回了但是这次访问返回401了
4. 代码如下
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Facades\JWTAuth;
use Auth;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
class RefreshToken extends BaseMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next, $guard)
{
try {
$this->checkForToken($request);
if($this->auth->parseToken()->authenticate($guard))
{
return $next($request);
}
}catch (TokenExpiredException $e){
try {
Auth::guard($guard)->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
$token = $this->auth->refresh();
$newToken = JWTAuth::refresh(JWTAuth::getToken());
$response = $next($request);
$response->header('Authorization', 'Bearer ' . $newToken);
return $response;
}catch (JWTException $e){
return response()->json([
'message' => '登录失效',
'status_code' => 4011
], 401);
}
}catch (UnauthorizedHttpException $exception) {
return response()->json([
'message' => '请先登录',
'status_code' => 401
], 401);
}
}
}
学到了,谢谢大佬 :grin:
"tymon/jwt-auth": "^2.0", 的Tymon\JWTAuth\Http\Middleware\BaseMiddleware 不是标注废弃了吗?能正常使用吗?影响安全性吗?