person t-kobayashi

Laravel Sanctumを使ってAPI提供する仕組みを構築する

calendar_today 2021年10月13日 update 2021年10月13日
Facebook Twitter LINE はてなブックマーク Pocket

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をインストールする場合は、以下のサイトの手順に沿ってインストールし設定を行います。

Laravel Sanctumインストールガイド(英語)

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を実行するための手順は以下のページで紹介しています。

https://www.petadocs.com/laravel/article/22

関連記事

Laravelの記事一覧を見る

Laravelの質問

dosanko が3年前に投稿

質問日時 2021年05月26日

search