webman_ad/app/middleware/JwtRpc.php
2025-01-06 10:47:22 +08:00

89 lines
2.7 KiB
PHP

<?php
namespace app\middleware;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
use GRPC\Auth\AuthClient;
use GRPC\Auth\ValidateJwtTokenReq;
use GRPC\Auth\JwtVerifyResult;
class JwtRpc implements MiddlewareInterface
{
protected $authClient;
public function __construct()
{
// 初始化 AuthClient
$host = "192.168.21.27:22101"; // 替换为你的 Auth 服务地址
$this->authClient = new AuthClient($host);
}
public function process(Request $request, callable $handler): Response
{
// 从请求头中获取 JWT token
$jwtToken = $request->header('Authorization');
if (!$jwtToken) {
return response()->json(['error' => 'Authorization token is missing'], 401);
}
// 去除 Bearer 前缀
if (strpos($jwtToken, 'Bearer ') === 0) {
$jwtToken = substr($jwtToken, 7);
}
try {
// 创建 GRPC 请求
dump($jwtToken);
$grpcRequest = new ValidateJwtTokenReq();
$grpcRequest->setJwtToken($jwtToken);
// 调用 GRPC 服务
list($response, $status) = $this->authClient->ValidateJwtToken($grpcRequest)->wait();
if ($status->code !== \Grpc\STATUS_OK) {
return Json([
'code' => 1,
'msg' => 'GRPC service error',
'data' => []
]);
}
// 检查验证结果
if ($response->getResult() !== JwtVerifyResult::JWT_VERIFY_OK) {
return Json([
'code' => 1,
'msg' => 'Invalid token',
'data' => []
]);
}
// 将解析的 claims 数据传递给下层业务逻辑
$claims = $response->getClaims();
dump($claims);
return Json([
'code' => 0,
'msg' => 'test token well',
'data' => []
]);
$request->jwtClaims = $claims;
// if ($result['is_valid']) {
// dump("JWT 验证成功: " . json_encode($result['claims']));
// } else {
// dump("JWT 验证失败: " . $result['error']);
// }
// if (!$isValid) {
// return response()->json(['error' => 'Invalid token'], 401);
// }
// 如果验证通过,则继续处理请求
return $handler($request);
} catch (\Exception $e) {
return new Response(500, [], json_encode(['error' => 'Internal server error']));
}
}
}