この記事では、APIトークンの認証について図を用いて分かりやすく解説していきます。
API トークン認証の仕組みを大まかに理解した後、Laravel Sanctum を使用した API トークン認証の仕組みをコードベースで説明します。
この記事を読むことで、次のことがわかります
クライアントはユーザーのログイン情報 (電子メール、パスワードなど) を認証サーバーに送信します。
認証サーバーはログイン情報を検証して、ユーザーが存在するかどうか、およびパスワードが正しいかどうかを確認します。
ログインに成功すると、認証サーバーはユーザーの API トークンを生成します。生成された API トークンは、personal_access_tokens テーブルに保存されます。
クライアントは、生成された API トークンを Authorization ヘッダーに添付して、API リクエストをリソース サーバーに送信します。
リソースサーバーは API トークンを検証します。 API トークンが有効な場合、リクエストは処理されます。
リソースサーバーは API 応答を返します。
sail php artisan install:api
このコマンドは、Laravel プロジェクトでの API トークン認証に必要な api.php ファイルと移行ファイルを生成します。
次に、移行を実行します。
sail artisan migrate
これにより、personal_access_tokens テーブルが作成されます。
2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
api.php
Route::post('/register', [AuthController::class, 'register']);
AuthController.php
public function register(Request $request) { $fields = $request->validate([ 'name' => 'required|max:255', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed' ]); $user = User::create($fields); $token = $user->createToken($request->name); return [ 'user' => $user, 'token' => $token->plainTextToken ]; }
api.php
*Route*::post('/login', [*AuthController*::class, 'login']);
AuthController.php
sail php artisan install:api
*注意:ユーザーがログインするたびに、新しい API トークンが生成されます。
Postman を使用して、次の条件で API リクエストを送信し、応答を確認します。
ログインに成功すると、API トークンが生成されます。
personal_access_tokens テーブルをチェックして、ログイン ユーザーの名前と API トークンが保存されていることを確認できます。
*注意: API 応答のトークンは、データベースに保存されるときにハッシュされるため、personal_access_tokens テーブルのトークンとは異なります。
以下は、ユーザーに関連付けられた投稿の CRUD 処理のサンプルコードです。
サンプルコード: PostController.php
Laravel Sanctum を使用して、ログインしたユーザーのみがユーザーに関連付けられた投稿を作成、編集、削除できるようにアクセスを制限します。
実際の API リクエストを送信して、API トークン認証が正しく実行されていることを確認します。
ルーティングファイルに以下のように記述することで、apiResourceに設定した投稿の全てのエンドポイントへのアクセスを制限することも可能です。
api.php
sail php artisan install:api
sail artisan migrate
この場合、PostController のストア、更新、削除アクションに対してのみ API トークン認証を設定したいと考えています。これを行うには、PostController でコンストラクター メソッドを作成し、index と show を除くすべてのアクションに auth:sanctum ミドルウェアを適用します。
PostController.php
2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
ユーザーは投稿を作成、更新、または削除するときにリクエストにトークンを含める必要があります。
この設定をテストすると、投稿を作成するための認証トークンなしでリクエストを送信すると、「認証されていません」メッセージを含む 401 エラーが返され、投稿の作成は失敗します。
認可トークンが含まれている場合、データは正常に作成されます。
同様に、投稿を更新および削除するための API では、リクエストが Authorization ヘッダーにトークンを含めて送信される必要があります。
API トークン認証によりユーザーのアクセス制限が実装されました。
しかし、まだ問題が残っています。
現在の状態では、認証されたユーザーは別のユーザーの投稿を更新または削除できます。
ユーザーが投稿の所有権を持っていることを確認するプロセスを追加します。
投稿の所有権を持つユーザーのみが投稿を更新および削除できるように、Laravel ポリシー ファイルに承認ロジックを記述します。
PostController.php
sail php artisan install:api
PostPolicy.php
sail artisan migrate
modifyメソッド:
api.php
2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
ログアウト ルーティングに auth::sanctum ミドルウェアを適用し、API トークン認証を設定します。
AuthController.php
Route::post('/register', [AuthController::class, 'register']);
サーバーは現在の API トークンをデータベースから削除します。これによりトークンは無効になり、再度使用できなくなります。
サーバーは、ログアウトが成功したことを示す応答をクライアントに返します。
この記事では、APIトークンの認証について図を用いて分かりやすく解説しました。
Laravel Sanctum を活用することで、API トークンを使用してシンプルかつ安全な認証を実現できます。これにより、クライアントはセッションベースの認証とは異なる柔軟性で個々のユーザーにアクセス権を付与できます。ミドルウェアとポリシーを使用すると、API リクエストを効率的に保護し、アクセスを制限し、リソースの所有権を検証することもできます。
以上がAPIトークン認証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。