Laravel SanctumでPHPのRESTful APIを構築する
読む所要時間: 10 分
Laravel Sanctum(旧称Airlock)は、シングルページアプリケーション(SPA)、モバイルアプリケーションや基本的なトークンベースのAPI用に作成されたLaravelパッケージです。これによりAPIトークンをユーザーに発行し、Laravelセッションを使用したシングルページアプリケーション認証が行えます。Laravel Sanctumは、既存のLaravel Passportパッケージの簡易版です。PassportよりもSanctumを選ぶ理由は以下のとおりです。
- PassportはOAuth2認証が実装されています。これを使用しないのであれば、APIトークンの発行はSanctumで行えます。
- Sanctumは超軽量でシンプルに実装できます。
- Sanctumは、Vue、Angular、Reactなどのシングルページアプリケーションに対応しています。モバイルアプリケーション認証も対応しています。
必要条件
このチュートリアルを進めるには次の項目が必要です。
Laravel Sanctumでは多くのことができますが、このチュートリアルではLaravel Sanctumを使用したAPIの構築方法を説明します。
はじめに
まず、新規のLaravelアプリケーションを作成します。ターミナルで次のコマンドを実行してください。
laravel_sanctum
はアプリケーションの名前です。このコマンドで、Laravelアプリケーションを格納する新しいフォルダ、laravel_sanctum
が作成されました。
ここで、Laravelアプリケーションを起動して問題なく動作することを確認しておきましょう。以下のコマンドを実行してください。
Laravelアプリケーションの準備ができたらLaravel Sanctumを追加します。まず、Composerを使用してアプリケーションにLaravel Sanctumをインストールします。以下のコマンドを実行してください。
次に、Laravel Sanctumの設定と移行ファイルを公開します。以下のコマンドを実行してください。
sanctum.phpファイルがconfigディレクトリに作成され、migrationsディレクトリに必要な移行ファイルが配置されます。
移行の前に、データベースのセットアップが必要です。database.sqliteファイルを作成します。以下のコマンドを実行してください。
以下のように.envファイルを更新してください。
データベースを移行します。以下のコマンドを実行してください。
デフォルトでLaravelに付属するテーブルに加え、すべてのトークンを格納するpersonal_access_tokens
テーブルがデータベースに作成されます。
最後に、Laravel Sanctumを使用してユーザートークンを作成する前に、User
モデルでHasApiTokens
トレイトが使用されるようにします。app/Models/User.phpファイルを開き、次の修正を加えてください。
APIを作成する
シンプルな構成をとるために、APIのエンドポイントは3つのみです。最初のエンドポイントはアカウントの登録に、2つ目のエンドポイントはユーザーよるログインと認証に使用します。3つ目のエンドポイントは現在認証されているユーザーをフェッチします。
それでは、アカウントを登録してみましょう。認証を行うコントローラーを作成します。ターミナルで以下のArtisanコマンドを実行してください。
app/Http/Controllersフォルダーに新しくAuthController.phpファイルが作成されます。
ユーザー登録を行うルートを作成します。routes/api.phpファイルを開き、以下のコードを追加してください。
ユーザー登録メソッドを作成します。AuthController
を開き、以下のコードを追加してください。
まず、着信リクエストを検証し、必要な変数がすべて含まれていることを確認します。次に受け取ったデータをデータベースに格納します。createToken()
メソッドを使い、作成されたユーザーに新しい個人アクセストークンを生成します。トークンをauth_token
と名付けます。createToken()
によりLaravelのインスタンスが返されます。このインスタンスにplainTextToken
プロパティを呼び出し、トークンのプレーンテキスト値にアクセスします。最後に、作成されたトークンとトークンタイプを含むJSONレスポンスを返します。
続いて、ユーザーをログインページに戻すための実装を追加します。以下のコードをroutes/api.phpに追加してください。
そして、AuthController
の中にlogin()
メソッドを追加します。以下のコードを追加してください。
上記のコードにより、入力されたメールアドレスとパスワードが実際のusers
テーブルと一致するかをチェックし、ユーザーの新しい個人アクセストークンを生成します。
最後に、現在認証されているユーザーをフェッチする機能を加えます。以下のコードをroutes/api.phpに追加してください。
そして、AuthController
に次のコードを追加してください。
このコードは非常にシンプルです。現在認証済みのユーザーを返します。
エンドポイントを認証済みユーザーのみに限定する
お考えのとおり、/me
エンドポイントは認証済みのユーザーのみがアクセスできるようにしなければなりません。そのためにsanctum
認証ガードが使えます。
次のようにルートを更新してください。
これにより、このエンドポイントのリクエストのヘッダーに有効なAPIトークンが含まれるようになります。
APIをテストする前に、app/Providers/RouteServiceProvider.phpの以下のコメントを解除してください。
APIをテストする
作成したAPIをテストしてみましょう。ここではInsomniaを使用しますが、お好きなHTTPクライアントを使用できます。
まず、アプリケーションの実行を確認します。ターミナルで以下のコマンドを実行してください。
アプリケーションはhttp://127.0.0.1:8000で実行されます。APIにはhttp://127.0.0.1:8000/apiからアクセスします。
さらに次の例のように、Insomniaでリクエストができます。
新規ユーザーを作成する
新しいユーザーを作成するために、http://127.0.0.1:8001/api/register宛にname
、email
とpassword
を含むPOSTリクエストを作成します。パスワードは8文字以上必要です。
ユーザーとしてログインする
ログインには、email
とpassword
(プレーンテキスト)を追加し、http://127.0.0.1:8001/api/loginにPOSTリクエストを行います。
有効なトークンを使用して/meエンドポイントにアクセスしようとすると、以下のような結果になります。
有効なトークンを使用しないと、以下のようにユーザー詳細が表示されます。
まとめ
このチュートリアルでは、Laravel Sanctumとその機能について紹介しました。Laravel Passportとの違いや、その用途も取り上げました。さらに、Laravel Sanctumを使用してユーザー情報にアクセスするために、トークンを作成して認証を行い、ユーザーにLaravel APIの使用を許可する方法を説明しました。
Laravel Sanctumについて詳しくは、公式ドキュメントを参照してください。
このチュートリアルの全ソースコードはGitHubで確認できます。
Chimezie Enyinnayaは、ソフトウェアエンジニア兼インストラクターです。Chimezie Enyinnayaについてもっと知りたい方は、以下の連絡先でご確認ください。
Webサイト: https://adonismastery.com
Twitter: https://twitter.com/ammezie
GitHub: https://github.com/ammezie