導入
この記事では、APIトークンの認証について図を用いて分かりやすく解説していきます。
API トークン認証の仕組みを大まかに理解した後、Laravel Sanctum を使用した API トークン認証の仕組みをコードベースで説明します。
この記事を読むことで、次のことがわかります
- API トークン認証の仕組み
- Laravel Sanctum のインストール方法
- ユーザー登録時とログイン時のAPIトークンの生成
- アクセスを制限し、リソースの所有権を確認するための API トークン認証
- ログアウト時の API トークンの削除
API トークン認証の仕組み
1.ユーザー登録・ログインリクエスト
クライアントはユーザーのログイン情報 (電子メール、パスワードなど) を認証サーバーに送信します。
2.ユーザー認証
認証サーバーはログイン情報を検証して、ユーザーが存在するかどうか、およびパスワードが正しいかどうかを確認します。
3. API トークンの生成
ログインに成功すると、認証サーバーはユーザーの API トークンを生成します。生成された API トークンは、personal_access_tokens テーブルに保存されます。
4. APIリクエスト
クライアントは、生成された API トークンを Authorization ヘッダーに添付して、API リクエストをリソース サーバーに送信します。
5. APIトークンの検証
リソースサーバーは API トークンを検証します。 API トークンが有効な場合、リクエストは処理されます。
6. API レスポンス
リソースサーバーは API 応答を返します。
Laravel Sanctumのインストール方法
1 | sail php artisan install:api
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
このコマンドは、Laravel プロジェクトでの API トークン認証に必要な api.php ファイルと移行ファイルを生成します。
次に、移行を実行します。
これにより、personal_access_tokens テーブルが作成されます。
1 | 2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ユーザー登録時とログイン時にAPIトークンを生成する
サンプルコード
api.php
1 | Route::post( '/register' , [AuthController:: class , 'register' ]);
|
ログイン後にコピー
ログイン後にコピー
AuthController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
];
}
|
ログイン後にコピー
ユーザー登録
- ユーザー登録
- 新しいユーザーが users テーブルに保存されます。
- API トークンが生成されます。 (トークン作成)
- 生成された API トークンとユーザー情報はpersonal_access_tokens テーブルに保存され、API トークンがユーザーに提供されます。
サンプルコード
api.php
1 | *Route*::post( '/login' , [*AuthController*:: class , 'login' ]);
|
ログイン後にコピー
AuthController.php
1 | sail php artisan install:api
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ユーザーログイン
- ユーザーログイン。
- ユーザーが users テーブルに存在するかどうかを確認します。
- ログインに成功すると API トークンが生成されます。 (トークン作成)
- 生成された API トークンとユーザー情報はpersonal_access_tokens テーブルに保存され、API トークンがユーザーに提供されます。
*注意:ユーザーがログインするたびに、新しい API トークンが生成されます。
APIトークンの生成
Postman を使用して、次の条件で API リクエストを送信し、応答を確認します。
ログインに成功すると、API トークンが生成されます。
personal_access_tokens テーブルをチェックして、ログイン ユーザーの名前と API トークンが保存されていることを確認できます。
*注意: API 応答のトークンは、データベースに保存されるときにハッシュされるため、personal_access_tokens テーブルのトークンとは異なります。
APIトークン認証
- ユーザーは API リクエストを送信し、Authorization ヘッダーに API トークンを含めます。
-
auth:sanctum ミドルウェアは、API リクエストから受け取った API トークンを、personal_access_tokens テーブルに保存されている API トークンと照合します。
- API トークンが正常に認証されると、リソース サーバーは API リクエストを処理します。
- 認証されたユーザーは投稿を更新または削除できます。
- リソースサーバーは API 応答を返します。
ポスト機能へのアクセスを制限する
以下は、ユーザーに関連付けられた投稿の CRUD 処理のサンプルコードです。
サンプルコード: PostController.php
Laravel Sanctum を使用して、ログインしたユーザーのみがユーザーに関連付けられた投稿を作成、編集、削除できるようにアクセスを制限します。
実際の API リクエストを送信して、API トークン認証が正しく実行されていることを確認します。
アクセス制御標準
ユーザーAPI
- インデックス、表示
これらのアクションは一般に公開された情報を提供し、ユーザー エクスペリエンスと SEO を向上させるために API トークン認証を必要としません。
- 保存、更新、削除
不正アクセスを防止し、データの整合性を維持するには、API トークン認証が必要です。
管理API
- インデックス、表示、保存、更新、削除
セキュリティを強化するには、すべてのコントローラーのアクションにユーザー認証を要求することで、パブリックである必要のない API を保護する必要があります。
コーディング
ルーティングファイルに以下のように記述することで、apiResourceに設定した投稿の全てのエンドポイントへのアクセスを制限することも可能です。
api.php
1 | sail php artisan install:api
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
この場合、PostController のストア、更新、削除アクションに対してのみ API トークン認証を設定したいと考えています。これを行うには、PostController でコンストラクター メソッドを作成し、index と show を除くすべてのアクションに auth:sanctum ミドルウェアを適用します。
PostController.php
1 | 2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ユーザーは投稿を作成、更新、または削除するときにリクエストにトークンを含める必要があります。
この設定をテストすると、投稿を作成するための認証トークンなしでリクエストを送信すると、「認証されていません」メッセージを含む 401 エラーが返され、投稿の作成は失敗します。
認可トークンが含まれている場合、データは正常に作成されます。
同様に、投稿を更新および削除するための API では、リクエストが Authorization ヘッダーにトークンを含めて送信される必要があります。
所有権の確認後の確認
API トークン認証によりユーザーのアクセス制限が実装されました。
しかし、まだ問題が残っています。
現在の状態では、認証されたユーザーは別のユーザーの投稿を更新または削除できます。
ユーザーが投稿の所有権を持っていることを確認するプロセスを追加します。
- ユーザーは API リクエストを送信し、Authorization ヘッダーに API トークンを含めます。
-
auth:sanctum ミドルウェアは、API リクエストから受け取った API トークンを、personal_access_tokens テーブルに保存されている API トークンと照合します。
-
auth:sanctum ミドルウェアは、API トークンに関連付けられたユーザーを取得し、このユーザーがターゲットの投稿の所有権を持っているかどうかを確認します。
- API トークンが正常に認証され、ユーザーがターゲット投稿の所有権を持っている場合、リソース サーバーは API リクエストを処理します。
- 投稿の所有権を持つ認証されたユーザーは、投稿を更新および削除できます。
- リソースサーバーは API 応答を返します。
コーディング
投稿の所有権を持つユーザーのみが投稿を更新および削除できるように、Laravel ポリシー ファイルに承認ロジックを記述します。
PostController.php
1 | sail php artisan install:api
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
- リクエストの受信
- ユーザーは API リクエストを送信し、Authorization ヘッダーに API トークンを含めます。
- トークンの検証
- リソースサーバーは API リクエストの Authorization ヘッダーから API トークンを取得します。
次に、リクエストから受け取った API トークンが、personal_access_tokens テーブルに保存されている API トークンと一致することを検証します。
- ユーザー識別
- トークンが有効な場合、そのトークンに関連付けられたユーザーが識別されます。
$request->user() メソッドで識別されたユーザーを取得できます。
- ポリシーの呼び出し
Gate::authorize メソッドは、認証されたユーザーとリソース オブジェクトを引数としてポリシーのメソッドに渡します。
PostPolicy.php
modifyメソッド:
- 引数:
- $user: 現在認証されているユーザーのインスタンス。
- $post: Post モデルのインスタンス。
- ロジック:
- 現在認証されているユーザーが指定された投稿の所有権を持っているかどうかを確認します。
他のユーザーの投稿を更新する
- 更新 API エンドポイントを投稿するためのパス パラメーターとして投稿 ID を設定します。
- この投稿を所有していないユーザーのトークンを Authorization ヘッダーに含めます。
- あなたが投稿の所有者ではないことを示す 403 エラー メッセージを返します。
ログアウト時のAPIトークンの削除
ログアウトの流れ
- ユーザーが API リクエストを送信し、認可ヘッダーに API トークンを含めます
-
auth:sanctum ミドルウェアは、API リクエストから受け取った API トークンを、personal_access_tokens テーブルに保存されている API トークンと照合します。
- API トークンが正常に認証されると、リソース サーバーは API リクエストを処理します。
- 認証されたユーザーの API トークンをpersonal_access_tokens テーブルから削除します。
- リソースサーバーは API 応答を返します。
コーディング
api.php
1 | 2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログアウト ルーティングに auth::sanctum ミドルウェアを適用し、API トークン認証を設定します。
AuthController.php
1 | Route::post( '/register' , [AuthController:: class , 'register' ]);
|
ログイン後にコピー
ログイン後にコピー
サーバーは現在の API トークンをデータベースから削除します。これによりトークンは無効になり、再度使用できなくなります。
サーバーは、ログアウトが成功したことを示す応答をクライアントに返します。
まとめ
この記事では、APIトークンの認証について図を用いて分かりやすく解説しました。
Laravel Sanctum を活用することで、API トークンを使用してシンプルかつ安全な認証を実現できます。これにより、クライアントはセッションベースの認証とは異なる柔軟性で個々のユーザーにアクセス権を付与できます。ミドルウェアとポリシーを使用すると、API リクエストを効率的に保護し、アクセスを制限し、リソースの所有権を検証することもできます。
以上がAPIトークン認証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。