From 3f442b1b74492f06fad66c9a5844fe449c8f732d Mon Sep 17 00:00:00 2001 From: Rob Strong Date: Tue, 30 Dec 2014 17:24:54 -0500 Subject: [PATCH 01/25] id was not being returned by Google --- src/Provider/Google.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Provider/Google.php b/src/Provider/Google.php index 30f5392..dbd982a 100644 --- a/src/Provider/Google.php +++ b/src/Provider/Google.php @@ -43,7 +43,7 @@ class Google extends AbstractProvider { return 'https://www.googleapis.com/plus/v1/people/me?'. - 'fields=name(familyName%2CgivenName)%2CdisplayName%2C'. + 'fields=id%2Cname(familyName%2CgivenName)%2CdisplayName%2C'. 'emails%2Fvalue%2Cimage%2Furl&alt=json&access_token='.$token; } From c2b5b28ed6778ad1457ee80483192fcf6d31dd2f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 6 Jan 2015 15:16:03 +0100 Subject: [PATCH 02/25] Updated README.md to include Google Nest provider --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1117cb3..43c03cb 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ so please help them out with a pull request if you notice this. - [Yandex](https://packagist.org/packages/aego/oauth2-yandex) - [Vkontakte](https://packagist.org/packages/j4k/oauth2-vkontakte) - [Naver](https://packagist.org/packages/deminoth/oauth2-naver) +- [Google Nest](https://github.com/JC5/nest-oauth2-provider) ### Implementing your own provider From 707917df0185db25ab7294e0e876c46175e5117a Mon Sep 17 00:00:00 2001 From: hiroshi honma Date: Thu, 8 Jan 2015 20:17:22 +0900 Subject: [PATCH 03/25] Fix UserTest.php namespace --- test/src/Entity/UserTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/Entity/UserTest.php b/test/src/Entity/UserTest.php index 3a0670c..7772332 100644 --- a/test/src/Entity/UserTest.php +++ b/test/src/Entity/UserTest.php @@ -1,6 +1,6 @@ Date: Fri, 9 Jan 2015 13:37:08 +0000 Subject: [PATCH 04/25] Add token as param to the fetchProviderData method - This will allow us to override this implementation and implement for example a Authorization Bearer strategy --- src/Provider/AbstractProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Provider/AbstractProvider.php b/src/Provider/AbstractProvider.php index 6eab5a3..fcb038f 100644 --- a/src/Provider/AbstractProvider.php +++ b/src/Provider/AbstractProvider.php @@ -314,7 +314,7 @@ abstract class AbstractProvider implements ProviderInterface return $this->fetchProviderData($url); } - protected function fetchProviderData($url) + protected function fetchProviderData($url, AccessToken $token = null) { try { $client = $this->getHttpClient(); From c0d5151dea1f053e4d20734733b5cd0965b05ee8 Mon Sep 17 00:00:00 2001 From: Israel Sotomayor Date: Fri, 9 Jan 2015 14:40:49 +0000 Subject: [PATCH 05/25] Link FreeAgent provider to the documentation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 43c03cb..f162e11 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,7 @@ so please help them out with a pull request if you notice this. - [Vkontakte](https://packagist.org/packages/j4k/oauth2-vkontakte) - [Naver](https://packagist.org/packages/deminoth/oauth2-naver) - [Google Nest](https://github.com/JC5/nest-oauth2-provider) +- [FreeAgent](https://github.com/CloudManaged/oauth2-freeagent) ### Implementing your own provider From 4ad71baa74301fb34fb7f8c1b3278a510fadac0d Mon Sep 17 00:00:00 2001 From: Israel Sotomayor Date: Fri, 9 Jan 2015 17:58:17 +0000 Subject: [PATCH 06/25] Revert "Add token as param to the fetchProviderData method" This reverts commit ff344b207c27261a6b34b56bb9eec405a0def6b9. --- src/Provider/AbstractProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Provider/AbstractProvider.php b/src/Provider/AbstractProvider.php index fcb038f..6eab5a3 100644 --- a/src/Provider/AbstractProvider.php +++ b/src/Provider/AbstractProvider.php @@ -314,7 +314,7 @@ abstract class AbstractProvider implements ProviderInterface return $this->fetchProviderData($url); } - protected function fetchProviderData($url, AccessToken $token = null) + protected function fetchProviderData($url) { try { $client = $this->getHttpClient(); From 6e6f1d46dba34804a81afddfe3e5b14c252a035b Mon Sep 17 00:00:00 2001 From: Andu Date: Tue, 20 Jan 2015 12:31:49 +0000 Subject: [PATCH 07/25] Add access_type parameter for Google authorization url --- src/Provider/Google.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Provider/Google.php b/src/Provider/Google.php index dbd982a..76284e0 100644 --- a/src/Provider/Google.php +++ b/src/Provider/Google.php @@ -29,6 +29,18 @@ class Google extends AbstractProvider return $this->hostedDomain; } + public $accessType = ''; + + public function setAccessType($accessType) + { + $this->accessType = $accessType; + } + + public function getAccessType() + { + return $this->accessType; + } + public function urlAuthorize() { return 'https://accounts.google.com/o/oauth2/auth'; @@ -97,6 +109,10 @@ class Google extends AbstractProvider $url .= '&' . $this->httpBuildQuery(['hd' => $this->hostedDomain]); } + if (!empty($this->accessType)) { + $url .= '&' . $this->httpBuildQuery(['access_type'=> $this->accessType]); + } + return $url; } } From 3af07921959f1e317b99104eeff35bc999f7f2d0 Mon Sep 17 00:00:00 2001 From: Andu Date: Tue, 20 Jan 2015 12:35:46 +0000 Subject: [PATCH 08/25] Update Google provider tests --- test/src/Provider/GoogleTest.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/src/Provider/GoogleTest.php b/test/src/Provider/GoogleTest.php index 235b426..0d12156 100644 --- a/test/src/Provider/GoogleTest.php +++ b/test/src/Provider/GoogleTest.php @@ -15,6 +15,7 @@ class GoogleTest extends \PHPUnit_Framework_TestCase 'clientSecret' => 'mock_secret', 'redirectUri' => 'none', 'hostedDomain' => 'mock_domain', + 'accessType' => 'mock_access_type' ]); } @@ -37,6 +38,7 @@ class GoogleTest extends \PHPUnit_Framework_TestCase $this->assertArrayHasKey('response_type', $query); $this->assertArrayHasKey('approval_prompt', $query); $this->assertArrayHasKey('hd', $query); + $this->assertArrayHasKey('access_type', $query); $this->assertNotNull($this->provider->state); } @@ -107,4 +109,15 @@ class GoogleTest extends \PHPUnit_Framework_TestCase $this->provider->setHostedDomain('changed_domain'); $this->assertEquals('changed_domain', $this->provider->hostedDomain); } + + public function testGetAccessType() + { + $this->assertEquals('mock_access_type', $this->provider->getAccessType()); + } + + public function testSetAccessType() + { + $this->provider->setAccessType('changed_access_type'); + $this->assertEquals('changed_access_type', $this->provider->accessType); + } } From 3afc1f9a053901d42173813095823616c7254554 Mon Sep 17 00:00:00 2001 From: Andu Date: Tue, 20 Jan 2015 12:49:06 +0000 Subject: [PATCH 09/25] Add docblock for the access_type variable in the Google provider --- src/Provider/Google.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Provider/Google.php b/src/Provider/Google.php index 76284e0..1896885 100644 --- a/src/Provider/Google.php +++ b/src/Provider/Google.php @@ -29,6 +29,10 @@ class Google extends AbstractProvider return $this->hostedDomain; } + /** + * @var string If set, this will be sent to google as the "access_type" parameter. + * @link https://developers.google.com/accounts/docs/OAuth2WebServer#offline + */ public $accessType = ''; public function setAccessType($accessType) From 041ef04e78dd4ace76e5efab135e2aeb65ad47cc Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 26 Jan 2015 16:17:12 +0400 Subject: [PATCH 10/25] Remove outdated eventbrite snippet --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 43c03cb..2b7ac3b 100644 --- a/README.md +++ b/README.md @@ -63,12 +63,6 @@ if (!isset($_GET['code'])) { 'code' => $_GET['code'] ]); - // If you are using Eventbrite you will need to add the grant_type parameter (see below) - $token = $provider->getAccessToken('authorization_code', [ - 'code' => $_GET['code'], - 'grant_type' => 'authorization_code' - ]); - // Optional: Now you have a token you can look up a users profile data try { From ffef5ea6304790b025a7f4fe4e8aabef6d953556 Mon Sep 17 00:00:00 2001 From: Rachman Chavik Date: Mon, 26 Jan 2015 22:00:14 +0700 Subject: [PATCH 11/25] Fix regression for Github provider Closes #197 Ref: https://github.com/thephpleague/oauth2-client/issues/197#issuecomment-69527969 --- src/Provider/Github.php | 6 ++++-- test/src/Provider/GithubTest.php | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Provider/Github.php b/src/Provider/Github.php index b78727b..4dc01e2 100644 --- a/src/Provider/Github.php +++ b/src/Provider/Github.php @@ -10,6 +10,8 @@ class Github extends AbstractProvider public $domain = 'https://github.com'; + public $apiDomain = 'https://api.github.com'; + public function urlAuthorize() { return $this->domain.'/login/oauth/authorize'; @@ -23,7 +25,7 @@ class Github extends AbstractProvider public function urlUserDetails(\League\OAuth2\Client\Token\AccessToken $token) { if ($this->domain === 'https://github.com') { - return $this->domain.'/user?access_token='.$token; + return $this->apiDomain.'/user?access_token='.$token; } return $this->domain.'/api/v3/user?access_token='.$token; } @@ -31,7 +33,7 @@ class Github extends AbstractProvider public function urlUserEmails(\League\OAuth2\Client\Token\AccessToken $token) { if ($this->domain === 'https://github.com') { - return $this->domain.'/user/emails?access_token='.$token; + return $this->apiDomain.'/user/emails?access_token='.$token; } return $this->domain.'/api/v3/user/emails?access_token='.$token; } diff --git a/test/src/Provider/GithubTest.php b/test/src/Provider/GithubTest.php index c0843ca..94795ed 100644 --- a/test/src/Provider/GithubTest.php +++ b/test/src/Provider/GithubTest.php @@ -115,6 +115,23 @@ class GithubTest extends \PHPUnit_Framework_TestCase $this->assertEquals('mock_email', $this->provider->getUserEmail($token)); } + public function testGithubDomainUrls() + { + $client = m::mock('Guzzle\Service\Client'); + $response = m::mock('Guzzle\Http\Message\Response'); + $response->shouldReceive('getBody')->times(1)->andReturn('access_token=mock_access_token&expires=3600&refresh_token=mock_refresh_token&otherKey={1234}'); + + $client->shouldReceive('setBaseUrl')->times(1); + $client->shouldReceive('post->send')->times(1)->andReturn($response); + $this->provider->setHttpClient($client); + $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']); + + $this->assertEquals($this->provider->domain.'/login/oauth/authorize', $this->provider->urlAuthorize()); + $this->assertEquals($this->provider->domain.'/login/oauth/access_token', $this->provider->urlAccessToken()); + $this->assertEquals($this->provider->apiDomain.'/user?access_token=mock_access_token', $this->provider->urlUserDetails($token)); + $this->assertEquals($this->provider->apiDomain.'/user/emails?access_token=mock_access_token', $this->provider->urlUserEmails($token)); + } + public function testGithubEnterpriseDomainUrls() { $this->provider->domain = 'https://github.company.com'; From ebcb1b9abd6b891ce1cdf04f4274ec55c51ce204 Mon Sep 17 00:00:00 2001 From: SammyK Date: Mon, 26 Jan 2015 12:22:17 -0600 Subject: [PATCH 12/25] Upgrade Facebook provider to Graph v2.2 --- src/Provider/Facebook.php | 56 +++++++++++++++++++++++------- test/src/Provider/FacebookTest.php | 43 ++++++++++++++++++++--- 2 files changed, 81 insertions(+), 18 deletions(-) diff --git a/src/Provider/Facebook.php b/src/Provider/Facebook.php index f2e6bb1..9155836 100644 --- a/src/Provider/Facebook.php +++ b/src/Provider/Facebook.php @@ -6,43 +6,71 @@ use League\OAuth2\Client\Entity\User; class Facebook extends AbstractProvider { - public $scopes = ['offline_access', 'email', 'read_stream']; + /** + * @const string The fallback Graph API version to use for requests. + */ + const DEFAULT_GRAPH_VERSION = 'v2.2'; + + /** + * @var string The Graph API version to use for requests. + */ + protected $graphApiVersion; + + public $scopes = ['public_profile', 'email']; + public $responseType = 'string'; + public function __construct($options) + { + parent::__construct($options); + $this->graphApiVersion = (isset($options['graphApiVersion'])) + ? $options['graphApiVersion'] + : static::DEFAULT_GRAPH_VERSION; + } + public function urlAuthorize() { - return 'https://www.facebook.com/dialog/oauth'; + return 'https://www.facebook.com/'.$this->graphApiVersion.'/dialog/oauth'; } public function urlAccessToken() { - return 'https://graph.facebook.com/oauth/access_token'; + return 'https://graph.facebook.com/'.$this->graphApiVersion.'/oauth/access_token'; } public function urlUserDetails(\League\OAuth2\Client\Token\AccessToken $token) { - return 'https://graph.facebook.com/me?access_token='.$token; + $fields = implode(',', [ + 'id', + 'name', + 'first_name', + 'last_name', + 'email', + 'hometown', + 'bio', + 'picture.type(large){url}', + 'gender', + 'locale', + 'link', + ]); + + return 'https://graph.facebook.com/'.$this->graphApiVersion.'/me?fields='.$fields.'&access_token='.$token; } public function userDetails($response, \League\OAuth2\Client\Token\AccessToken $token) { - $client = $this->getHttpClient(); - $client->setBaseUrl('https://graph.facebook.com/me/picture?type=normal&access_token='.$token->accessToken); - $request = $client->get()->send(); - $info = $request->getInfo(); - $imageUrl = $info['url']; - $user = new User(); - $username = (isset($response->username)) ? $response->username : null; $email = (isset($response->email)) ? $response->email : null; + // The "hometown" field will only be returned if you ask for the `user_hometown` permission. $location = (isset($response->hometown->name)) ? $response->hometown->name : null; $description = (isset($response->bio)) ? $response->bio : null; - $imageUrl = ($imageUrl) ?: null; + $imageUrl = (isset($response->picture->data->url)) ? $response->picture->data->url : null; + $gender = (isset($response->gender)) ? $response->gender : null; + $locale = (isset($response->locale)) ? $response->locale : null; $user->exchangeArray([ 'uid' => $response->id, - 'nickname' => $username, 'name' => $response->name, 'firstname' => $response->first_name, 'lastname' => $response->last_name, @@ -50,6 +78,8 @@ class Facebook extends AbstractProvider 'location' => $location, 'description' => $description, 'imageurl' => $imageUrl, + 'gender' => $gender, + 'locale' => $locale, 'urls' => [ 'Facebook' => $response->link ], ]); diff --git a/test/src/Provider/FacebookTest.php b/test/src/Provider/FacebookTest.php index 9a0c7d2..8e6814d 100644 --- a/test/src/Provider/FacebookTest.php +++ b/test/src/Provider/FacebookTest.php @@ -6,6 +6,9 @@ use Mockery as m; class FacebookTest extends \PHPUnit_Framework_TestCase { + /** + * @var \League\OAuth2\Client\Provider\Facebook + */ protected $provider; protected function setUp() @@ -42,8 +45,40 @@ class FacebookTest extends \PHPUnit_Framework_TestCase { $url = $this->provider->urlAccessToken(); $uri = parse_url($url); + $graphVersion = \League\OAuth2\Client\Provider\Facebook::DEFAULT_GRAPH_VERSION; - $this->assertEquals('/oauth/access_token', $uri['path']); + $this->assertEquals('/'.$graphVersion.'/oauth/access_token', $uri['path']); + } + + public function testGraphApiVersionCanBeCustomized() + { + $graphVersion = 'v13.37'; + $provider = new \League\OAuth2\Client\Provider\Facebook([ + 'graphApiVersion' => $graphVersion, + ]); + $fooToken = new \League\OAuth2\Client\Token\AccessToken(['access_token' => 'foo_token']); + + $urlAuthorize = $provider->urlAuthorize(); + $urlAccessToken = $provider->urlAccessToken(); + $urlUserDetails = parse_url($provider->urlUserDetails($fooToken), PHP_URL_PATH); + + $this->assertEquals('https://www.facebook.com/'.$graphVersion.'/dialog/oauth', $urlAuthorize); + $this->assertEquals('https://graph.facebook.com/'.$graphVersion.'/oauth/access_token', $urlAccessToken); + $this->assertEquals('/'.$graphVersion.'/me', $urlUserDetails); + } + + public function testGraphApiVersionWillFallbackToDefault() + { + $graphVersion = \League\OAuth2\Client\Provider\Facebook::DEFAULT_GRAPH_VERSION; + $fooToken = new \League\OAuth2\Client\Token\AccessToken(['access_token' => 'foo_token']); + + $urlAuthorize = $this->provider->urlAuthorize(); + $urlAccessToken = $this->provider->urlAccessToken(); + $urlUserDetails = parse_url($this->provider->urlUserDetails($fooToken), PHP_URL_PATH); + + $this->assertEquals('https://www.facebook.com/'.$graphVersion.'/dialog/oauth', $urlAuthorize); + $this->assertEquals('https://graph.facebook.com/'.$graphVersion.'/oauth/access_token', $urlAccessToken); + $this->assertEquals('/'.$graphVersion.'/me', $urlUserDetails); } public function testGetAccessToken() @@ -58,8 +93,6 @@ class FacebookTest extends \PHPUnit_Framework_TestCase $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']); -# print_r($token);die(); - $this->assertEquals('mock_access_token', $token->accessToken); $this->assertLessThanOrEqual(time() + 3600, $token->expires); $this->assertGreaterThanOrEqual(time(), $token->expires); @@ -69,7 +102,7 @@ class FacebookTest extends \PHPUnit_Framework_TestCase public function testScopes() { - $this->assertEquals(['offline_access', 'email', 'read_stream'], $this->provider->getScopes()); + $this->assertEquals(['public_profile', 'email'], $this->provider->getScopes()); } public function testUserData() @@ -82,7 +115,7 @@ class FacebookTest extends \PHPUnit_Framework_TestCase $getResponse->shouldReceive('getInfo')->andReturn(['url' => 'mock_image_url']); $client = m::mock('Guzzle\Service\Client'); - $client->shouldReceive('setBaseUrl')->times(6); + $client->shouldReceive('setBaseUrl')->times(5); $client->shouldReceive('post->send')->times(1)->andReturn($postResponse); $client->shouldReceive('get->send')->andReturn($getResponse); $this->provider->setHttpClient($client); From c491b47fc2cae599ac455af5f68ea73af2f684cc Mon Sep 17 00:00:00 2001 From: SammyK Date: Mon, 26 Jan 2015 10:39:54 -0600 Subject: [PATCH 13/25] Update array syntax and spacing in README --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2b7ac3b..18e07ab 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,12 @@ The following versions of PHP are supported. ### Authorization Code Flow ```php -$provider = new League\OAuth2\Client\Provider\(array( - 'clientId' => 'XXXXXXXX', - 'clientSecret' => 'XXXXXXXX', - 'redirectUri' => 'https://your-registered-redirect-uri/', - 'scopes' => array('email', '...', '...'), -)); +$provider = new League\OAuth2\Client\Provider\([ + 'clientId' => 'XXXXXXXX', + 'clientSecret' => 'XXXXXXXX', + 'redirectUri' => 'https://your-registered-redirect-uri/', + 'scopes' => ['email', '...', '...'], +]); if (!isset($_GET['code'])) { @@ -58,9 +58,9 @@ if (!isset($_GET['code'])) { } else { - // Try to get an access token (using the authorization code grant) + // Try to get an access token (using the authorization code grant) $token = $provider->getAccessToken('authorization_code', [ - 'code' => $_GET['code'] + 'code' => $_GET['code'] ]); // Optional: Now you have a token you can look up a users profile data @@ -70,7 +70,7 @@ if (!isset($_GET['code'])) { $userDetails = $provider->getUserDetails($token); // Use these details to create a new profile - printf('Hello %s!', $userDetails->firstName); + printf('Hello %s!', $userDetails->firstName); } catch (Exception $e) { @@ -92,11 +92,11 @@ if (!isset($_GET['code'])) { ### Refreshing a Token ```php -$provider = new League\OAuth2\Client\Provider\(array( - 'clientId' => 'XXXXXXXX', - 'clientSecret' => 'XXXXXXXX', - 'redirectUri' => 'https://your-registered-redirect-uri/' -)); +$provider = new League\OAuth2\Client\Provider\([ + 'clientId' => 'XXXXXXXX', + 'clientSecret' => 'XXXXXXXX', + 'redirectUri' => 'https://your-registered-redirect-uri/', +]); $grant = new \League\OAuth2\Client\Grant\RefreshToken(); $token = $provider->getAccessToken($grant, ['refresh_token' => $refreshToken]); From c918e21cdbc458742884063672d5f3b401305809 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 29 Jan 2015 09:07:56 -0500 Subject: [PATCH 14/25] Allow approval_prompt to be set through options --- src/Provider/AbstractProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Provider/AbstractProvider.php b/src/Provider/AbstractProvider.php index 6eab5a3..e41a2df 100644 --- a/src/Provider/AbstractProvider.php +++ b/src/Provider/AbstractProvider.php @@ -128,7 +128,7 @@ abstract class AbstractProvider implements ProviderInterface 'state' => $this->state, 'scope' => is_array($this->scopes) ? implode($this->scopeSeparator, $this->scopes) : $this->scopes, 'response_type' => isset($options['response_type']) ? $options['response_type'] : 'code', - 'approval_prompt' => 'auto', + 'approval_prompt' => isset($options['approval_prompt']) ? $options['approval_prompt'] : 'auto', ]; return $this->urlAuthorize().'?'.$this->httpBuildQuery($params, '', '&'); From 823774bf6e7ca8420d0cafb6fe2d926ad4a64731 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 29 Jan 2015 09:08:48 -0500 Subject: [PATCH 15/25] Dropbox provider --- src/Provider/Dropbox.php | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/Provider/Dropbox.php diff --git a/src/Provider/Dropbox.php b/src/Provider/Dropbox.php new file mode 100644 index 0000000..96d34c3 --- /dev/null +++ b/src/Provider/Dropbox.php @@ -0,0 +1,43 @@ +uid = $response->uid; + $user->name = $response->display_name; + $user->email = $response->email; + + return $user; + } + + public function getAuthorizationUrl($options = array()) + { + return parent::getAuthorizationUrl(array_merge([ + 'approval_prompt' => [] + ], $options)); + } + +} \ No newline at end of file From 993add9398bb56c95e84ee6583690b93f713ce8a Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 29 Jan 2015 10:05:23 -0500 Subject: [PATCH 16/25] Some tests --- test/src/Provider/DropboxTest.php | 50 +++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 test/src/Provider/DropboxTest.php diff --git a/test/src/Provider/DropboxTest.php b/test/src/Provider/DropboxTest.php new file mode 100644 index 0000000..596db73 --- /dev/null +++ b/test/src/Provider/DropboxTest.php @@ -0,0 +1,50 @@ +provider = new \League\OAuth2\Client\Provider\Dropbox([ + 'clientId' => 'mock_client_id', + 'clientSecret' => 'mock_secret', + 'redirectUri' => 'none', + ]); + } + + public function tearDown() + { + m::close(); + parent::tearDown(); + } + + public function testAuthorizationUrl() + { + $url = $this->provider->getAuthorizationUrl([ + 'approval_prompt' => [] + ]); + $uri = parse_url($url); + parse_str($uri['query'], $query); + + $this->assertArrayHasKey('client_id', $query); + $this->assertArrayHasKey('redirect_uri', $query); + $this->assertArrayHasKey('state', $query); + $this->assertArrayHasKey('scope', $query); + $this->assertArrayHasKey('response_type', $query); + $this->assertArrayNotHasKey('approval_prompt', $query); + $this->assertNotNull($this->provider->state); + } + + public function testUrlAccessToken() + { + $url = $this->provider->urlAccessToken(); + $uri = parse_url($url); + + $this->assertEquals('/1/oauth2/token', $uri['path']); + } +} From b1e2858ff953806e1f84ff9c68ca8033b4234e4b Mon Sep 17 00:00:00 2001 From: Troy Pavlek Date: Mon, 2 Feb 2015 13:45:18 -0700 Subject: [PATCH 17/25] Changes to additional providers Added Twitch to the additional providers, and alphabetized the list for more grokkability. --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9380543..36e7f83 100644 --- a/README.md +++ b/README.md @@ -127,14 +127,15 @@ These providers allow integration with other providers not supported by `oauth2- so please help them out with a pull request if you notice this. - [Battle.net](https://packagist.org/packages/depotwarehouse/oauth2-bnet) +- [FreeAgent](https://github.com/CloudManaged/oauth2-freeagent) +- [Google Nest](https://github.com/JC5/nest-oauth2-provider) - [Mail.ru](https://packagist.org/packages/aego/oauth2-mailru) - [Meetup](https://github.com/howlowck/meetup-oauth2-provider) -- [Odnoklassniki](https://packagist.org/packages/aego/oauth2-odnoklassniki) -- [Yandex](https://packagist.org/packages/aego/oauth2-yandex) -- [Vkontakte](https://packagist.org/packages/j4k/oauth2-vkontakte) - [Naver](https://packagist.org/packages/deminoth/oauth2-naver) -- [Google Nest](https://github.com/JC5/nest-oauth2-provider) -- [FreeAgent](https://github.com/CloudManaged/oauth2-freeagent) +- [Odnoklassniki](https://packagist.org/packages/aego/oauth2-odnoklassniki) +- [Twitch.tv](https://github.com/tpavlek/oauth2-twitch) +- [Vkontakte](https://packagist.org/packages/j4k/oauth2-vkontakte) +- [Yandex](https://packagist.org/packages/aego/oauth2-yandex) ### Implementing your own provider From c88b91dcda48eb8359c5d350e563d7389cc58f9d Mon Sep 17 00:00:00 2001 From: Daniel Olfelt Date: Thu, 5 Feb 2015 15:52:06 -0600 Subject: [PATCH 18/25] Get reliable body response on error. --- src/Provider/AbstractProvider.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Provider/AbstractProvider.php b/src/Provider/AbstractProvider.php index 6eab5a3..58e3466 100644 --- a/src/Provider/AbstractProvider.php +++ b/src/Provider/AbstractProvider.php @@ -196,8 +196,7 @@ abstract class AbstractProvider implements ProviderInterface } } catch (BadResponseException $e) { // @codeCoverageIgnoreStart - $raw_response = explode("\n", $e->getResponse()); - $response = end($raw_response); + $response = $e->getResponse()->getBody(); // @codeCoverageIgnoreEnd } From 09259e97281ed685696a8fa37f0b69800cba5484 Mon Sep 17 00:00:00 2001 From: Ben Ramsey Date: Tue, 10 Feb 2015 11:44:45 -0600 Subject: [PATCH 19/25] Bump dev-master branch alias to 0.8.x-dev --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 195a1ed..c7bf059 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,7 @@ }, "extra": { "branch-alias": { - "dev-master": "0.7.x-dev" + "dev-master": "0.8.x-dev" } } } From 7ec9bf717f2aaa93782ebd99fe69bee1b039c7b2 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 12 Feb 2015 11:49:01 -0500 Subject: [PATCH 20/25] Remove Dropbox Provider This will be moved to its own package --- src/Provider/Dropbox.php | 43 -------------------------- test/src/Provider/DropboxTest.php | 50 ------------------------------- 2 files changed, 93 deletions(-) delete mode 100644 src/Provider/Dropbox.php delete mode 100644 test/src/Provider/DropboxTest.php diff --git a/src/Provider/Dropbox.php b/src/Provider/Dropbox.php deleted file mode 100644 index 96d34c3..0000000 --- a/src/Provider/Dropbox.php +++ /dev/null @@ -1,43 +0,0 @@ -uid = $response->uid; - $user->name = $response->display_name; - $user->email = $response->email; - - return $user; - } - - public function getAuthorizationUrl($options = array()) - { - return parent::getAuthorizationUrl(array_merge([ - 'approval_prompt' => [] - ], $options)); - } - -} \ No newline at end of file diff --git a/test/src/Provider/DropboxTest.php b/test/src/Provider/DropboxTest.php deleted file mode 100644 index 596db73..0000000 --- a/test/src/Provider/DropboxTest.php +++ /dev/null @@ -1,50 +0,0 @@ -provider = new \League\OAuth2\Client\Provider\Dropbox([ - 'clientId' => 'mock_client_id', - 'clientSecret' => 'mock_secret', - 'redirectUri' => 'none', - ]); - } - - public function tearDown() - { - m::close(); - parent::tearDown(); - } - - public function testAuthorizationUrl() - { - $url = $this->provider->getAuthorizationUrl([ - 'approval_prompt' => [] - ]); - $uri = parse_url($url); - parse_str($uri['query'], $query); - - $this->assertArrayHasKey('client_id', $query); - $this->assertArrayHasKey('redirect_uri', $query); - $this->assertArrayHasKey('state', $query); - $this->assertArrayHasKey('scope', $query); - $this->assertArrayHasKey('response_type', $query); - $this->assertArrayNotHasKey('approval_prompt', $query); - $this->assertNotNull($this->provider->state); - } - - public function testUrlAccessToken() - { - $url = $this->provider->urlAccessToken(); - $uri = parse_url($url); - - $this->assertEquals('/1/oauth2/token', $uri['path']); - } -} From 3f8614ce864c9af5521f5b3cea0d9f9ad0478234 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 12 Feb 2015 13:22:39 -0500 Subject: [PATCH 21/25] Add link to Dropbox provider --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 36e7f83..c882e78 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ These providers allow integration with other providers not supported by `oauth2- so please help them out with a pull request if you notice this. - [Battle.net](https://packagist.org/packages/depotwarehouse/oauth2-bnet) +- [Dropbox](https://github.com/pixelfear/oauth2-dropbox) - [FreeAgent](https://github.com/CloudManaged/oauth2-freeagent) - [Google Nest](https://github.com/JC5/nest-oauth2-provider) - [Mail.ru](https://packagist.org/packages/aego/oauth2-mailru) From 7446829c3b86a8a162f3c06718718c608b78a730 Mon Sep 17 00:00:00 2001 From: Woody Gilk Date: Mon, 23 Feb 2015 12:14:17 -0600 Subject: [PATCH 22/25] replace custom code in AccessToken with Vkontakte::$uidKey --- src/Provider/Vkontakte.php | 3 +-- src/Token/AccessToken.php | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Provider/Vkontakte.php b/src/Provider/Vkontakte.php index 7c46ca8..da44ae2 100644 --- a/src/Provider/Vkontakte.php +++ b/src/Provider/Vkontakte.php @@ -7,8 +7,7 @@ use League\OAuth2\Client\Token\AccessToken; class Vkontakte extends AbstractProvider { - public $scopes = []; - public $responseType = 'json'; + public $uidKey = 'user_id'; public function urlAuthorize() { diff --git a/src/Token/AccessToken.php b/src/Token/AccessToken.php index 12cdb67..9a39f55 100755 --- a/src/Token/AccessToken.php +++ b/src/Token/AccessToken.php @@ -46,9 +46,6 @@ class AccessToken // Some providers (not many) give the uid here, so lets take it isset($options['uid']) and $this->uid = $options['uid']; - // Vkontakte uses user_id instead of uid - isset($options['user_id']) and $this->uid = $options['user_id']; - // Mailru uses x_mailru_vid instead of uid isset($options['x_mailru_vid']) and $this->uid = $options['x_mailru_vid']; From 6373453f789895c3b8f573aea75e3e739cc217ee Mon Sep 17 00:00:00 2001 From: Woody Gilk Date: Mon, 23 Feb 2015 12:15:25 -0600 Subject: [PATCH 23/25] remove custom provider code from AccessToken --- src/Token/AccessToken.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Token/AccessToken.php b/src/Token/AccessToken.php index 9a39f55..bcfbfb1 100755 --- a/src/Token/AccessToken.php +++ b/src/Token/AccessToken.php @@ -43,14 +43,13 @@ class AccessToken $this->accessToken = $options['access_token']; - // Some providers (not many) give the uid here, so lets take it - isset($options['uid']) and $this->uid = $options['uid']; + if (!empty($options['uid'])) { + $this->uid = $options['uid']; + } - // Mailru uses x_mailru_vid instead of uid - isset($options['x_mailru_vid']) and $this->uid = $options['x_mailru_vid']; - - //Battle.net uses accountId instead of uid - isset($options['accountId']) and $this->uid = $options['accountId']; + if (!empty($options['refresh_token'])) { + $this->refreshToken = $options['refresh_token']; + } // We need to know when the token expires. Show preference to // 'expires_in' since it is defined in RFC6749 Section 5.1. @@ -64,9 +63,6 @@ class AccessToken $expiresInFuture = $expires > time(); $this->expires = $expiresInFuture ? $expires : time() + ((int) $expires); } - - // Grab a refresh token so we can update access tokens when they expires - isset($options['refresh_token']) and $this->refreshToken = $options['refresh_token']; } /** From 4d2e8d5669cf1b5efd3d4b099a45a4ab7974fd15 Mon Sep 17 00:00:00 2001 From: Woody Gilk Date: Mon, 23 Feb 2015 12:23:37 -0600 Subject: [PATCH 24/25] add AbstractProvider::prepareAccessTokenResult for additional token response prep --- src/Provider/AbstractProvider.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Provider/AbstractProvider.php b/src/Provider/AbstractProvider.php index 96799ea..4c12f06 100644 --- a/src/Provider/AbstractProvider.php +++ b/src/Provider/AbstractProvider.php @@ -215,11 +215,24 @@ abstract class AbstractProvider implements ProviderInterface // @codeCoverageIgnoreEnd } - $this->setResultUid($result); + $result = $this->prepareAccessTokenResult($result); return $grant->handleResponse($result); } + /** + * Prepare the access token response for the grant. Custom mapping of + * expirations, etc should be done here. + * + * @param array $result + * @return array + */ + protected function prepareAccessTokenResult(array $result) + { + $this->setResultUid($result); + return $result; + } + /** * Sets any result keys we've received matching our provider-defined uidKey to the key "uid". * From 5caeed7d0c7f25a059755ef0ad0a525a0df56233 Mon Sep 17 00:00:00 2001 From: Woody Gilk Date: Mon, 23 Feb 2015 12:52:35 -0600 Subject: [PATCH 25/25] Add Square to 3rd party provider links --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c882e78..d144f39 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ so please help them out with a pull request if you notice this. - [Meetup](https://github.com/howlowck/meetup-oauth2-provider) - [Naver](https://packagist.org/packages/deminoth/oauth2-naver) - [Odnoklassniki](https://packagist.org/packages/aego/oauth2-odnoklassniki) +- [Square](https://packagist.org/packages/wheniwork/oauth2-square) - [Twitch.tv](https://github.com/tpavlek/oauth2-twitch) - [Vkontakte](https://packagist.org/packages/j4k/oauth2-vkontakte) - [Yandex](https://packagist.org/packages/aego/oauth2-yandex)