SPAやモバイルアプリケーションを作成する際に必要になるバックエンド環境としてのAPI、Laravelで用意する方法としてなるべく簡単な方法がないものかと考えている人に向けて提供していきます。
目次
作成コマンド
# laravelプロジェクト(現在の最新v11)の作成
composer create-project laravel/laravel backend
# 会員登録機能をjetstreamでセットアップ
cd backend
composer require laravel/jetstream
php artisan jetstream:install livewire
# エラー文言など日本語化
composer require laravel-lang/common --dev
php artisan lang:add ja
php artisan lang:update
# .env を以下に変更
# APP_LOCALE=ja
# API実行時のCORS設定ファイルを変更しやすいようにプロジェクト配下に置く
php artisan config:publish cors
# Laravel Herd を使用して開発環境としてhttpsアクセスできるように
herd link
herd secure
herd open # https://backend.test でブラウザが開く
上記の設定で https://backend.test にアクセスできるようになり、会員登録機能も実装されています。
メールアドレス認証などはすっ飛ばして、Eメールとパスワードを入力すればユーザー登録されてログインできるようになっています。メール認証が必要な方は別途この辺とかみて実装してみてください。
これで会員登録機能がついたWebアプリケーションが完了しました。ですが、APIで使う事を考えるとWeb画面が要りません。非表示にしましょう。
/*
|--------------------------------------------------------------------------
| Register View Routes
|--------------------------------------------------------------------------
|
| Here you may specify if the routes returning views should be disabled as
| you may not need them when building your own application. This may be
| especially true if you're writing a custom single-page application.
|
*/
'views' => false,
これで完了です。
流れとしてはLaravel Jetstream を使用していますが、Jetstreamは
- Laravel Sanctum
- API向けの軽量認証システム
- Laravel Fortify
- フロントエンドに依存しない Laravel の認証バックエンド実装
- Laravel Breeze
- Laravel のすべての認証機能を最小限かつシンプルに実装したもの
などが使われており、ログイン、登録、メールアドレス認証、2要素認証、チーム管理機能、アカウント削除機能などが実装済みのライブラリです。
使用方法としては
curl -X GET --cookie-jar cookie.txt https://backend.test/sanctum/csrf-cookie
cat cookie.txt # XSRF-TOKEN の値をコピー
curl -i -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-XSRF-TOKEN:<XSRF-TOKENの値 (末尾の `%3D` は `=` に置き換える)>" \
--cookie cookie.txt \
-d '{"email": "<登録済みのメールアドレス>", "password": "<パスワード>"}' \
https://backend.test/v1/login
でログインすることができます。
パスの sanctum/csrf-cookie
に取得して得られたクッキーや XSRF-TOKEN
を X-XSRF-TOKEN
として渡す事でCSRFは突破できます。
ヘッダー値には Accept: application/json
を付与することで通常のHTML形式ではなく、json形式でレスポンスしてくれます。
curl
で実行サンプルを載せましたが、SPAやモバイルアプリケーションに合わせて実行方法など変えてみてください。 ( 「Laravel Sanctum SPA」 とかで調べると見つかると思います。 )
その他、ログイン後にはクッキーが毎回変わったりするので、SPAで使うならaxiosを使ったりcorsの設定を見直しや SANCTUM_STATEFUL_DOMAINS
の設定変更だったりで、場合によっては対応が必要になります。
あとは Jetstreamはあくまでフロントの実装とセットで提供されているため、APIだけでの実行だとリダイレクト処理などがうまく機能しない場合もあります。用途によっては実装変更も必要になるため、こちらのサイトなどを参考にしてください。
ポイントとしては
config/cors.php
での Cross-Origin Resource Sharing (CORS) 設定の見直し- 環境変数
SANCTUM_STATEFUL_DOMAINS
でのドメイン指定 - リダイレクト処理などの変更
などが変更が必要になるので別途検索してみてください。
機能追加する場合
会員登録の機能は使えるようになりました。その他、アプリケーションに合わせた実装を追加する場合にはLaravelの知識が必要になります。
こちらの記事に当サイトのLaravelコンテンツをまとめているのでご自分の用途に合わせた記事を探してみてください。
認証機能としては主にcookieを使用していますが、ブラウザ操作以外では少し使いづらい部分があります。cookie以外での認証方法の代替えとして Sanctumは ユーザートークンも作成でき、API実行時のヘッダーに
Authorization: Bearer <作成したトークン>
を使ってもアクセスできるので、こちらも検討してみてください。
最後に
以上、APIで使う事を目的としてなるべく手早く用意する方法でした。
会員登録やログイン、パスワードリセットなど基本的なユーザー管理が用意されています。上手く使ってみてください。
参考リンク
https://blog.officekoma.co.jp/2022/01/laraveljetstream-fortify-api.html?m=1
https://zenn.dev/kita127/scraps/557e3c23fdf905#comment-df24f4839dc350
コメントを残す