laravel中jwt如何实现过期自动再生成token返回

发布于 2022-09-11 19:03:47 字数 2888 浏览 16 评论 0

目前的想法是在中间件中处理,但是遇到问题了。

<?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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怀里藏娇 2022-09-18 19:03:47

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

use Tymon\JWTAuth\Facades\JWTAuth;
...
$auth = JWTAuth::parseToken();
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文