php jwt刷新过期时间,laravel中jwt如何实现过期自动再生成token返回

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;

}

}

你可能感兴趣的:(php,jwt刷新过期时间)