From 7e868e80590bfc057c9636e6535c88c2dbef53d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ignacio=20Jos=C3=A9=20Can=C3=B3=20Cabral?= Date: Sat, 17 Feb 2024 16:49:21 -0500 Subject: [PATCH] feat: implement Clerk provider --- monorepo-builder.yml | 1 + src/Clerk/ClerkExtendSocialite.php | 18 ++++++ src/Clerk/Provider.php | 93 ++++++++++++++++++++++++++++++ src/Clerk/README.md | 63 ++++++++++++++++++++ src/Clerk/composer.json | 21 +++++++ 5 files changed, 196 insertions(+) create mode 100644 src/Clerk/ClerkExtendSocialite.php create mode 100644 src/Clerk/Provider.php create mode 100644 src/Clerk/README.md create mode 100644 src/Clerk/composer.json diff --git a/monorepo-builder.yml b/monorepo-builder.yml index 27a95dd47..f15e3b27f 100644 --- a/monorepo-builder.yml +++ b/monorepo-builder.yml @@ -29,6 +29,7 @@ parameters: src/CampaignMonitor: 'git@github.com:SocialiteProviders/CampaignMonitor.git' src/Cheddar: 'git@github.com:SocialiteProviders/Cheddar.git' src/ClaveUnica: 'git@github.com:SocialiteProviders/ClaveUnica.git' + src/Clerk: 'git@github.com:SocialiteProviders/Clerk.git' src/Cognito: 'git@github.com:SocialiteProviders/Cognito.git' src/Coinbase: 'git@github.com:SocialiteProviders/Coinbase.git' src/ConstantContact: 'git@github.com:SocialiteProviders/ConstantContact.git' diff --git a/src/Clerk/ClerkExtendSocialite.php b/src/Clerk/ClerkExtendSocialite.php new file mode 100644 index 000000000..079fb9a42 --- /dev/null +++ b/src/Clerk/ClerkExtendSocialite.php @@ -0,0 +1,18 @@ +extendSocialite('clerk', Provider::class); + } +} diff --git a/src/Clerk/Provider.php b/src/Clerk/Provider.php new file mode 100644 index 000000000..202b48538 --- /dev/null +++ b/src/Clerk/Provider.php @@ -0,0 +1,93 @@ +getConfig('base_url'); + } + + /** + * {@inheritdoc} + */ + public static function additionalConfigKeys() + { + return ['base_url']; + } + + /** + * {@inheritdoc} + */ + protected function getAuthUrl($state) + { + return $this->buildAuthUrlFromBase("{$this->getBaseUrl()}/oauth/authorize", $state); + } + + /** + * {@inheritdoc} + */ + protected function getTokenUrl() + { + return "{$this->getBaseUrl()}/oauth/token"; + } + + /** + * {@inheritdoc} + */ + protected function getUserByToken($token) + { + $response = $this->getHttpClient()->get("{$this->getBaseUrl()}/oauth/userinfo", [ + 'headers' => [ + 'Authorization' => 'Bearer '.$token, + ], + ]); + return json_decode($response->getBody(), true); + } + + /** + * {@inheritdoc} + */ + protected function mapUserToObject(array $user) + { + return (new User())->setRaw($user)->map([ + 'id' => $user['user_id'], + 'nickname' => $user['username'], + 'name' => $user['name'], + 'email' => $user['email'], + 'avatar' => $user['picture'], + ]); + } + + /** + * {@inheritdoc} + */ + protected function getTokenFields($code) + { + return array_merge(parent::getTokenFields($code), [ + 'grant_type' => 'authorization_code' + ]); + } +} diff --git a/src/Clerk/README.md b/src/Clerk/README.md new file mode 100644 index 000000000..80291d5e8 --- /dev/null +++ b/src/Clerk/README.md @@ -0,0 +1,63 @@ +# Clerk + +This is a provider for [Clerk](https://clerk.com/) + +```bash +composer require socialiteproviders/clerk +``` + +## Installation & Basic Usage + +Please see the [Base Installation Guide](https://socialiteproviders.com/usage/), then follow the provider specific instructions below. + +### Add configuration to `config/services.php` + +```php +'clerk' => [ + 'client_id' => env('CLERK_CLIENT_ID'), + 'client_secret' => env('CLERK_CLIENT_SECRET'), + 'redirect' => env('CLERK_CALLBACK_URL'), + 'base_url' => env('CLERK_BASE_URL'), +], +``` + +### Add base URL to `.env` + +Clerk provides a customer URL for your different projects for this reason you need to provide a base_url + +```bash +CLERK_BASE_URL=https://example.clerk.accounts.dev +``` + +### Add provider event listener + +Configure the package's listener to listen for `SocialiteWasCalled` events. + +Add the event to your `listen[]` array in `app/Providers/EventServiceProvider`. See the [Base Installation Guide](https://socialiteproviders.com/usage/) for detailed instructions. + +```php +protected $listen = [ + \SocialiteProviders\Manager\SocialiteWasCalled::class => [ + // ... other providers + \SocialiteProviders\Clerk\ClerkExtendSocialite::class.'@handle', + ], +]; +``` + +### Usage + +You should now be able to use the provider like you would regularly use Socialite (assuming you have the facade installed): + +```php +return Socialite::driver('clerk')->redirect(); +``` + +@TODO + +### Returned User fields + +- `id` +- `nickname` +- `name` +- `email` +- `avatar` diff --git a/src/Clerk/composer.json b/src/Clerk/composer.json new file mode 100644 index 000000000..b295df899 --- /dev/null +++ b/src/Clerk/composer.json @@ -0,0 +1,21 @@ +{ + "name": "socialiteproviders/clerk", + "description": "Clerk OAuth2 Provider for Laravel Socialite", + "license": "MIT", + "authors": [ + { + "name": "Ignacio Cano", + "email": "dev@nacho.sh" + } + ], + "require": { + "php": "^8.0", + "ext-json": "*", + "socialiteproviders/manager": "^4.0" + }, + "autoload": { + "psr-4": { + "SocialiteProviders\\Clerk\\": "" + } + } +}