You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.5 KiB

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Middleware\Auth;
  4. use Hyperf\HttpServer\Contract\RequestInterface as HttpRequest;
  5. use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
  6. use Psr\Container\ContainerInterface;
  7. use Psr\Http\Message\ResponseInterface;
  8. use Psr\Http\Server\MiddlewareInterface;
  9. use Psr\Http\Message\ServerRequestInterface;
  10. use Psr\Http\Server\RequestHandlerInterface;
  11. class ApiMiddleware implements MiddlewareInterface
  12. {
  13. /**
  14. * @var ContainerInterface
  15. */
  16. protected $container;
  17. /**
  18. * @var HttpResponse
  19. */
  20. protected $response;
  21. /**
  22. * @var HttpRequest
  23. */
  24. protected $request;
  25. public function __construct(ContainerInterface $container, HttpResponse $response, HttpRequest $request)
  26. {
  27. $this->container = $container;
  28. $this->response = $response;
  29. $this->request = $request;
  30. }
  31. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
  32. {
  33. if (env('APP_ENV') == 'dev') {
  34. return $handler->handle($request);
  35. }
  36. // 签名校验
  37. # 获取参数
  38. $params = $this->request->all();
  39. # 必须参数,签名、时间戳、随机数
  40. if (!(isset($params['sign'])&&isset($params['timestamp'])&&isset($params['rand']))) {
  41. $content = [
  42. "status" => 'ok',
  43. "code" => 9001,
  44. "result" => [],
  45. "message" => '接口验签失败:缺少参数'
  46. ];
  47. return $this->response->json($content);
  48. }
  49. if (!$this->checkSign($params)) {
  50. $content = [
  51. "status" => 'ok',
  52. "code" => 9002,
  53. "result" => [],
  54. "message" => '接口验签失败:签名错误或已失效'
  55. ];
  56. return $this->response->json($content);
  57. }
  58. return $handler->handle($request);
  59. }
  60. private function checkSign($params)
  61. {
  62. $sign = $params['sign'];
  63. unset($params['sign']);
  64. $timestamp = $params['timestamp'];
  65. if (empty($sign) || ($timestamp+config('autoload.auth.api.sign.expire')) < time()) {
  66. return false;
  67. }
  68. ksort($params);
  69. $params = http_build_query($params);
  70. return $sign == $this->signature($params);
  71. }
  72. private function signature($http_query)
  73. {
  74. return sha1(md5($http_query).config('autoload.auth.api.sign.secret_key'));
  75. }
  76. }