designmynight / laravel-oauth-introspect-middleware
Laravel 包,允许资源所有者使用远程授权服务器验证 OAuth2 访问令牌
v3.0.0
2023-06-19 08:56 UTC
Requires
- php: ^8.0
- guzzlehttp/guzzle: ^7.2
- laravel/framework: ^9.0
- laravel/passport: ^10.0
Requires (Dev)
- orchestra/testbench: ^7.0
README
特别是在微服务架构中,认证和授权功能应该委托。通过将 Web 服务实现为纯 OAuth2 资源服务器,并依赖于远程授权服务器上的令牌验证来保护资源是最佳做法。
Laravel OAuth 2.0 令牌检查中间件
Laravel Passport 提供了完整的 OAuth2 服务器实现,但仍缺少 OAuth 2.0 令牌检查(RFC7662)中定义的可选 OAuth2 功能。
检查端点由 ipunkt/laravel-oauth-introspection 提供。此包提供验证访问令牌所需的中介件,以对远程检查端点进行验证。
注意:为了防止令牌扫描攻击,此端点还必须要求某种形式的授权才能访问。提供的中间件假定检查端点需要使用客户端凭证授权检索的 OAuth2 Bearer 令牌。因此,您必须提供有效的 客户端 ID 和 客户端密钥。
安装
在您的资源服务器上安装该包
composer require designmynight/laravel-oauth-introspect-middleware
并在您的 config/app.php
中添加服务提供者
'providers' => [ // [..] \DesignMyNight\Laravel\OAuth2\IntrospectMiddlewareServiceProvider::class // [..] ];
并在您的 App/Http/Kernel.php
中添加中间件
protected $routeMiddleware = [ // [..] 'verifyaccesstoken' => \DesignMyNight\Laravel\OAuth2\VerifyAccessToken::class, // [..] ];
发布配置
php artisan vendor:publish
最后,在您的 .env
文件中定义以下属性
# Url of the authorization server AUTHORIZATION_SERVER_URL="https://authorization.server.dom" # Client Identifier as defined in https://tools.ietf.org/html/rfc6749#section-2.2 AUTHORIZATION_SERVER_CLIENT_ID="123" # The client secret AUTHORIZATION_SERVER_CLIENT_SECRET="abcdefg" # Endpoint for requesting the access token AUTHORIZATION_SERVER_TOKEN_URL="${AUTHORIZATION_SERVER_URL}/oauth/token" # The OAuth2 Introspection endpoint https://tools.ietf.org/html/rfc7662 AUTHORIZATION_SERVER_INTROSPECT_URL="${AUTHORIZATION_SERVER_URL}/oauth/introspect" # Optional configuration for requesting an OAuth2 access tokens using the implicit grant flow AUTHORIZATION_SERVER_AUTHORIZATION_URL="${AUTHORIZATION_SERVER_URL}/oauth/authorize" AUTHORIZATION_SERVER_REDIRECT_URL=https://my.machine.dom
现在,使用中间件。
Route::group(['middleware'=>'verifyaccesstoken:required-scope1,required-scope2'], function () { Route::get('/endpoint1', 'UserController@index'); Route::resource('/resource', 'OrderController'); });