【Laravel】JWT認証機能の実装

ヤマモト

2024.09.25

36

こんにちは、山本です。

今回はLaravel環境 でJWT認証について実装してみました。 

JWT認証とは

JWT (JSON Web Token) 認証とは、Webアプリケーションでユーザーの認証と承認を行うためのオープンスタンダードのこと。

以下がポイント。


①トークンベースの認証

JWTは、ユーザーがログインするときに生成されるトークンを使用する。

このトークンは、ユーザーの認証情報を含むJSON形式のデータ。


②セッション管理の代替

セッションベースの認証では、サーバーがユーザーのセッション情報を保持するが、JWTではクライアント側がトークンを保持する。

これにより、サーバーの負荷が軽減され、スケーラビリティが向上する。


③セキュリティ

JWTは署名されており、改ざんされていないことを保証する。署名には秘密鍵が使用され、サーバーだけがその秘密鍵を知っている。


実装手順

パッケージのインストール

任意のプロジェクトディレクトリに移動し、下記コマンドでJWT認証のパッケージをインストールする。


composer require tymon/jwt-auth



設定ファイル(config/jwt.php)を生成

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"



.envにJWTの秘密鍵を生成

php artisan jwt:secret



Guardの変更

config/auth.phpを下記のように書き換える。


'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],


Userモデルの設定

下記のようにUserモデルに追記する。


use Tymon\JWTAuth\Contracts\JWTSubject;


class User extends Authenticatable implements JWTSubject
{
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }


    public function getJWTCustomClaims()
    {
        return [];
    }
}


コントローラー作成

php artisan make:controller AuthController


<?php


namespace App\Http\Controllers;


use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
use App\Models\User;


class AuthController extends Controller
{
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');


        if (! $token = JWTAuth::attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }


        return response()->json([
            'message' => 'Login successful',
            'token' => $token
        ]);
    }


    public function register(Request $request)
    {
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ]);


        $token = JWTAuth::fromUser($user);


        return response()->json([
            'message' => 'Registration successful',
            'token' => $token
        ]);
    }
}


ルートの作成

routes/api.php を編集。


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


動作確認

登録

postmanを使用して確認する。


名前 : test1
メールアドレス : test1@example.com
パスワード : password


上記のユーザーを登録。




ログイン

登録したユーザーでログインを確認する。




この記事をシェアする