如何使用 Laravel Passport 组织这样的路由保护?
Posted
技术标签:
【中文标题】如何使用 Laravel Passport 组织这样的路由保护?【英文标题】:How to organize such route protection using Laravel Passport? 【发布时间】:2020-05-18 22:36:18 【问题描述】:在我的 laravel 项目中,我使用 Laravel Passport Password 和 Client Credentials Grant Tokens。
客户端凭据授予令牌
客户端凭据授予适用于机器对机器的身份验证。例如,您可以在通过 API 执行维护任务的计划作业中使用此授权。
此授权类型具有用于验证客户端凭据的中间件。
中间件路径
Laravel\Passport\Http\Middleware\CheckClientCredentials
通过在app/Http/Kernel.php
中注册这个中间件,我们可以保护我们的路由
use Laravel\Passport\Http\Middleware\CheckClientCredentials;
protected $routeMiddleware = [
'client' => CheckClientCredentials::class,
];
路由保护示例
Route::get('/orders', function (Request $request)
...
)->middleware('client');
我们可以通过请求获得任何授权类型的访问令牌:http://your-app.com/oauth/token
示例
$guzzle = new GuzzleHttp\Client;
$response = $guzzle->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'client_credentials',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'scope' => 'your-scope',
],
]);
return json_decode((string) $response->getBody(), true)['access_token'];
密码授予令牌
OAuth2 密码授权允许您的其他第一方客户端(例如移动应用程序)使用电子邮件地址/用户名和密码获取访问令牌。这使您可以安全地向您的第一方客户端颁发访问令牌,而无需您的用户完成整个 OAuth2 授权代码重定向流程。
通过Password Grant Client,我们可以授权我们的用户并使用auth:api
中间件保护授权路由。对于访问授权路由,我们必须将令牌设置为请求标头到access_token
字段。
路由保护示例
Route::get('/orders', function (Request $request)
...
)->middleware('auth:api');
现在,当两种授权类型(Password Grant Tokens && Client Credentials Grant Tokens)都需要从标头字段access_token
访问令牌时,我如何保护我的路由?
类似的东西
Route::get('/orders', function (Request $request)
...
)->middleware(['client', 'auth:api']);
当两个中间件都在等待来自 header 的一个字段 access_token 的令牌时,如何使用 Laravel Passport 组织这种保护?
【问题讨论】:
您的要求并不是 100% 清楚。请您提供更多详细信息。 好的@Rwd 现在我将编辑我的问题 @Rwd 我已经通过添加更多详细信息来编辑我的问题 @Andread Hunter 我认为您正在寻找的是 (filljoyner.com/2017/03/01/…) 作者分解了 client credentials grant (client middleware) 和 password 的路由授予(auth:api 中间件)。我目前对如何同时为两个中间件共享相同的资源有同样的问题。 那篇文章对你有帮助吗? @xyfantis 【参考方案1】:也许像这样??
Route::middleware(['client', 'auth:api'])->group(function()
Route::get(....);
);
【讨论】:
以上是关于如何使用 Laravel Passport 组织这样的路由保护?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 8、Passport 和 MongoDB 集成