70 lines
2.1 KiB
PHP
70 lines
2.1 KiB
PHP
|
<?php
|
|||
|
namespace App\Middleware;
|
|||
|
|
|||
|
use Tinywan\Jwt\JwtToken;
|
|||
|
use App\Utils\ApiResponse;
|
|||
|
use Webman\Http\Request;
|
|||
|
use Webman\Http\Response;
|
|||
|
use Webman\MiddlewareInterface;
|
|||
|
|
|||
|
use ReflectionClass;
|
|||
|
|
|||
|
class JwtAuthMiddleware implements MiddlewareInterface
|
|||
|
{
|
|||
|
/**
|
|||
|
* 处理请求
|
|||
|
*
|
|||
|
* @param Request $request
|
|||
|
* @param callable $handler
|
|||
|
* @return Response
|
|||
|
*/
|
|||
|
public function process(Request $request, callable $handler): Response
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 通过反射获取不需要登录的方法
|
|||
|
*/
|
|||
|
$controller = new ReflectionClass($request->controller);
|
|||
|
/**
|
|||
|
* apidoc 直接继续向洋葱芯穿越
|
|||
|
*/
|
|||
|
if($controller->name=='hg\apidoc\Controller'){
|
|||
|
return $handler($request);
|
|||
|
}
|
|||
|
$noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? [];
|
|||
|
if (in_array($request->action, $noNeedLogin)) {
|
|||
|
// 不需要登录的方法继续向洋葱芯穿越
|
|||
|
return $handler($request);
|
|||
|
}
|
|||
|
|
|||
|
// 获取 Authorization 头部中的 token,通常格式为 "Bearer <token>"
|
|||
|
$token = $request->header('Authorization') ?? '';
|
|||
|
|
|||
|
// 检查 token 是否为空
|
|||
|
if (empty($token)) {
|
|||
|
return ApiResponse::error(401, ['error' => '缺少令牌'], '未授权');
|
|||
|
}
|
|||
|
|
|||
|
// 移除 Bearer 前缀并获取纯 token
|
|||
|
// if (strpos($token, 'Bearer ') === 0) {
|
|||
|
// $token = substr($token, 7); // 去掉 "Bearer " 部分
|
|||
|
// }
|
|||
|
|
|||
|
try {
|
|||
|
// 解码 token,返回用户信息
|
|||
|
$decoded = JwtToken::getExtend($token);
|
|||
|
// var_dump($decoded);
|
|||
|
} catch (\Exception $e) {
|
|||
|
// 解码失败,返回无效令牌错误
|
|||
|
return ApiResponse::error(401, ['error' => '无效的令牌'], '未授权');
|
|||
|
}
|
|||
|
|
|||
|
// 将解码后的用户信息存储到请求对象的 user 属性中
|
|||
|
// $request = $request->withAttribute('user', $decoded);
|
|||
|
$request->data = $decoded;
|
|||
|
// 继续处理请求,传递给下一个中间件或控制器,并返回响应
|
|||
|
return $handler($request);
|
|||
|
}
|
|||
|
}
|