php artisan passport:client
创建了2个客户
在我的
app/Providers/AppServiceProvider.php
中,我添加了2个示波器。
目的是一个客户端/机器只能发送数据,第二个客户端/机器只能读取数据
public function boot(): void
{
Passport::tokensCan([
'can-send' => 'Can send data',
'can-read' => 'Can read data',
]);
}
I在routes/api.php
Route::get('/send', function (Request $request) {
return 'You can send data';
})->middleware(['client:can-send']);
Route::get('/read', function (Request $request) {
return 'You can read data';
})->middleware(['client:can-read']);
问题是,当一位客户要求访问时,他们可以将 *作为范围进行 *,因此无关紧要的是,哪个客户都可以获取所有范围,因此在这种情况下他们可以有效地访问两个端点。 我知道没有特定用户的客户端赠款是用于机器的机器,但是如果需要2台计算机访问我的API,一个用于将数据发送到我的API,而仅用于从我的API读取数据?为了实现这一目标,我看不到Laravel Passport如何做到这一点。我无法在
php artisan passport:client
命令中为客户端设置范围。那么如何处理?我使用de Client-Crendentials Grant设置了Laravel Passport,因为我认为这是M2M的正确方法。我想为客户端创建的客户设置范围,但我看不到如何实现这一目标。
您正确的是,客户凭证赠款是在Laravel Passport中处理机器对机器(M2M)身份验证的正确方法。但是,您面临的问题是客户可以要求 *作为范围,有效地绕过您的预期限制。 solution:为客户端分配特定范围 Laravel Passport在使用
php artisan passport:client
创建客户时,没有提供内置的方式将特定范围分配给客户端。但是,您可以将客户端限制到特定的范围。步骤1:设置客户端上的允许范围 创建客户端后,手动更新
oauth_clients
确保每个客户只能请求分配给他们的范围。
步骤2:中间件中强制执行范围限制
即使客户在技术上可以要求*
,您也可以强制中间件中的正确范围以防止未经授权的访问。
Route::get('/send', function (Request $request) {
return 'You can send data';
})->middleware(['client', 'scopes:can-send']);
Route::get('/read', function (Request $request) {
return 'You can read data';
})->middleware(['client', 'scopes:can-read']);
步骤3:防止客户要求 *范围 通过强迫他们仅使用分配的范围来修改客户端请求令牌的方式。请求访问令牌时,请确保请求仅包括允许的范围:
curl -X POST http://your-app.test/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "client_credentials",
"client_id": "your-client-id",
"client_secret": "your-client-secret",
"scope": "can-send"
}'
步长4:覆盖护照的令牌发行(可选)如果您想采用更严格的方法,可以通过扩展客户端限制类并防止用作范围来覆盖Passport的代币发行过程。