RequestListener.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. namespace Base\OAuthClientBundle\EventListener;
  3. use Symfony\Component\HttpFoundation\RedirectResponse;
  4. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  5. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
  6. class RequestListener
  7. {
  8. /**
  9. * @var TokenStorage
  10. */
  11. protected $securityTokenStorage;
  12. /**
  13. * @var string
  14. */
  15. protected $client_id;
  16. /**
  17. * @var string
  18. */
  19. protected $client_secret;
  20. /**
  21. * @var string
  22. */
  23. protected $access_token_url;
  24. /**
  25. * @param ContainerInterface $serviceContainer
  26. * @param string $client_id
  27. * @param string $client_secret
  28. * @param string $access_token_url
  29. */
  30. public function __construct($serviceContainer, $client_id, $client_secret, $access_token_url)
  31. {
  32. $this->container = $serviceContainer;
  33. $this->securityTokenStorage = $serviceContainer->get('security.token_storage');
  34. $this->client_id = $client_id;
  35. $this->client_secret = $client_secret;
  36. $this->access_token_url = $access_token_url;
  37. }
  38. /**
  39. * @param GetResponseEvent $event
  40. *
  41. * @return type
  42. */
  43. public function onKernelRequest(GetResponseEvent $event)
  44. {
  45. if (!$event->isMasterRequest()) {
  46. return;
  47. }
  48. try {
  49. // Autologin por GET parameters
  50. $request = $event->getRequest();
  51. $authorizationUrl = $this->container->get('hwi_oauth.security.oauth_utils')->getAuthorizationUrl($request, 'login');
  52. $username = $request->query->get('username');
  53. $plainPassword = $request->query->get('password');
  54. if ($username && $plainPassword) {
  55. $event->setResponse(new RedirectResponse($authorizationUrl . "&username={$username}&password={$plainPassword}"));
  56. return;
  57. }
  58. } catch(\Exception $ex) {
  59. }
  60. $token = $this->securityTokenStorage->getToken();
  61. if ($token && method_exists($token, 'isExpired') && $token->isExpired()) {
  62. $parameters = array(
  63. 'refresh_token' => $token->getRefreshToken(),
  64. 'grant_type' => 'refresh_token',
  65. 'client_id' => $this->client_id,
  66. 'client_secret' => $this->client_secret
  67. );
  68. $curl = curl_init();
  69. curl_setopt_array($curl, array(
  70. CURLOPT_RETURNTRANSFER => 1,
  71. CURLOPT_URL => $this->access_token_url . '?' . http_build_query($parameters, '', '&')
  72. ));
  73. $response = curl_exec($curl);
  74. curl_close($curl);
  75. $newToken = json_decode($response, true);
  76. if (isset($newToken['access_token']) && isset($newToken['refresh_token']) && isset($newToken['expires_in'])) {
  77. $token->setAccessToken($newToken['access_token']);
  78. $token->setRefreshToken($newToken['refresh_token']);
  79. $token->setExpiresIn($newToken['expires_in']);
  80. $this->securityTokenStorage->setToken($token);
  81. }
  82. }
  83. return;
  84. }
  85. }