0

jwt-auth自动刷新token

已有 1456人阅读此文 - - 未分类 - luoyy -
直接上代码,兼容laravel 8.*

<?php
namespace App\Http\Middleware;

use App\Traits\HasApiActions;
use Closure;
use Exception;
use Illuminate\Support\Facades\Auth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class AppToken extends BaseMiddleware
{
    use HasApiActions;

    public function handle($request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;
        try {
            // 获取解密后的TOKEN 设置默认guard api
            if (empty($token = Auth::getToken())) {
                return self::dump(401, '身份验证失败');
            }
            if (empty($payload = Auth::manager()->getJWTProvider()->decode($token->get()))) {
                return self::dump(401, '身份验证失败');
            }
            // $this->checkForToken($request);
            foreach ($guards as $guard) {
                // 用于自动认证是属于哪个guard的
                if (empty($guard = $guard ?? $payload['guard'] ?? null)) {
                    return self::dump(401, '身份验证失败');
                }
                // 使用 try 包裹,以捕捉 token 过期所抛出的 TokenExpiredException  异常
                try {
                    // 检测用户的登录状态且是当前数据库的,如果正常则通过 顺序必须这样,不然不会自动更新token
                    if ((strcmp($guard, Auth::guard($guard)->getClaim('guard')) !== 0) || is_null($user = Auth::guard($guard)->user())) {
                        return self::dump(401, '身份验证失败');
                    }
                    if ($user->is_invalid()) {
                        return self::dump(401, '账户状态无效');
                    }
                    return $next($request);
                } catch (TokenExpiredException $exception) {
                    try {
                        // 刷新用户的 token
                        $token = Auth::guard($guard)->refresh();
                    } catch (JWTException $e) {
                        return self::dump(401, $e->getMessage());
                    }
                    // 使用一次性登录以保证此次请求的成功 判断该用户的合法性
                    if (empty($payload['sub']) || !Auth::guard($guard)->onceUsingId($payload['sub'])) {
                        return self::dump(401, '身份验证失败');
                    }
                    if (Auth::guard($guard)->getUser()->is_invalid()) {
                        return self::dump(401, '账户状态无效');
                    }
                    return $this->setAuthenticationHeader($next($request), $token);
                } catch (JWTException $e) {
                    return self::dump(401, $e->getMessage());
                }
            }
            return self::dump(401, '身份验证失败');
        } catch (Exception $e) {
            return self::dump(401, '身份验证失败');
        }

    }
}
你喜欢下面的文章吗!Do you like the following articles?