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
这是啥情况,还望大神指点

阅读 3.5k
1 个回答

查到了原因,auth引用错误,

use Tymon\JWTAuth\Facades\JWTAuth;
...
$auth = JWTAuth::parseToken();
...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题