APIをPHPで消費する手順を以前記事にしましたが、今回はLaravel Sanctumを利用してAPIを提供する場合の手順をまとめます。
Sanctumのインストール
最新のLaravelインストーラーを使ってLaravelアプリケーションを作成するとデフォルトでSanctumがインストールされるようになっています。以下のようにLaravelインストーラーをアップデートして、新規プロジェクトを作成すれば、Sanctumが使える状態のアプリケーションが作成されます。
composer global require "laravel/installer:^4.0"
laravel new app-name --git --branch="main"
--git
と--branch="main"
はオプションはなくてもいいですが、一緒に初期ブランチ名を指定して、gitリポジトリを生成してくれるので便利です。
既存のLaravelアプリケーションにSanctumをインストールする場合は、以下のサイトの手順に沿ってインストールし設定を行います。
APIキーを保持するテーブルを作成する
SanctumがAPIキーを保持するテーブルをマイグレーションを実行することで作成します。
php artisan migrate
personal_access_tokens
というテーブルが作れられます。
APIキーを発行する
APIキーを発行する際に、Userに対してAPIキーを発行することが多いと思いますが、HasApiTokens
トレイトを持つクラスであれば、APIトークンとの紐付けが可能です。例えばTokenHolder
というクラスにHasApiTokens
トレイトを持たせます。
use Laravel\Sanctum\HasApiTokens;
class TokenHolder extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}
トークンを発行するためにcreateToken
メソッドを利用することが可能になります。
$tokenHolder = TokenHolder::find($id);
$token = $tokenHolder->createToken("Token-Name");
上記のコマンド実行後、personal_access_tokens
テーブルにデータが追加されていることがわかります。tokenable_tytpe
フィールドにはApp\Models\TokenHolder
のような値が格納されており、tokenable_id
フィールドには$id
の値が格納されています。name
フィールドには「Token-Name」があり、token
フィールドにはSHA-256でハッシュ化されたトークンが保存されています。
実際にアクセスする際に必要となるトークンはplainTextToken
プロパティから取得することができます。
$plainTextToken = $token->plainTextToken;
$plainTextToken
の内容をAPIにアクセスする必要のあるユーザーに提供します。ただし、このコードは該当ユーザー以外が閲覧することがないように気をつける必要があります。
APIのエンドポイントを作成する
routes/api.php
ファイルに以下のパスを追加します。ミドルウェア「auth:sanctum」で該当のパスを括ることでAPIキーを使って認証を行うようになります。
Route::middleware('auth:sanctum')->get('/articles', [ArticleController:class, "index"]);
ArticleControllerのindexメソッドにて、データを戻して上げればそれで完了です。以下は一例です。
use App\Models\Article;
class ArticleController extends Controller
{
public function index()
{
return Article::get();
}
}
APIにアクセスする
ここではcurlコマンドを使って上記のAPIにアクセスできるか確認します。コマンドは以下のようになります。XXXX
は上記で発行した$plainTextToken
の値となります。
curl -H GET "https://hostdomain.com/api/articles" -H "Content-Type: application/json" -H "Authorization: Bearer XXXX"
ArticleがJSONで出力されることが確認できたらOKです。誤ったAPIキーだと、リクエストが失敗することも確認します。
PHPを使ってcurlを実行するための手順は以下のページで紹介しています。