codewiser / socialiteprovider
Zenit OAuth2 Provider for Laravel Socialite
v1.0.17
2024-08-27 10:32 UTC
Requires
- php: ^7.4 || ^8.0
- ext-json: *
- laravel/framework: >=10.0
- laravel/sanctum: >=3.0
- league/oauth2-client: ^2.7
- socialiteproviders/manager: ~4.0
README
composer require codewiser/socialiteprovider
安装与基本使用
请参阅基础安装指南,然后按照以下特定提供者说明操作。
在 config/services.php
中添加配置
'zenit' => [ 'base_uri' => env('ZENIT_SERVER'), 'client_id' => env('ZENIT_CLIENT_ID'), 'client_secret' => env('ZENIT_CLIENT_SECRET'), 'redirect' => env('ZENIT_REDIRECT_URI') ],
添加提供者事件监听器
配置包的监听器以监听 SocialiteWasCalled
事件。
将事件添加到 app/Providers/EventServiceProvider
中的 listen[]
数组中。有关详细说明,请参阅基础安装指南。
protected $listen = [ \SocialiteProviders\Manager\SocialiteWasCalled::class => [ // ... other providers \SocialiteProviders\Zenit\ZenitExtendSocialite::class, ], ];
使用方法
现在您应该可以使用此提供者,就像您通常使用 Socialite 一样(假设您已安装了外观)
return Socialite::driver('zenit')->redirect();
返回的用户字段
id
昵称
名字
电子邮件
头像
访问令牌
访问令牌现在是一个对象,而不仅仅是字符串。
$user = Socialite::driver('zenit')->user(); $token = $user->token; // \League\OAuth2\Client\Token\AccessToken
错误响应
此包提供符合 rfc6749 的响应错误处理。
try { $user = Socialite::driver('zenit')->user(); } catch (OAuth2Exception $e) { return match ($e->getError()) { // Show response to the user 'access_denied', 'server_error', 'temporarily_unavailable' => redirect() ->to(route('login')) ->with('error', $e->getMessage()), // Silently 'interaction_required' => redirect()->to('/'), // Unrecoverable default => throw $e, }; }
令牌检查
此包提供符合 rfc7662 的令牌检查。
use \Illuminate\Http\Request; use \SocialiteProviders\Zenit\rfc7662\IntrospectedTokenInterface; public function api(Request $request) { /** @var IntrospectedTokenInterface $token */ $token = Socialite::driver('zenit') ->introspectToken($request->bearerToken()); if ($token->isActive()) { // } }
使用现有令牌获取用户
$user = Socialite::driver('zenit') ->userFromToken($request->bearerToken());
刷新令牌
$token = Socialite::driver('zenit') ->refreshToken($refresh_token);
客户端令牌
$token = Socialite::driver('zenit') ->grantClientCredentials('scope-1 scope-2');
通过用户名和密码获取令牌
$token = Socialite::driver('zenit') ->grantPassword($username, $password, 'scope-1 scope-2');
通过自定义授权获取令牌
$token = Socialite::driver('zenit') ->grant('custom_grant', [/* any request params */]);
令牌授权
注册认证驱动程序,该驱动程序使用由某些 OAuth 2.0 服务器签发的 bearer 令牌授权传入请求。
社交提供程序应实现 TokenIntrospectionInterface
。
use SocialiteProviders\Zenit\Auth\TokenAuthorization; use Laravel\Socialite\Facades\Socialite; use Illuminate\Support\Facades\Auth; Auth::viaRequest('access_token', new TokenAuthorization( socialiteProvider: 'zenit', userProvider: Auth::createUserProvider(config('auth.guards.api.provider')), cache: cache()->driver() ));
接下来,为守卫注册驱动程序
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'access_token', 'provider' => 'users', ] ]
由于访问令牌可能与用户不关联,因此 Authenticatable
对象是 Client
类。它仅在请求期间存在。
use Illuminate\Http\Request; use Laravel\Sanctum\Contracts\HasApiTokens; public function index(Request $request) { $authenticated = $request->user(); if ($authenticated instanceof HasApiTokens) { // Check scope $authenticated->currentAccessToken()->scope(); } }
另一方面,您可以使用 ScopedToken
中间件来检查令牌作用域
use Illuminate\Support\Facades\Route; use SocialiteProviders\Zenit\Middlewares\ScopedToken; Route::get('example', 'ctl') ->middleware([ScopedToken::class.':my-scope,foo,bar'])