80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| 
 | ||
| namespace app\middleware;
 | ||
| 
 | ||
| use Webman\MiddlewareInterface;
 | ||
| use Webman\Http\Request;
 | ||
| use Webman\Http\Response;
 | ||
| use Firebase\JWT\JWT as FJWT;
 | ||
| use Firebase\JWT\Key;
 | ||
| use Exception;
 | ||
| 
 | ||
| class JwtLocal implements MiddlewareInterface
 | ||
| {
 | ||
|     // 签名密钥
 | ||
|     private const SIGNING_KEY = '83OP5jf43875jK7';
 | ||
| 
 | ||
|     public function process(Request $request, callable $handler): Response
 | ||
|     {
 | ||
|         // 获取 Authorization 头
 | ||
|         $authorization = $request->header('Authorization', '');
 | ||
|         if (empty($authorization) || strpos($authorization, 'Bearer ') !== 0) {
 | ||
|             return Json([
 | ||
|                 'code' => 1,
 | ||
|                 'msg' => '缺少 Authorization 头或格式无效',
 | ||
|                 'data' => []
 | ||
|             ]);
 | ||
|         }
 | ||
| 
 | ||
|         // 提取 JWT token
 | ||
|         $jwtToken = substr($authorization, 7);
 | ||
| 
 | ||
|         try {
 | ||
|             // 使用 firebase/php-jwt 解码并验证 JWT
 | ||
| //             $decoded = FJWT::decode($jwtToken, new Key(self::SIGNING_KEY, 'HS512'), $headers = new stdClass());  // 使用 HMAC-SHA512 算法进行验证
 | ||
|             $decoded = FJWT::decode($jwtToken, new Key(self::SIGNING_KEY, 'HS512'));
 | ||
| 
 | ||
|             // 将解码后的数据(即 claims)存入请求对象,后续可以访问
 | ||
|             $request->jwtClaims = (array)$decoded;
 | ||
| 
 | ||
|             // 验证 JWT Token
 | ||
| //            dump((array)$decoded);
 | ||
| //            return Json([
 | ||
| //                'code' => 0,
 | ||
| //                'msg' => 'JWT 验证成功',
 | ||
| //                'data' => []
 | ||
| //            ]);
 | ||
| 
 | ||
|             // 继续处理请求
 | ||
|             return $handler($request);
 | ||
|         } catch (Exception $e) {
 | ||
| 
 | ||
|             return Json([
 | ||
|                 'code' => 1,
 | ||
|                 'msg' => $e->getMessage(),
 | ||
|                 'data' => []
 | ||
|             ]);
 | ||
| 
 | ||
| //            return response(['code' => 1, 'msg' => 'JWT 验证失败: ' . $e->getMessage()], 200);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     private function getErrorMessage($result)
 | ||
|     {
 | ||
|         switch ($result) {
 | ||
|             case 'JWT_VERIFY_BAD_FORMAT':
 | ||
|                 return '无效的 token 格式';
 | ||
|             case 'JWT_VERIFY_SIGN_FAILED':
 | ||
|                 return 'token 签名无效';
 | ||
|             case 'JWT_VERIFY_EXPIRED':
 | ||
|                 return 'token 已过期';
 | ||
|             case 'JWT_VERIFY_REVOKED':
 | ||
|                 return 'token 已被撤销';
 | ||
|             case 'JWT_VERSION_LOW':
 | ||
|                 return 'token 版本过低';
 | ||
|             default:
 | ||
|                 return '未知错误';
 | ||
|         }
 | ||
|     }
 | ||
| }
 |