src/Subscriber/BettingSignCheckerSubscriber.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpFoundation\JsonResponse;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. class BettingSignCheckerSubscriber implements EventSubscriberInterface
  10. {
  11.     private $secretKey;
  12.     public function __construct(string $secretKey)
  13.     {
  14.         $this->secretKey $secretKey;
  15.     }
  16.     public function onKernelRequest(RequestEvent $event)
  17.     {
  18.         if (!$this->isSupport($event->getRequest())) {
  19.             return;
  20.         }
  21.         if (false === $this->isSignValid($event->getRequest())) {
  22.             $response = new JsonResponse([
  23.                 'code' => 1,
  24.                 'message' => 'Sign invalid'
  25.             ], Response::HTTP_BAD_REQUEST);
  26.             $event->setResponse($response);
  27.         }
  28.     }
  29.     private function isSupport(Request $request)
  30.     {
  31.         return substr($request->get('_route'), 011) === 'api_betting'
  32.             && $request->isMethod('POST')
  33.             && $request->headers->has('Authorization')
  34.             && !empty($request->headers->get('Authorization'))
  35.             && substr($request->headers->get('Authorization'), 07) === 'Bearer '
  36.             && "json" === $request->getContentType();
  37.     }
  38.     private function isSignValid(Request $request)
  39.     {
  40.         $data json_decode($request->getContent(), true);
  41.         if (json_last_error() !== JSON_ERROR_NONE) {
  42.             return false;
  43.         }
  44.         ksort($data);
  45.         $dataSign md5(json_encode($data) . $this->secretKey);
  46.         $requestSign substr($request->headers->get('Authorization'), 7);
  47.         return $dataSign === $requestSign;
  48.     }
  49.     public static function getSubscribedEvents()
  50.     {
  51.         return [
  52.             KernelEvents::REQUEST => [['onKernelRequest'2]]
  53.         ];
  54.     }
  55. }