Laravel SanctumでPHPのRESTful APIを構築する

February 26, 2021
執筆者
Chimezie Enyinnaya
寄稿者
Twilio の寄稿者によって表明された意見は彼ら自身のものです
レビュー担当者

Laravel SanctumでPHPのRESTful APIを構築する

この記事はソフトウェアエンジニアのChimezie Enyinnayaこちらで公開した記事(英語)を日本語化したものです。

Laravel Sanctum(旧称Airlock)は、シングルページアプリケーション(SPA)、モバイルアプリケーションや基本的なトークンベースのAPI用に作成されたLaravelパッケージです。これによりAPIトークンをユーザーに発行し、Laravelセッションを使用したシングルページアプリケーション認証が行えます。Laravel Sanctumは、既存のLaravel Passportパッケージの簡易版です。PassportよりもSanctumを選ぶ理由は以下のとおりです。

  1. PassportはOAuth2認証が実装されています。これを使用しないのであれば、APIトークンの発行はSanctumで行えます。
  2. Sanctumは超軽量でシンプルに実装できます。
  3. Sanctumは、Vue、Angular、Reactなどのシングルページアプリケーションに対応しています。モバイルアプリケーション認証も対応しています。

必要条件

このチュートリアルを進めるには次の項目が必要です。

  1. Laravelの知識。
  2. Insomniaなど、HTTPクライアントの使用に関する基本知識。

Laravel Sanctumでは多くのことができますが、このチュートリアルではLaravel Sanctumを使用したAPIの構築方法を説明します。

はじめに

まず、新規のLaravelアプリケーションを作成します。ターミナルで次のコマンドを実行してください。

composer create-project --prefer-dist laravel/laravel laravel_sanctum

laravel_sanctumはアプリケーションの名前です。このコマンドで、Laravelアプリケーションを格納する新しいフォルダ、laravel_sanctumが作成されました。

ここで、Laravelアプリケーションを起動して問題なく動作することを確認しておきましょう。以下のコマンドを実行してください。

cd laravel_sanctum
php artisan serve

Laravelアプリケーションの準備ができたらLaravel Sanctumを追加します。まず、Composerを使用してアプリケーションにLaravel Sanctumをインストールします。以下のコマンドを実行してください。

composer require laravel/sanctum

次に、Laravel Sanctumの設定と移行ファイルを公開します。以下のコマンドを実行してください。

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

sanctum.phpファイルがconfigディレクトリに作成され、migrationsディレクトリに必要な移行ファイルが配置されます。

移行の前に、データベースのセットアップが必要です。database.sqliteファイルを作成します。以下のコマンドを実行してください。

touch database/database.sqlite

Windows環境はtouchコマンドが使用できません。必要に応じてIDEを使用してファイルを作成してください。

以下のように.envファイルを更新してください。

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

データベースを移行します。以下のコマンドを実行してください。

php artisan migrate

デフォルトでLaravelに付属するテーブルに加え、すべてのトークンを格納するpersonal_access_tokensテーブルがデータベースに作成されます。

最後に、Laravel Sanctumを使用してユーザートークンを作成する前に、UserモデルでHasApiTokensトレイトが使用されるようにします。app/Models/User.phpファイルを開き、次の修正を加えてください。

// app/Models/User.php

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}

APIを作成する

シンプルな構成をとるために、APIのエンドポイントは3つのみです。最初のエンドポイントはアカウントの登録に、2つ目のエンドポイントはユーザーよるログインと認証に使用します。3つ目のエンドポイントは現在認証されているユーザーをフェッチします。

それでは、アカウントを登録してみましょう。認証を行うコントローラーを作成します。ターミナルで以下のArtisanコマンドを実行してください。

php artisan make:controller AuthController

app/Http/Controllersフォルダーに新しくAuthController.phpファイルが作成されます。
ユーザー登録を行うルートを作成します。routes/api.phpファイルを開き、以下のコードを追加してください。

// routes/api.php
use App\Http\Controllers\AuthController;
 
Route::post('/register', [AuthController::class, 'register']);

ユーザー登録メソッドを作成します。AuthControllerを開き、以下のコードを追加してください。

// app/Http/Controllers/AuthController.php
use Illuminate\Support\Facades\Hash;
 
public function register(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|string|max:255',
                   'email' => 'required|string|email|max:255|unique:users',
                   'password' => 'required|string|min:8',
  ]);
 
      $user = User::create([
              'name' => $validatedData['name'],
                   'email' => $validatedData['email'],
                   'password' => Hash::make($validatedData['password']),
       ]);
 
$token = $user->createToken('auth_token')->plainTextToken;
 
return response()->json([
              'access_token' => $token,
                   'token_type' => 'Bearer',
]);
}

まず、着信リクエストを検証し、必要な変数がすべて含まれていることを確認します。次に受け取ったデータをデータベースに格納します。createToken()メソッドを使い、作成されたユーザーに新しい個人アクセストークンを生成します。トークンをauth_tokenと名付けます。createToken()によりLaravelのインスタンスが返されます。このインスタンスにplainTextTokenプロパティを呼び出し、トークンのプレーンテキスト値にアクセスします。最後に、作成されたトークンとトークンタイプを含むJSONレスポンスを返します。


続いて、ユーザーをログインページに戻すための実装を追加します。以下のコードをroutes/api.phpに追加してください。

// routes/api.php

Route::post('/login', [AuthController::class, 'login']);

そして、AuthControllerの中にlogin()メソッドを追加します。以下のコードを追加してください。

// app/Http/Controllers/AuthController.php
  
use App\Models\User;
use Illuminate\Support\Facades\Auth;
  
public function login(Request $request)
{
if (!Auth::attempt($request->only('email', 'password'))) {
return response()->json([
'message' => 'Invalid login details'
           ], 401);
       }
  
$user = User::where('email', $request['email'])->firstOrFail();
  
$token = $user->createToken('auth_token')->plainTextToken;
  
return response()->json([
           'access_token' => $token,
           'token_type' => 'Bearer',
]);
}

上記のコードにより、入力されたメールアドレスとパスワードが実際のusersテーブルと一致するかをチェックし、ユーザーの新しい個人アクセストークンを生成します。

最後に、現在認証されているユーザーをフェッチする機能を加えます。以下のコードをroutes/api.phpに追加してください。

// routes/api.php
  
Route::post('/me', [AuthController::class, 'me']);

そして、AuthControllerに次のコードを追加してください。

// app/Http/Controllers/AuthController.php
 
public function me(Request $request)
{
return $request->user();
}

このコードは非常にシンプルです。現在認証済みのユーザーを返します。

エンドポイントを認証済みユーザーのみに限定する

お考えのとおり、/meエンドポイントは認証済みのユーザーのみがアクセスできるようにしなければなりません。そのためにsanctum認証ガードが使えます。

次のようにルートを更新してください。

// routes/api.php
 
Route::post('/me', [AuthController::class, 'me'])->middleware('auth:sanctum');

これにより、このエンドポイントのリクエストのヘッダーに有効なAPIトークンが含まれるようになります。

APIをテストする前に、app/Providers/RouteServiceProvider.phpの以下のコメントを解除してください。

// app/Providers/RouteServiceProvider.php
 
protected $namespace = 'App\\Http\\Controllers';

APIをテストする

作成したAPIをテストしてみましょう。ここではInsomniaを使用しますが、お好きなHTTPクライアントを使用できます。
まず、アプリケーションの実行を確認します。ターミナルで以下のコマンドを実行してください。

php artisan serve

アプリケーションはhttp://127.0.0.1:8000で実行されます。APIにはhttp://127.0.0.1:8000/apiからアクセスします。

さらに次の例のように、Insomniaでリクエストができます。

新規ユーザーを作成する

新しいユーザーを作成するために、http://127.0.0.1:8001/api/register宛にnameemailpasswordを含むPOSTリクエストを作成します。パスワードは8文字以上必要です。

Insomnia 新規ユーザー作成

ユーザーとしてログインする

ログインには、emailpassword(プレーンテキスト)を追加し、http://127.0.0.1:8001/api/loginにPOSTリクエストを行います。

Insomnia ユーザーログイン

有効なトークンを使用して/meエンドポイントにアクセスしようとすると、以下のような結果になります。

有効なトークンを使用した場合のInsomnia画面

有効なトークンを使用しないと、以下のようにユーザー詳細が表示されます。

有効なトークンを使用しなかった場合のInsomnia画面

まとめ

このチュートリアルでは、Laravel Sanctumとその機能について紹介しました。Laravel Passportとの違いや、その用途も取り上げました。さらに、Laravel Sanctumを使用してユーザー情報にアクセスするために、トークンを作成して認証を行い、ユーザーにLaravel APIの使用を許可する方法を説明しました。

Laravel Sanctumについて詳しくは、公式ドキュメントを参照してください。

このチュートリアルの全ソースコードはGitHubで確認できます。

Chimezie Enyinnayaは、ソフトウェアエンジニア兼インストラクターです。Chimezie Enyinnayaについてもっと知りたい方は、以下の連絡先でご確認ください。

Webサイト: https://adonismastery.com

Twitter: https://twitter.com/ammezie

メール: meziemichael@gmail.com

GitHub: https://github.com/ammezie