codewiser/socialiteprovider

Zenit OAuth2 Provider for Laravel Socialite

v1.0.17 2024-08-27 10:32 UTC

This package is auto-updated.

Last update: 2024-09-27 10:53:36 UTC


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'])