Laravel Sanctumを使ってREST API認証をシンプルに実装する方法

実装・応用テクニック

Laravel Sanctumは、シンプルで軽量なAPIトークン認証を実現するためのパッケージで、シングルページアプリケーション(SPA)やシンプルなAPI認証用に設計されています。今回は、Laravel Sanctumを使ってREST API認証をシンプルに実装する方法を紹介します。

Laravel Sanctumのインストールとセットアップ

まず、LaravelプロジェクトにSanctumをインストールします。Composerを使用して、以下のコマンドを実行してください。

composer require laravel/sanctum

次に、Sanctumのマイグレーションと設定ファイルを公開します。

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

SanctumServiceProviderconfig/app.phpproviders配列に追加する必要はなく、Laravelでは自動的にプロバイダーが登録されます。

Middlewareの設定

Sanctumを無効化するか有効化するため、apiミドルウェアグループ内にSanctumのミドルウェアを設定します。app/Http/Kernel.phpを開き、以下のように追加します。

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

Userモデルの準備

Sanctumの認証システムを使用するには、認証対象のUserモデルにHasApiTokensトレイトを追加する必要があります。App\Models\User.phpを開き、次のように追加します。

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

APIルートの定義

routes/api.phpファイルでAPIルートを定義します。サインアップ、ログイン、ログアウト、そしてユーザー情報を取得するためのルートを作成しましょう。

use App\Http\Controllers\Api\AuthController;

Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::post('/logout', [AuthController::class, 'logout']);
Route::get('/user', [AuthController::class, 'user'])->middleware('auth:sanctum');

コントローラクラスの作成

次に、AuthControllerを作成します。

php artisan make:controller Api/AuthController

コントローラでは、ユーザーの登録、ログイン、ログアウト、ユーザー情報取得の処理を定義します。

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8',
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        return response()->json($user, 201);
    }

    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|string|email',
            'password' => 'required|string',
        ]);

        $user = User::where('email', $request->email)->first();

        if (!$user || !Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['The provided credentials are incorrect.'],
            ]);
        }

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json(['access_token' => $token, 'token_type' => 'Bearer']);
    }

    public function logout(Request $request)
    {
        $request->user()->tokens()->delete();

        return response()->json('Logged out successfully');
    }

    public function user(Request $request)
    {
        return response()->json($request->user());
    }
}

認証のテスト

最後に、PostmanなどのAPIクライアントを使用してAPIエンドポイントをテストします。以下の手順に従って、API認証機能が正しく動作しているか確認します。

  1. ユーザー登録: /api/registerエンドポイントにPOSTリクエストを送信し、ユーザーを登録します。

  2. ログイン: 登録したユーザーの資格情報を使用して、/api/loginにPOSTリクエストを送信し、トークンを取得します。

  3. ユーザー情報の取得: 取得したトークンをAuthorization headerにセットして、/api/userにGETリクエストを送信します。

  4. ログアウト: /api/logoutにPOSTリクエストを送り、トークンの取り消しをテストします。

これで、Laravel Sanctumを使ったシンプルなREST API認証の実装が完了しました。この認証方法はSPAやモバイルアプリに最適で、安全かつ簡単にユーザーデータを保護することができます。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント