为什么客户读者应该与Laravel Passport中的用户相关联?

我想使用客户端凭据对客户端应用程序进行身份验证以访问 API。

我的问题是创建客户端凭据。使用要求我输入user_id将客户端与该用户相关联。我不明白。为什么客户端应用程序必须与用户相关联?!还是有其他方法?php artisan passport:client

passport:client 命令仅支持创建密码授予客户端和个人授权客户端。我不认为他们中的任何一个都是我需要的。

我真正需要的是创建客户端凭据,这些凭据仅由客户端应用程序用于授权自身访问某些 API。如何做到这一点?


答案 1

我假设您要使用机器对机器身份验证(无用户交互)

我建议通读几遍文档以掌握窍门。

我不相信有一种特定的方法来创建一个唯一的客户端凭据客户端,我所做的是创建一个个人客户端,然后在数据库中更改个人客户端的字段personal_access_client 1 => 0

您可以使用个人客户端选项,如该选项所示--help

Usage:
  passport:client [options]

Options:
      --personal        Create a personal access token client
      --password        Create a password grant client
      --name[=NAME]     The name of the client
  -h, --help            Display this help message
...

php artisan passport:client --personal

输出

Personal access client created successfully.
Client ID: 1
Client Secret: LbjQNxK5SQZ3pPrEBUwbkE8vaRkg8jh25Qh43HYy

您需要使用另一个中间件,而不是默认中间件,因为在使用此方法时没有用户在场

  • 在内核中定义客户端凭证别名中间件
  • 添加中间件进行路由
  • 发送请求

定义 http 内核的客户端凭据中间件

类:\App\Http\Kernel

 protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'client_credentials' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
        //ommited
    ];

在路由上定义中间件

Route::get('/test', 'ApiTestController@test')->middleware('client_credentials');

类:\App\Http\Controllers\ApiTestController

public function test() {
        return response()->json(['data' => 'hey'] );
}

php artisan route:list

GET|HEAD  | api/test | App\Http\Controllers\ApiTestController@test   | api,client_credentials  |

发送请求

遵循有关客户端凭据授予令牌的文档中的指定请求

我使用Postman是为了简单起见,使用Postman轻松发送测试请求(www.getpostman.com)

将授权设置为 OAuth 2.0,图像:邮差身份验证

将访问令牌 URL、客户端 ID、客户端密码和授权类型设置为“客户端凭据”,图像:Postman OAuth 字段

Postman创建一个令牌并将其附加到URL或Head,在本例中为head。

Accept:application/json
Authorization:Bearer eyJ0eXAiOi...KCjK0

响应:

{
  "data": "hey"
}

答案 2

这些答案有点老了。

您当然可以添加客户端凭据。

php artisan passport:client --client

protected $signature = 'passport:client
        {--personal : Create a personal access token client}
        {--password : Create a password grant client}
        {--client : Create a client credentials grant client}
        {--name= : The name of the client}
        {--provider= : The name of the user provider}
        {--redirect_uri= : The URI to redirect to after authorization }
        {--user_id= : The user ID the client should be assigned to }
        {--public : Create a public client (Auth code grant type only) }';

推荐