RequestListener.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace Base\OAuthClientBundle\EventListener;
  3. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  4. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
  5. class RequestListener
  6. {
  7. /**
  8. * @var TokenStorage
  9. */
  10. protected $securityTokenStorage;
  11. /**
  12. * @var string
  13. */
  14. protected $client_id;
  15. /**
  16. * @var string
  17. */
  18. protected $client_secret;
  19. /**
  20. * @var string
  21. */
  22. protected $access_token_url;
  23. /**
  24. * @param TokenStorage $securityTokenStorage
  25. * @param string $client_id
  26. * @param string $client_secret
  27. * @param string $access_token_url
  28. */
  29. public function __construct(TokenStorage $securityTokenStorage, $client_id, $client_secret, $access_token_url)
  30. {
  31. $this->securityTokenStorage = $securityTokenStorage;
  32. $this->client_id = $client_id;
  33. $this->client_secret = $client_secret;
  34. $this->access_token_url = $access_token_url;
  35. }
  36. /**
  37. * @param GetResponseEvent $event
  38. *
  39. * @return type
  40. */
  41. public function onKernelRequest(GetResponseEvent $event)
  42. {
  43. if (!$event->isMasterRequest()) {
  44. return;
  45. }
  46. $token = $this->securityTokenStorage->getToken();
  47. if ($token && method_exists($token, 'isExpired') && $token->isExpired()) {
  48. $parameters = array(
  49. 'refresh_token' => $token->getRefreshToken(),
  50. 'grant_type' => 'refresh_token',
  51. 'client_id' => $this->client_id,
  52. 'client_secret' => $this->client_secret
  53. );
  54. $curl = curl_init();
  55. curl_setopt_array($curl, array(
  56. CURLOPT_RETURNTRANSFER => 1,
  57. CURLOPT_URL => $this->access_token_url . '?' . http_build_query($parameters, '', '&')
  58. ));
  59. $response = curl_exec($curl);
  60. curl_close($curl);
  61. $newToken = json_decode($response, true);
  62. if (isset($newToken['access_token']) && isset($newToken['refresh_token']) && isset($newToken['expires_in'])) {
  63. $token->setAccessToken($newToken['access_token']);
  64. $token->setRefreshToken($newToken['refresh_token']);
  65. $token->setExpiresIn($newToken['expires_in']);
  66. $this->securityTokenStorage->setToken($token);
  67. }
  68. }
  69. return;
  70. }
  71. }