coderello / laravel-passport-social-grant
Laravel Passport 社交授权
3.2.0
2024-03-20 13:40 UTC
Requires
- php: ^8.2
- laravel/passport: ^11.3.0 || ^12.0
Requires (Dev)
- laminas/laminas-diactoros: ^2.8
- mockery/mockery: ^1.4.4
- orchestra/testbench: ^8.0 || ^9.0
- phpunit/phpunit: ^9.5 || ^10.0
README
此软件包为您的 OAuth2 服务器添加社交授权。如果您有一个 API 并希望允许用户通过社交网络登录/注册,则这可能很有用。
结果,您将能够将任何社交提供者 OAuth2 服务器的 access_token
交换为您的 OAuth2 服务器的 access_token
和 refresh_token
。您将接收此 access_token
并在自己的应用程序中返回对应的用户实例。
安装
您可以使用以下命令通过 composer 安装此软件包
composer require coderello/laravel-passport-social-grant
该软件包将自动注册自己。
配置
第一步,您需要实现 SocialUserResolverInterface
以下是一个使用 Socialite 的示例 ——
<?php namespace App\Resolvers; use Coderello\SocialGrant\Resolvers\SocialUserResolverInterface; use Illuminate\Contracts\Auth\Authenticatable; use Laravel\Socialite\Facades\Socialite; use Laravel\Socialite\Two\User as ProviderUser; class SocialUserResolver implements SocialUserResolverInterface { /** * Resolve user by provider credentials. */ public function resolveUserByProviderCredentials(string $provider, string $accessToken): ?Authenticatable { // Return the user that corresponds to provided credentials. // If the credentials are invalid, then return NULL. $providerUser = Socialite::driver($provider)->userFromToken($accessToken); return $this->findOrCreateUser($provider, $providerUser);; } protected function findOrCreateUser(string $provider, ProviderUser $providerUser): ?Authenticatable { // todo your logic here // $email = $providerUser->getEmail(); } }
下一步是将 SocialUserResolverInterface
绑定到您的实现。
您可以在 AppServiceProvider
中的 $bindings
属性中添加相应的键值对来完成此操作
<?php namespace App\Providers; use App\Resolvers\SocialUserResolver; use Coderello\SocialGrant\Resolvers\SocialUserResolverInterface; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * All the container bindings that should be registered. */ public $bindings = [ SocialUserResolverInterface::class => SocialUserResolver::class, ]; }
您已完成!
用法
使用 axios
的示例
axios.post('/oauth/token', { grant_type: 'social', // static 'social' value client_id: clientId, // client id client_secret: clientSecret, // client secret provider: providerName, // name of provider (e.g., 'facebook', 'google' etc.) access_token: providerAccessToken, // access token issued by specified provider }) .then((response) => { const { access_token: accessToken, expires_in: expiresIn, refresh_token: refreshToken, } = response.data; // success logic }) .catch((error) => { const { message, hint, } = error.response.data; // error logic });
使用 guzzlehttp/guzzle
的示例
<?php use GuzzleHttp\Client; use Illuminate\Support\Arr; $http = new Client; $response = $http->post($domain . '/oauth/token', [ RequestOptions::FORM_PARAMS => [ 'grant_type' => 'social', // static 'social' value 'client_id' => $clientId, // client id 'client_secret' => $clientSecret, // client secret 'provider' => $providerName, // name of provider (e.g., 'facebook', 'google' etc.) 'access_token' => $providerAccessToken, // access token issued by specified provider ], RequestOptions::HTTP_ERRORS => false, ]); $data = json_decode($response->getBody()->getContents(), true); if ($response->getStatusCode() === Response::HTTP_OK) { $accessToken = Arr::get($data, 'access_token'); $expiresIn = Arr::get($data, 'expires_in'); $refreshToken = Arr::get($data, 'refresh_token'); // success logic } else { $message = Arr::get($data, 'message'); $hint = Arr::get($data, 'hint'); // error logic }
测试
您可以使用以下命令运行测试
composer test
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG
贡献
有关详细信息,请参阅 CONTRIBUTING
致谢
由 Illia Sakovich 创建
由 Ankur Kumar 维护
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件