API認証
- ルート保護
はじめに
Laravel は、デフォルトで、アプリケーションの各ユーザーに割り当てられたランダムなトークンを介した API 認証のシンプルなソリューションを提供します。
config/auth.php
構成ファイルでは、token
ドライバーを使用するapi
ウォッチャーが定義されています。このドライバーは、受信リクエストの API トークンをチェックし、データベース内でユーザーが割り当てたトークンと一致することを確認する役割を果たします。注: Laravel には単純なトークンベースの認証保護が同梱されていますが、API 認証を提供する堅牢な運用実装のために Laravel Passport を検討することを強くお勧めします。 ###########################構成##################### # #データベースの準備
token ドライバーを使用する前に、api_token## を
usersテーブル # 列に追加する移行を作成する必要があります。Schema::table('users', function ($table) { $table->string('api_token', 80)->after('password') ->unique() ->nullable() ->default(null); });
移行が作成されたら、
miteトークン生成
モデルが作成されるときに割り当てる必要があります。api_token
列をusers ## に追加します。 # テーブルの後に、アプリケーション内の各ユーザーにランダムな API トークンを割り当てることができます。これらのトークンは、登録中に
Usermake:auth
のArtisan コマンドによって提供される認証スキャフォールディングを使用する場合、これは
RegisterControllercreate メソッドで実行できます:
use Illuminate\Support\Str;use Illuminate\Support\Facades\Hash; /** * 在有效注册之后创建一个新用户实例: * * @param array $data * @return \App\User */ protected function create(array $data){ return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'api_token' => Str::random(60), ]); }
構成ファイルで定義されます:ハッシュ トークン
上記の例では、API トークンはプレーン テキストとしてデータベースに保存されます。 SHA-256 ハッシュを使用して API トークンをハッシュする場合は、
apiウォッチャー構成の
hashオプションを
trueに設定できます。
apiウォッチャーは、
config/auth.php'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => true, ],
ハッシュ トークンの生成
ハッシュ トークンを使用する場合、ユーザー登録中に API トークンを生成しないでください。代わりに、アプリケーションに独自の API トークン管理ページを実装する必要があります。このページでは、ユーザーが API トークンを初期化および更新できるようにする必要があります。ユーザーが初期化またはリフレッシュ トークン リクエストを行うときは、トークンのハッシュされたコピーをデータに保存し、一度表示するためにトークンのプレーン テキスト コピーをビュー/フロントエンド クライアントに返す必要があります。
たとえば、特定のユーザーのトークンを初期化/更新し、プレーン テキスト トークンを JSON 応答として返すコントローラー メソッドは次のようになります:
<?php namespace App\Http\Controllers; use Illuminate\Support\Str; use Illuminate\Http\Request; class ApiTokenController extends Controller{ /** * 更新已经验证过的用户的 API 令牌。 * * @param \Illuminate\Http\Request $request * @return array */ public function update(Request $request) { $token = Str::random(60); $request->user()->forceFill([ 'api_token' => hash('sha256', $token), ])->save(); return ['token' => $token]; } }
{tip}上記の例の API トークンには十分なエントロピーがあるため、ハッシュ化されたトークンの元の値を見つけるために「レインボー テーブル」を作成するのは非現実的です。したがって、
bcrypt
:ルート保護# のような低速ハッシュ方式を使用する必要はありません。
##Laravel には、受信リクエストの API トークンを自動的に検証できる認証ウォッチャーが含まれています。必要なのは、有効なアクセス トークンを必要とするルート上でauth:api
ミドルウェアを指定することだけです:
use Illuminate\Http\Request; Route::middleware('auth:api')->get('/user', function(Request $request) { return $request->user(); });
#リクエストでトークンを渡すAPI トークンをアプリケーションに渡す方法はいくつかあります。これらのメソッドについては、Guzzle HTTP ライブラリを使用した使用法を示しながら説明します。アプリケーションのニーズに基づいて、これらの方法のいずれかを選択できます。 リクエスト パラメーター アプリケーションの API コンシューマーは、トークンをapi_token
クエリ文字列値として提供できます:
$response = $client->request('GET', '/api/user?api_token='.$token);
リクエスト ペイロードアプリケーションの API コンシューマは、リクエストのフォーム パラメータにapi_token
:
$response = $client->request('POST', '/api/user', [ 'headers' => [ 'Accept' => 'application/json', ], 'form_params' => [ 'api_token' => $token, ], ]);
## の形式で API トークンを含めることができます。#ベアラー トークンアプリケーションの API コンシューマーは、リクエスト トークンの
Authorizationヘッダーの
LearnKu.comベアラー
として API トークンを提供できます:
この記事は、$response = $client->request('POST', '/api/user', [ 'headers' => [ 'Authorization' => 'Bearer '.$token, 'Accept' => 'application/json', ], ]);