arietimmerman/laravel-oauth-introspect-middleware

Laravel 中间件,允许资源所有者使用远程授权服务器验证 OAuth2 访问令牌

v0.5.4 2022-01-06 20:49 UTC

This package is auto-updated.

Last update: 2024-09-07 02:40:18 UTC


README

Latest Stable Version Total Downloads

特别是对于微服务架构,认证和授权功能应该委托给其他服务。通过将 Web 服务实现为纯 OAuth2 资源服务器,并依赖于远程授权服务器上的令牌验证来保护资源是最佳做法。

Laravel OAuth 2.0 令牌检查中间件

Laravel Passport 提供了完整的 OAuth2 服务器实现,但缺少了 OAuth 2.0 令牌检查(RFC7662)中定义的可选 OAuth2 功能。

检查端点由 ipunkt/laravel-oauth-introspection 提供。此包提供了验证访问令牌对远程检查端点的中间件。

注意:为了防止令牌扫描攻击,该端点还必须要求某种形式的授权才能访问此端点。提供的中间件假设检查端点需要使用客户端凭证授权检索的 OAuth2 Bearer 令牌。因此,您必须提供有效的 客户端 ID客户端密钥

安装

在您的资源服务器上安装此包

composer require arietimmerman/laravel-oauth-introspect-middleware

并在您的 config/app.php 中添加服务提供者

'providers' => [
     // [..]
    \ArieTimmerman\Laravel\OAuth2\ServiceProvider::class
     // [..]
];

并在您的 App/Http/Kernel.php 中添加中间件

protected $routeMiddleware = [
    // [..]
    'verifyaccesstoken' => \ArieTimmerman\Laravel\OAuth2\VerifyAccessToken::class,
    // Or
    'verifyaccesstoken_has_any' => \ArieTimmerman\Laravel\OAuth2\VerifyAccessTokenHasAnyScope::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');
});

// or if only one of the scopes from the list is required
Route::group(['middleware'=>'verifyaccesstoken_has_any:required-scope1,required-scope2'], function () {
	Route::get('/endpoint1', 'UserController@index');
	Route::resource('/resource', 'OrderController');
});