89 lines
2.7 KiB
PHP
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']));
|
|
}
|
|
}
|
|
}
|