【问题标题】:Laravel Passport without oAuth没有 oAuth 的 Laravel 护照
【发布时间】:2020-02-11 05:06:59
【问题描述】:

我想使用 laravel 护照来保护我的 api 调用。但我不想使用连接到用户的 access_tokens。

我想创建一个客户端 (artisan passport:client) 并使用 ID 和密码来授权我的请求。我只是不知道它应该如何工作,或者它是否可能。 有人知道如何实现吗?

我想在 php 中使用 guzzle 进行 API 调用。

【问题讨论】:

  • 您想保护前端 JavaScript 或其他应用程序的调用?
  • 将使用 guzzle 在 PHP 中进行调用
  • 出于好奇:如果您的代币没有连接到任何用户,那么使用代币有什么意义?那你想怎么处理权限呢?
  • @NicoHaase,我想确保不是每个人都可以向 api 发出请求。通过使用令牌,我可以确保您在拨打电话之前确实需要知道密钥和秘密。
  • 你如何区分不同的访问级别?如果您不想使用用户实体,如何知道为哪个用户授予了哪个令牌?

标签: laravel laravel-passport laravel-6


【解决方案1】:

嗯,您可以使用 Passport 的 Client Credentials Grant Tokens。来自文档:

客户端凭据授予令牌

客户端凭据授予适用于机器对机器 验证。例如,您可以在计划中使用此授权 通过 API 执行维护任务的作业。

在您的应用程序可以通过客户端凭据颁发令牌之前 授予,您将需要创建一个客户端凭据授予客户端。你 可以使用passport:client--client 选项来执行此操作 命令:

php artisan passport:client --client

接下来,要使用此授权类型,您需要添加 CheckClientCredentials 中间件到 $routeMiddleware 属性 您的app/Http/Kernel.php 文件:

use Laravel\Passport\Http\Middleware\CheckClientCredentials;

protected $routeMiddleware = [
    'client' => CheckClientCredentials::class,
];

然后,将中间件附加到路由:

Route::get('/orders', function (Request $request) {
    ...
})->middleware('client');

要将对路由的访问限制在特定范围内,您可以提供 附加时所需范围的逗号分隔列表 client中间件到路由:

Route::get('/orders', function (Request $request) {
    ...
})->middleware('client:check-status,your-scope');

检索令牌

要使用此授权类型检索令牌,请向 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'];

【讨论】:

  • 谢谢!这看起来很有希望,但我在请求令牌时收到此消息:{ "error": "unsupported_grant_type", "error_description": "The authorization grant type is not supported by the authorization server.", "hint": "Check that all required parameters have been provided", "message": "The authorization grant type is not supported by the authorization server." }。我确实发送了所有参数,就像您使用邮递员的示例一样。
  • 抱歉,我在邮递员中遇到了一个错误,但是当我使用 Guzzle 时它确实有效。
  • 很高兴提供帮助 :) 顺便说一句,它也应该在邮递员中工作。这很奇怪,但至少你让它起作用了。
  • 是的,我想我错过了一些标题
猜你喜欢
  • 2018-02-19
  • 1970-01-01
  • 2018-01-03
  • 2018-03-20
  • 2017-06-06
  • 2019-12-21
  • 2021-08-31
  • 2017-07-27
  • 2016-07-29
相关资源
最近更新 更多