jwt 多guard 刷新token 失效

1. 运行环境

"tymon/jwt-auth": "^2.0",

1). 当前使用的 Laravel 版本

laravel 9.49

2). 当前使用的 php/php-fpm 版本

PHP 版本:php8.0

3). 当前系统

centos 8

4). 业务环境

开发环境

5). 相关软件版本

 Nginx php mysql redis rabbitmq

2. 问题

token 过期刷新 token response 是返回了但是这次访问返回401

4. 代码如下

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Facades\JWTAuth;
use Auth;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class RefreshToken extends BaseMiddleware
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, $guard)
    {
        try {
            $this->checkForToken($request);
            if($this->auth->parseToken()->authenticate($guard))
            {
                return $next($request);
            }

        }catch (TokenExpiredException $e){
            try {
                Auth::guard($guard)->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
                $token = $this->auth->refresh();
                $newToken = JWTAuth::refresh(JWTAuth::getToken());
                $response = $next($request);
                $response->header('Authorization', 'Bearer ' . $newToken);
                return $response;
            }catch (JWTException $e){
                return response()->json([
                    'message' => '登录失效',
                    'status_code' => 4011
                ], 401);
            }
        }catch (UnauthorizedHttpException $exception) {
            return response()->json([
                'message' => '请先登录',
                'status_code' => 401
            ], 401);
        }
    }


}
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3
laradocs

学到了,谢谢大佬 :grin:

1年前 评论
public function handle(Request $request, Closure $next, $guard)
    {
        try {
            $this->checkForToken($request);
            if($this->auth->parseToken()->authenticate($guard)) {
                return $next($request);
            }

           // 增加判断,有token但是过期了直接进入catch进行刷新
           throw new TokenExpiredException('jwt-auth', 'Please sign in.');
        }catch (TokenExpiredException $e){
            try {
                Auth::guard($guard)->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
                // 这两段代码是一样的,去掉一行
                $token = $this->auth->refresh();
                // $newToken = JWTAuth::refresh(JWTAuth::getToken());

                $request->headers->set('Authorization', 'Bearer ' . $token);
                //$response->header('Authorization', 'Bearer ' . $newToken);
                // 在响应头中返回新的 token
                return $this->setAuthenticationHeader($next($request), $token);
            }catch (JWTException $e){
                return response()->json([
                    'message' => '登录失效',
                    'status_code' => 4011
                ], 401);
            }
        }catch (UnauthorizedHttpException $exception) {
            return response()->json([
                'message' => '请先登录',
                'status_code' => 401
            ], 401);
        }
    }
1年前 评论
meclown

"tymon/jwt-auth": "^2.0", 的Tymon\JWTAuth\Http\Middleware\BaseMiddleware 不是标注废弃了吗?能正常使用吗?影响安全性吗?

9个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!