From e58f915ec3068aaec69083fe4977ef7378f63822 Mon Sep 17 00:00:00 2001 From: dehbka Date: Sun, 23 Jan 2022 11:57:49 +0200 Subject: [PATCH] Add Twitter OAuth2 provider --- src/SocialiteManager.php | 15 ++++++++ src/Two/TwitterProvider.php | 71 +++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/Two/TwitterProvider.php diff --git a/src/SocialiteManager.php b/src/SocialiteManager.php index b497489f..5da5863f 100644 --- a/src/SocialiteManager.php +++ b/src/SocialiteManager.php @@ -13,6 +13,7 @@ use Laravel\Socialite\Two\GitlabProvider; use Laravel\Socialite\Two\GoogleProvider; use Laravel\Socialite\Two\LinkedInProvider; +use Laravel\Socialite\Two\TwitterProvider as TwitterOAuth2Provider; use League\OAuth1\Client\Server\Twitter as TwitterServer; class SocialiteManager extends Manager implements Contracts\Factory @@ -112,6 +113,20 @@ protected function createGitlabDriver() )->setHost($config['host'] ?? null); } + /** + * Create an instance of the specified driver. + * + * @return \Laravel\Socialite\Two\AbstractProvider + */ + protected function createTwitterOAuth2Driver() + { + $config = $this->config->get('services.twitter'); + + return $this->buildProvider( + TwitterOAuth2Provider::class, $config + ); + } + /** * Build an OAuth 2 provider instance. * diff --git a/src/Two/TwitterProvider.php b/src/Two/TwitterProvider.php new file mode 100644 index 00000000..abc212df --- /dev/null +++ b/src/Two/TwitterProvider.php @@ -0,0 +1,71 @@ +buildAuthUrlFromBase('https://twitter.com/i/oauth2/authorize', $state); + } + + /** + * {@inheritdoc} + */ + protected function getTokenUrl() + { + return 'https://api.twitter.com/2/oauth2/token'; + } + + /** + * {@inheritdoc} + */ + protected function getUserByToken($token) + { + $response = $this->getHttpClient()->get('https://api.twitter.com/2/users/me', [ + 'headers' => ['Authorization' => 'Bearer '.$token], + 'query' => ['user.fields' => 'profile_image_url'], + ]); + + return Arr::get(json_decode($response->getBody(), true), 'data'); + } + + /** + * {@inheritdoc} + */ + protected function mapUserToObject(array $user) + { + return (new User)->setRaw($user)->map([ + 'id' => $user['id'], + 'nickname' => $user['username'], + 'name' => $user['name'], + 'avatar' => $user['profile_image_url'], + ]); + } +}