laravel中jwt如何实现过期自动再生成token返回
目前的想法是在中间件中处理,但是遇到问题了。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Redis;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
class RefreshToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$newToken = null;
$auth = auth('api');
if (! $token = $auth->setRequest($request)->getToken()) {
return response()->json([
'status_code' => 500,
'message' => '无参数token',
'time' => time(),
]);
}
try {
$user = $auth->authenticate($token);
if (! $user) {
return response()->json([
'status_code' => 500,
'message' => '未查询到该用户信息',
'time' => time(),
]);
}
$request->headers->set('Authorization','Bearer '.$token);
} catch (TokenExpiredException $e) {
try {
// sleep(rand(1,5)/100);
$newToken = auth('api')->refresh();
$request->headers->set('Authorization','Bearer '.$newToken); // 给当前的请求设置性的token,以备在本次请求中需要调用用户信息
// 将旧token存储在redis中,30秒内再次请求是有效的
Redis::setex('token_blacklist:'.$token,30,$newToken);
} catch (JWTException $e) {
// 在黑名单的有效期,放行
if($newToken = Redis::get('token_blacklist:'.$token)){
$request->headers->set('Authorization','Bearer '.$newToken); // 给当前的请求设置性的token,以备在本次请求中需要调用用户信息
return $next($request);
}
// 过期用户
return response()->json([
'status_code' => 500,
'message' => '账号信息过期了,请重新登录',
'time' => time(),
]);
}
} catch (JWTException $e) {
return response()->json([
'status_code' => 500,
'message' => '无参数token',
'time' => time(),
]);
} catch (\Exception $e) {
return response()->json([
'status_code' => 500,
'message' => $e->getMessage(),
'time' => time(),
]);
}
$response = $next($request);
if ($newToken) {
$response->headers->set('Authorization', 'Bearer '.$newToken);
}
return $response;
}
}
$auth->authenticate($token);
这里抛出的异常却是IlluminateAuthAuthenticationException
这是啥情况,还望大神指点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
查到了原因,auth引用错误,