如何使用 Laravel Passport 组织这样的路由保护?

Posted

技术标签:

【中文标题】如何使用 Laravel Passport 组织这样的路由保护?【英文标题】:How to organize such route protection using Laravel Passport? 【发布时间】:2020-05-18 22:36:18 【问题描述】:

在我的 laravel 项目中,我使用 Laravel Passport PasswordClient 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 Passport:手动创建访问令牌

Laravel 8、Passport 和 MongoDB 集成

如何卸载 Laravel Passport

如何使用 Laravel Passport 验证令牌?

Laravel 5.3 + Passport:总是未经身份验证的错误

如何使用 Laravel Passport 访问令牌