web-dev-qa-db-ja.com

Laravel Passportでクライアント資格情報をユーザーに関連付ける必要があるのはなぜですか?

クライアント資格情報を使用して、APIにアクセスするクライアントアプリケーションを認証したい。

私の問題は、クライアント資格情報の作成です。 php artisan passport:clientを使用するには、クライアントをそのユーザーに関連付けるためにuser_idを入力する必要があります。わかりません。クライアントアプリケーションをユーザーに関連付ける必要があるのはなぜですか。または別の方法がありますか?

passport:clientコマンドは、パスワード付与クライアントと個人付与クライアントの作成のみをサポートします。それらのどれも私が必要としているものだとは思いません。

私が本当に必要とするのは、クライアントアプリケーションが一部のAPIへのアクセスを承認するためにのみ使用するクライアント資格情報を作成することです。どうやってするか?

14
Meena Alfons

私はあなたがマシンツーマシン認証を使用したいと思います(ユーザーインタラクションなし)

私はそれのこつを得るためにドキュメントを数回読むことをお勧めします。

唯一のクライアント資格情報クライアントを作成する特定の方法があるとは思いません。個人用クライアントを作成してから、データベース内の個人用クライアントのフィールドを変更することですpersonal_access_client1 => 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  |

リクエストを送信

Client-credentials-grant-tokensのドキュメントで指定されたリクエストに従う

簡単にするためにPostmanを使用し、Postman(www.getpostman.com)で簡単にテストリクエストを送信

承認をOAuth 2.0、image: Postman authentication に設定します

アクセストークンのURL、クライアントID、クライアントシークレットを設定し、タイプを「クライアント認証情報」に設定します。画像: Postman OAuth Fields

Postmanはトークンを作成し、それをURLまたはヘッダー(この場合はヘッダー)に追加します

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

応答:

{
  "data": "hey"
}
8
Raldo94

私はコメントするつもりでしたが、まだ十分な評判がありません= p

コマンドにユーザー入力を必要としない名前パラメーターを与えることができます。手動で介入せずにクライアントの秘密をクライアントに伝える方法は、実際の魔法のようです。

php artisan passport:client --personal --name={someName}

そのコマンドはまだあなたに与えるでしょう:


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

予想通り。

2
waaffles