diff --git a/.travis.yml b/.travis.yml index 326a36f4..aa77902f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,9 +5,13 @@ php: - 7.0 - 7.1 - 7.2 + - 7.3 sudo: false +before_install: + - phpenv config-rm xdebug.ini || true + install: travis_retry composer install --no-interaction --prefer-dist --no-suggest script: vendor/bin/phpunit --verbose diff --git a/README.md b/README.md index f56e3574..6af62318 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,6 @@ Laravel Socialite provides an expressive, fluent interface to OAuth authenticati **We are not accepting new adapters.** -**If you are using Laravel 5.3 or below, please use [Socialite 2.0](https://github.com/laravel/socialite/tree/2.0).** - Adapters for other platforms are listed at the community driven [Socialite Providers](https://socialiteproviders.github.io/) website. ## Official Documentation diff --git a/composer.json b/composer.json index 14c94eb9..4d31c2f4 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ }, "autoload-dev": { "psr-4": { - "Tests\\": "tests/" + "Laravel\\Socialite\\Tests\\": "tests/" } }, "extra": { diff --git a/src/One/AbstractProvider.php b/src/One/AbstractProvider.php index 1a1b2c03..f85ba126 100644 --- a/src/One/AbstractProvider.php +++ b/src/One/AbstractProvider.php @@ -81,8 +81,11 @@ public function user() ->setToken($token->getIdentifier(), $token->getSecret()); return $instance->map([ - 'id' => $user->uid, 'nickname' => $user->nickname, - 'name' => $user->name, 'email' => $user->email, 'avatar' => $user->imageUrl, + 'id' => $user->uid, + 'nickname' => $user->nickname, + 'name' => $user->name, + 'email' => $user->email, + 'avatar' => $user->imageUrl, ]); } @@ -108,8 +111,11 @@ public function userFromTokenAndSecret($token, $secret) ->setToken($tokenCredentials->getIdentifier(), $tokenCredentials->getSecret()); return $instance->map([ - 'id' => $user->uid, 'nickname' => $user->nickname, - 'name' => $user->name, 'email' => $user->email, 'avatar' => $user->imageUrl, + 'id' => $user->uid, + 'nickname' => $user->nickname, + 'name' => $user->name, + 'email' => $user->email, + 'avatar' => $user->imageUrl, ]); } diff --git a/src/One/TwitterProvider.php b/src/One/TwitterProvider.php index c7440286..64bf4cb0 100644 --- a/src/One/TwitterProvider.php +++ b/src/One/TwitterProvider.php @@ -26,8 +26,11 @@ public function user() ->setToken($token->getIdentifier(), $token->getSecret()); return $instance->map([ - 'id' => $user->uid, 'nickname' => $user->nickname, - 'name' => $user->name, 'email' => $user->email, 'avatar' => $user->imageUrl, + 'id' => $user->uid, + 'nickname' => $user->nickname, + 'name' => $user->name, + 'email' => $user->email, + 'avatar' => $user->imageUrl, 'avatar_original' => str_replace('_normal', '', $user->imageUrl), ]); } diff --git a/src/SocialiteManager.php b/src/SocialiteManager.php index 53d9e303..826a6bb3 100644 --- a/src/SocialiteManager.php +++ b/src/SocialiteManager.php @@ -7,6 +7,7 @@ use InvalidArgumentException; use Illuminate\Support\Manager; use Laravel\Socialite\Two\GithubProvider; +use Laravel\Socialite\Two\GitlabProvider; use Laravel\Socialite\Two\GoogleProvider; use Laravel\Socialite\One\TwitterProvider; use Laravel\Socialite\Two\FacebookProvider; @@ -107,7 +108,7 @@ protected function createGitlabDriver() $config = $this->app['config']['services.gitlab']; return $this->buildProvider( - \Laravel\Socialite\Two\GitlabProvider::class, $config + GitlabProvider::class, $config ); } diff --git a/src/Two/AbstractProvider.php b/src/Two/AbstractProvider.php index 4b337a93..9dab53a0 100644 --- a/src/Two/AbstractProvider.php +++ b/src/Two/AbstractProvider.php @@ -176,7 +176,8 @@ protected function buildAuthUrlFromBase($url, $state) protected function getCodeFields($state = null) { $fields = [ - 'client_id' => $this->clientId, 'redirect_uri' => $this->redirectUrl, + 'client_id' => $this->clientId, + 'redirect_uri' => $this->redirectUrl, 'scope' => $this->formatScopes($this->getScopes(), $this->scopeSeparator), 'response_type' => 'code', ]; @@ -276,8 +277,10 @@ public function getAccessTokenResponse($code) protected function getTokenFields($code) { return [ - 'client_id' => $this->clientId, 'client_secret' => $this->clientSecret, - 'code' => $code, 'redirect_uri' => $this->redirectUrl, + 'client_id' => $this->clientId, + 'client_secret' => $this->clientSecret, + 'code' => $code, + 'redirect_uri' => $this->redirectUrl, ]; } diff --git a/src/Two/BitbucketProvider.php b/src/Two/BitbucketProvider.php index 96a816c5..6805cafe 100644 --- a/src/Two/BitbucketProvider.php +++ b/src/Two/BitbucketProvider.php @@ -87,8 +87,10 @@ protected function getEmailByToken($token) protected function mapUserToObject(array $user) { return (new User)->setRaw($user)->map([ - 'id' => $user['uuid'], 'nickname' => $user['username'], - 'name' => Arr::get($user, 'display_name'), 'email' => Arr::get($user, 'email'), + 'id' => $user['uuid'], + 'nickname' => $user['username'], + 'name' => Arr::get($user, 'display_name'), + 'email' => Arr::get($user, 'email'), 'avatar' => Arr::get($user, 'links.avatar.href'), ]); } diff --git a/src/Two/FacebookProvider.php b/src/Two/FacebookProvider.php index fcee468f..420dfb22 100644 --- a/src/Two/FacebookProvider.php +++ b/src/Two/FacebookProvider.php @@ -111,8 +111,11 @@ protected function mapUserToObject(array $user) $avatarUrl = $this->graphUrl.'/'.$this->version.'/'.$user['id'].'/picture'; return (new User)->setRaw($user)->map([ - 'id' => $user['id'], 'nickname' => null, 'name' => isset($user['name']) ? $user['name'] : null, - 'email' => isset($user['email']) ? $user['email'] : null, 'avatar' => $avatarUrl.'?type=normal', + 'id' => $user['id'], + 'nickname' => null, + 'name' => isset($user['name']) ? $user['name'] : null, + 'email' => isset($user['email']) ? $user['email'] : null, + 'avatar' => $avatarUrl.'?type=normal', 'avatar_original' => $avatarUrl.'?width=1920', 'profileUrl' => isset($user['link']) ? $user['link'] : null, ]); diff --git a/src/Two/GithubProvider.php b/src/Two/GithubProvider.php index 554054ab..650ac2d9 100644 --- a/src/Two/GithubProvider.php +++ b/src/Two/GithubProvider.php @@ -81,8 +81,11 @@ protected function getEmailByToken($token) protected function mapUserToObject(array $user) { return (new User)->setRaw($user)->map([ - 'id' => $user['id'], 'nickname' => $user['login'], 'name' => Arr::get($user, 'name'), - 'email' => Arr::get($user, 'email'), 'avatar' => $user['avatar_url'], + 'id' => $user['id'], + 'nickname' => $user['login'], + 'name' => Arr::get($user, 'name'), + 'email' => Arr::get($user, 'email'), + 'avatar' => $user['avatar_url'], ]); } diff --git a/src/Two/GoogleProvider.php b/src/Two/GoogleProvider.php index 53ce1b91..d8a6c7f7 100644 --- a/src/Two/GoogleProvider.php +++ b/src/Two/GoogleProvider.php @@ -48,7 +48,7 @@ protected function getTokenUrl() */ protected function getTokenFields($code) { - return array_add( + return Arr::add( parent::getTokenFields($code), 'grant_type', 'authorization_code' ); } diff --git a/src/Two/LinkedInProvider.php b/src/Two/LinkedInProvider.php index 526cc050..f8ac6cd4 100644 --- a/src/Two/LinkedInProvider.php +++ b/src/Two/LinkedInProvider.php @@ -83,8 +83,11 @@ protected function getUserByToken($token) protected function mapUserToObject(array $user) { return (new User)->setRaw($user)->map([ - 'id' => $user['id'], 'nickname' => null, 'name' => Arr::get($user, 'formattedName'), - 'email' => Arr::get($user, 'emailAddress'), 'avatar' => Arr::get($user, 'pictureUrl'), + 'id' => $user['id'], + 'nickname' => null, + 'name' => Arr::get($user, 'formattedName'), + 'email' => Arr::get($user, 'emailAddress'), + 'avatar' => Arr::get($user, 'pictureUrl'), 'avatar_original' => Arr::get($user, 'pictureUrls.values.0'), ]); } diff --git a/tests/Fixtures/FacebookTestProviderStub.php b/tests/Fixtures/FacebookTestProviderStub.php index 91f1a1bb..0cf4e388 100644 --- a/tests/Fixtures/FacebookTestProviderStub.php +++ b/tests/Fixtures/FacebookTestProviderStub.php @@ -1,7 +1,8 @@ http; } - return $this->http = m::mock(\stdClass::class); + return $this->http = m::mock(stdClass::class); } } diff --git a/tests/Fixtures/OAuthOneTestProviderStub.php b/tests/Fixtures/OAuthOneTestProviderStub.php index 91fdaa51..46625b66 100644 --- a/tests/Fixtures/OAuthOneTestProviderStub.php +++ b/tests/Fixtures/OAuthOneTestProviderStub.php @@ -1,6 +1,6 @@ http; } - return $this->http = m::mock(\stdClass::class); + return $this->http = m::mock(stdClass::class); } } diff --git a/tests/OAuthOneTest.php b/tests/OAuthOneTest.php index a1774841..d97dfcb9 100644 --- a/tests/OAuthOneTest.php +++ b/tests/OAuthOneTest.php @@ -1,56 +1,66 @@ shouldReceive('getTemporaryCredentials')->once()->andReturn('temp'); $server->shouldReceive('getAuthorizationUrl')->once()->with('temp')->andReturn('http://auth.url'); $request = Request::create('foo'); - $request->setLaravelSession($session = m::mock(\Illuminate\Contracts\Session\Session::class)); + $request->setLaravelSession($session = m::mock(Session::class)); $session->shouldReceive('put')->once()->with('oauth.temp', 'temp'); $provider = new OAuthOneTestProviderStub($request, $server); $response = $provider->redirect(); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $response); - $this->assertInstanceOf('Illuminate\Http\RedirectResponse', $response); + $this->assertInstanceOf(SymfonyRedirectResponse::class, $response); + $this->assertInstanceOf(RedirectResponse::class, $response); } public function testUserReturnsAUserInstanceForTheAuthenticatedRequest() { - $server = m::mock(\League\OAuth1\Client\Server\Twitter::class); - $temp = m::mock(\League\OAuth1\Client\Credentials\TemporaryCredentials::class); + $server = m::mock(Twitter::class); + $temp = m::mock(TemporaryCredentials::class); $server->shouldReceive('getTokenCredentials')->once()->with($temp, 'oauth_token', 'oauth_verifier')->andReturn( - $token = m::mock(\League\OAuth1\Client\Credentials\TokenCredentials::class) + $token = m::mock(TokenCredentials::class) ); - $server->shouldReceive('getUserDetails')->once()->with($token, false)->andReturn($user = m::mock(\League\OAuth1\Client\Server\User::class)); + $server->shouldReceive('getUserDetails')->once()->with($token, false)->andReturn($user = m::mock(User::class)); $token->shouldReceive('getIdentifier')->twice()->andReturn('identifier'); $token->shouldReceive('getSecret')->twice()->andReturn('secret'); $user->uid = 'uid'; $user->email = 'foo@bar.com'; $user->extra = ['extra' => 'extra']; $request = Request::create('foo', 'GET', ['oauth_token' => 'oauth_token', 'oauth_verifier' => 'oauth_verifier']); - $request->setLaravelSession($session = m::mock(\Illuminate\Contracts\Session\Session::class)); + $request->setLaravelSession($session = m::mock(Session::class)); $session->shouldReceive('get')->once()->with('oauth.temp')->andReturn($temp); $provider = new OAuthOneTestProviderStub($request, $server); $user = $provider->user(); - $this->assertInstanceOf('Laravel\Socialite\One\User', $user); + $this->assertInstanceOf(SocialiteUser::class, $user); $this->assertSame('uid', $user->id); $this->assertSame('foo@bar.com', $user->email); $this->assertSame(['extra' => 'extra'], $user->user); @@ -61,9 +71,9 @@ public function testUserReturnsAUserInstanceForTheAuthenticatedRequest() */ public function testExceptionIsThrownWhenVerifierIsMissing() { - $server = m::mock(\League\OAuth1\Client\Server\Twitter::class); + $server = m::mock(Twitter::class); $request = Request::create('foo'); - $request->setLaravelSession($session = m::mock(\Illuminate\Contracts\Session\Session::class)); + $request->setLaravelSession($session = m::mock(Session::class)); $provider = new OAuthOneTestProviderStub($request, $server); $provider->user(); diff --git a/tests/OAuthTwoTest.php b/tests/OAuthTwoTest.php index 43fd1185..946bb047 100644 --- a/tests/OAuthTwoTest.php +++ b/tests/OAuthTwoTest.php @@ -1,49 +1,57 @@ setLaravelSession($session = m::mock(\Illuminate\Contracts\Session\Session::class)); + $request->setLaravelSession($session = m::mock(Session::class)); $session->shouldReceive('put')->once(); $provider = new OAuthTwoTestProviderStub($request, 'client_id', 'client_secret', 'redirect'); $response = $provider->redirect(); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $response); - $this->assertInstanceOf('Illuminate\Http\RedirectResponse', $response); + $this->assertInstanceOf(SymfonyRedirectResponse::class, $response); + $this->assertInstanceOf(RedirectResponse::class, $response); $this->assertSame('http://auth.url', $response->getTargetUrl()); } public function testUserReturnsAUserInstanceForTheAuthenticatedRequest() { $request = Request::create('foo', 'GET', ['state' => str_repeat('A', 40), 'code' => 'code']); - $request->setLaravelSession($session = m::mock(\Illuminate\Contracts\Session\Session::class)); + $request->setLaravelSession($session = m::mock(Session::class)); $session->shouldReceive('pull')->once()->with('state')->andReturn(str_repeat('A', 40)); $provider = new OAuthTwoTestProviderStub($request, 'client_id', 'client_secret', 'redirect_uri'); - $provider->http = m::mock(\stdClass::class); + $provider->http = m::mock(stdClass::class); $postKey = (version_compare(ClientInterface::VERSION, '6') === 1) ? 'form_params' : 'body'; $provider->http->shouldReceive('post')->once()->with('http://token.url', [ 'headers' => ['Accept' => 'application/json'], $postKey => ['client_id' => 'client_id', 'client_secret' => 'client_secret', 'code' => 'code', 'redirect_uri' => 'redirect_uri'], - ])->andReturn($response = m::mock(\stdClass::class)); + ])->andReturn($response = m::mock(stdClass::class)); $response->shouldReceive('getBody')->once()->andReturn('{ "access_token" : "access_token", "refresh_token" : "refresh_token", "expires_in" : 3600 }'); $user = $provider->user(); - $this->assertInstanceOf('Laravel\Socialite\Two\User', $user); + $this->assertInstanceOf(User::class, $user); $this->assertSame('foo', $user->id); $this->assertSame('access_token', $user->token); $this->assertSame('refresh_token', $user->refreshToken); @@ -53,18 +61,18 @@ public function testUserReturnsAUserInstanceForTheAuthenticatedRequest() public function testUserReturnsAUserInstanceForTheAuthenticatedFacebookRequest() { $request = Request::create('foo', 'GET', ['state' => str_repeat('A', 40), 'code' => 'code']); - $request->setSession($session = m::mock(\Symfony\Component\HttpFoundation\Session\SessionInterface::class)); + $request->setSession($session = m::mock(SessionInterface::class)); $session->shouldReceive('pull')->once()->with('state')->andReturn(str_repeat('A', 40)); $provider = new FacebookTestProviderStub($request, 'client_id', 'client_secret', 'redirect_uri'); - $provider->http = m::mock(\stdClass::class); + $provider->http = m::mock(stdClass::class); $postKey = (version_compare(ClientInterface::VERSION, '6') === 1) ? 'form_params' : 'body'; $provider->http->shouldReceive('post')->once()->with('https://graph.facebook.com/v3.0/oauth/access_token', [ $postKey => ['client_id' => 'client_id', 'client_secret' => 'client_secret', 'code' => 'code', 'redirect_uri' => 'redirect_uri'], - ])->andReturn($response = m::mock(\stdClass::class)); + ])->andReturn($response = m::mock(stdClass::class)); $response->shouldReceive('getBody')->once()->andReturn(json_encode(['access_token' => 'access_token', 'expires' => 5183085])); $user = $provider->user(); - $this->assertInstanceOf('Laravel\Socialite\Two\User', $user); + $this->assertInstanceOf(User::class, $user); $this->assertSame('foo', $user->id); $this->assertSame('access_token', $user->token); $this->assertNull($user->refreshToken); @@ -77,7 +85,7 @@ public function testUserReturnsAUserInstanceForTheAuthenticatedFacebookRequest() public function testExceptionIsThrownIfStateIsInvalid() { $request = Request::create('foo', 'GET', ['state' => str_repeat('B', 40), 'code' => 'code']); - $request->setLaravelSession($session = m::mock(\Illuminate\Contracts\Session\Session::class)); + $request->setLaravelSession($session = m::mock(Session::class)); $session->shouldReceive('pull')->once()->with('state')->andReturn(str_repeat('A', 40)); $provider = new OAuthTwoTestProviderStub($request, 'client_id', 'client_secret', 'redirect'); $provider->user(); @@ -89,7 +97,7 @@ public function testExceptionIsThrownIfStateIsInvalid() public function testExceptionIsThrownIfStateIsNotSet() { $request = Request::create('foo', 'GET', ['state' => 'state', 'code' => 'code']); - $request->setLaravelSession($session = m::mock(\Illuminate\Contracts\Session\Session::class)); + $request->setLaravelSession($session = m::mock(Session::class)); $session->shouldReceive('pull')->once()->with('state'); $provider = new OAuthTwoTestProviderStub($request, 'client_id', 'client_secret', 'redirect'); $provider->user();