diff --git a/spec/Gpenverne/PutioDriveBundle/EventListener/PutioCodeEventListenerSpec.php b/spec/Gpenverne/PutioDriveBundle/EventListener/PutioCodeEventListenerSpec.php index fb91b65..e2ee4e2 100644 --- a/spec/Gpenverne/PutioDriveBundle/EventListener/PutioCodeEventListenerSpec.php +++ b/spec/Gpenverne/PutioDriveBundle/EventListener/PutioCodeEventListenerSpec.php @@ -24,8 +24,9 @@ public function let( $tokenStd->access_token = 'a-token'; $event->getCode()->willReturn('a-code'); - $urlGenerator->getTokenUrl('a-code')->willReturn('an-url'); - $httpClient->getJson('an-url')->willReturn($tokenStd); + $urlGenerator->getTokenUrl()->willReturn('an-url'); + $urlGenerator->getTokenUrlParameters('a-code')->willReturn(['some-parameters']); + $httpClient->getJson('an-url', ['some-parameters'])->willReturn($tokenStd); $this->beConstructedWith($dispatcher, $urlGenerator, $httpClient); } @@ -44,7 +45,7 @@ public function it_retrieves_a_token($event) public function it_throws_a_no_token_exception_if_no_token_found($tokenStd, $event, $httpClient) { - $httpClient->getJson('an-url')->willReturn('something wrong'); + $httpClient->getJson('an-url', ['some-parameters'])->willReturn('something wrong'); $this->shouldThrow(NoTokenFoundException::class)->duringGetToken('a-code'); } } diff --git a/spec/Gpenverne/PutioDriveBundle/Service/HttpClientSpec.php b/spec/Gpenverne/PutioDriveBundle/Service/HttpClientSpec.php index f1306f5..e1c2593 100644 --- a/spec/Gpenverne/PutioDriveBundle/Service/HttpClientSpec.php +++ b/spec/Gpenverne/PutioDriveBundle/Service/HttpClientSpec.php @@ -22,7 +22,7 @@ public function it_is_initializable() public function it_makes_get_request_using_guzzle_client(StreamInterface $stream, RequestInterface $request, $client) { - $client->request('GET', 'some-url', ['headers' => ['Accept' => 'application/json']])->willReturn($request)->shouldBeCalled(); + $client->request('GET', 'some-url', ['headers' => ['Accept' => 'application/json'], 'query' => []])->willReturn($request)->shouldBeCalled(); $request->getBody()->willReturn($stream); $stream->getContents()->willReturn('Some content'); @@ -31,7 +31,7 @@ public function it_makes_get_request_using_guzzle_client(StreamInterface $stream public function it_makes_get_request_and_return_json(StreamInterface $stream, RequestInterface $request, $client) { - $client->request('GET', 'some-url', ['headers' => ['Accept' => 'application/json']])->willReturn($request)->shouldBeCalled(); + $client->request('GET', 'some-url', ['headers' => ['Accept' => 'application/json'], 'query' => []])->willReturn($request)->shouldBeCalled(); $request->getBody()->willReturn($stream); $stream->getContents()->willReturn('"some json content"'); diff --git a/spec/Gpenverne/PutioDriveBundle/Service/UrlGeneratorSpec.php b/spec/Gpenverne/PutioDriveBundle/Service/UrlGeneratorSpec.php index 221c002..118e042 100644 --- a/spec/Gpenverne/PutioDriveBundle/Service/UrlGeneratorSpec.php +++ b/spec/Gpenverne/PutioDriveBundle/Service/UrlGeneratorSpec.php @@ -23,7 +23,7 @@ public function let(Router $router, RequestStack $requestStack, Request $request public function it_returns_a_redirect_url() { - $url = urlencode('http://a-full-url'); + $url = 'http://a-full-url'; $this->getRedirectUrl()->shouldReturn( sprintf('https://api.put.io/v2/oauth2/authenticate?client_id=a-client-id&response_type=code&redirect_uri=%s', $url) @@ -32,6 +32,17 @@ public function it_returns_a_redirect_url() public function it_returns_a_token_url() { - $this->getTokenUrl('a-code')->shouldReturn('https://api.put.io/v2/oauth2/access_token?client_id=a-client-id&client_secret=a-client-secret&grant_type=authorization_code&code=a-code&redirect_uri=http%3A%2F%2Fa-full-url'); + $this->getTokenUrl()->shouldReturn('https://api.put.io/v2/oauth2/access_token'); + } + + public function it_returns_token_url_parameters() + { + $this->getTokenUrlParameters('some-code')->shouldReturn([ + 'client_id' => 'a-client-id', + 'client_secret' => 'a-client-secret', + 'grant_type' => 'authorization_code', + 'code' => 'some-code', + 'redirect_uri' => 'http://a-full-url', + ]); } } diff --git a/src/DependencyInjection/PutioDriveExtension.php b/src/DependencyInjection/PutioDriveExtension.php index bda68d4..415f0db 100644 --- a/src/DependencyInjection/PutioDriveExtension.php +++ b/src/DependencyInjection/PutioDriveExtension.php @@ -20,5 +20,6 @@ public function load(array $configs, ContainerBuilder $container) new FileLocator(__DIR__.'/../Resources/config') ); $loader->load('services.yml'); + $loader->load('parameters.yml'); } } diff --git a/src/EventListener/PutioCodeEventListener.php b/src/EventListener/PutioCodeEventListener.php index 3615a44..5e2a4f2 100644 --- a/src/EventListener/PutioCodeEventListener.php +++ b/src/EventListener/PutioCodeEventListener.php @@ -61,8 +61,10 @@ public function onCodeObtained(PutioCodeEvent $event) */ public function getToken($code) { - $url = $this->urlGenerator->getTokenUrl($code); - $data = $this->httpClient->getJson($url); + $url = $this->urlGenerator->getTokenUrl(); + $parameters = $this->urlGenerator->getTokenUrlParameters($code); + + $data = $this->httpClient->getJson($url, $parameters); if (null === $data || !is_object($data) || !isset($data->access_token)) { $result = $data; diff --git a/src/Resources/config/parameters.yml b/src/Resources/config/parameters.yml new file mode 100644 index 0000000..7d5c87f --- /dev/null +++ b/src/Resources/config/parameters.yml @@ -0,0 +1,3 @@ +parameters: + putio.guzzle.parameters: + base_uri: "https://api.put.io/v2/oauth2/" diff --git a/src/Resources/config/services.yml b/src/Resources/config/services.yml index e23cb28..f92ed61 100644 --- a/src/Resources/config/services.yml +++ b/src/Resources/config/services.yml @@ -17,7 +17,7 @@ services: putio.drive.http_client: class: Gpenverne\PutioDriveBundle\Service\HttpClient arguments: - - "@put.guzzle.client" + - "@putio.guzzle.client" putio.drive.url_generator: class: Gpenverne\PutioDriveBundle\Service\UrlGenerator arguments: @@ -51,8 +51,10 @@ services: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 0 } # -- external - put.guzzle.client: + putio.guzzle.client: class: GuzzleHttp\Client + arguments: + - "%putio.guzzle.parameters%" psr_cloud_files.factory.folder: class: Gpenverne\PsrCloudFiles\Factories\FolderFactory psr_cloud_files.factory.file: diff --git a/src/Service/HttpClient.php b/src/Service/HttpClient.php index b3c05a1..d7bfb29 100644 --- a/src/Service/HttpClient.php +++ b/src/Service/HttpClient.php @@ -32,9 +32,9 @@ public function get($url) * * @return mixed */ - public function getJson($url) + public function getJson($url, $parameters = []) { - $res = $this->getResponse($url); + $res = $this->getResponse($url, 'GET', $parameters); return json_decode($res->getBody()->getContents()); } @@ -47,10 +47,11 @@ public function getJson($url) * * @return StreamInterface */ - private function getResponse($url, $method = 'GET') + private function getResponse($url, $method = 'GET', $parameters = []) { return $this->client->request($method, $url, [ 'headers' => $this->getDefaultHeaders(), + 'query' => $parameters, ]); } diff --git a/src/Service/UrlGenerator.php b/src/Service/UrlGenerator.php index 4000dd9..9d13120 100644 --- a/src/Service/UrlGenerator.php +++ b/src/Service/UrlGenerator.php @@ -5,6 +5,9 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Routing\Router; +/** + * @see https://put.io/v2/docs/gettingstarted.html#obtain-an-access-token-oauth-token + */ class UrlGenerator { const CODE_PARAMETER = 'code'; @@ -38,18 +41,32 @@ public function __construct(Router $router, RequestStack $requestStack, $params) */ public function getRedirectUrl() { - $url = 'https://api.put.io/v2/oauth2/authenticate?client_id=%s&response_type=code&redirect_uri=%s'; + $url = 'authenticate?client_id=%s&response_type=code&redirect_uri=%s'; - return sprintf($url, $this->params['client_id'], urlencode($this->params['redirect_uri'])); + return sprintf($url, $this->params['client_id'], $this->params['redirect_uri']); } /** * @return string */ - public function getTokenUrl($code) + public function getTokenUrl() { - $url = 'https://api.put.io/v2/oauth2/access_token?client_id=%s&client_secret=%s&grant_type=authorization_code&code=%s&redirect_uri=%s'; + return '/access_token'; + } - return sprintf($url, $this->params['client_id'], $this->params['client_secret'], $code, urlencode($this->params['redirect_uri'])); + /** + * @param string $code + * + * @return array + */ + public function getTokenUrlParameters($code) + { + return [ + 'client_id' => $this->params['client_id'], + 'client_secret' => $this->params['client_secret'], + 'grant_type' => 'authorization_code', + 'code' => $code, + 'redirect_uri' => $this->params['redirect_uri'], + ]; } }