LoginSignup
1
1

Laravel10でJWT認証を実装

Posted at

この記事は、既にLaravel10のプロジェクトが作成してあることを前提としています。

1. JWT認証のパッケージをインストール

任意のプロジェクトへ移動し、下記コマンドを入力してJWT認証のパッケージをインストールしてください。

composer require php-open-source-saver/jwt-auth

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

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

.env上にJWTの秘密鍵を生成します。

php artisan jwt:secret

2. Guardの変更

config/auth.phpを下記のように書き換えてください。

config/auth.php
// デフォルトのコメントは省略しています
return [

    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],

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

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_reset_tokens',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],

    'password_timeout' => 10800,
    
];

3. Userモデルに追記

下記を参考にUserモデルに追記してください。

Models/User.php
// 省略
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
use Laravel\Sanctum\HasApiTokens;

// JWTSubjectインターフェースの実装を忘れずに
class User extends Authenticatable implements JWTSubject
{
    use HasApiTokens, HasFactory, Notifiable;

    // 省略

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

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

4. コントローラーの作成

php artisan make:controller AuthController
Http/Controllers/AuthController.php
// 省略
use Illuminate\Support\Facades\Auth;
use App\Models\User;

class AuthController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login', 'register']]);
    }

    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|string|email',
            'password' => 'required|string',
        ]);
        $credentials = $request->only('email', 'password');
        $token = Auth::attempt($credentials);

        if (!$token) {
            return response()->json([
                'message' => '認証に失敗しました。',
            ], 401);
        }

        $user = Auth::user();
        return response()->json([
            'user' => $user,
            'authorization' => [
                'token' => $token,
                'type' => 'bearer',
            ]
        ]);
    }

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

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

        return response()->json([
            'message' => 'ユーザーの作成に成功しました!',
            'user' => $user
        ]);
    }

    public function logout()
    {
        Auth::logout();
        return response()->json([
            'message' => 'ログアウトしました。',
        ]);
    }

    public function refresh()
    {
        return response()->json([
            'user' => Auth::user(),
            'authorization' => [
                'token' => Auth::refresh(),
                'type' => 'bearer',
            ]
        ]);
    }
}

5. ルートの作成

routes/api.php
use App\Http\Controllers\AuthController;

Route::controller(AuthController::class)->group(function () {
    Route::post('login', 'login');
    Route::post('register', 'register');
    Route::post('logout', 'logout');
    Route::post('refresh', 'refresh');
});

6. Postmanで確認

ここまでできればJWT認証が実装できているはずです。APIを実行して見ましょう。ツールは何でも良いですが、ここではPostmanを使います。

  • ユーザー登録
http://127.0.0.1:8000/api/register

Postmanユーザー登録

  • ログイン
http://127.0.0.1:8000/api/login

Postmanログイン

  • トークン更新

※ヘッダーにBearerトークンを記載するのを忘れずに

http://127.0.0.1:8000/api/refresh

Postmanトークン更新

  • ログアウト

※ヘッダーに更新後のBearerトークンを記載するのを忘れずに

http://127.0.0.1:8000/api/logout

Postmanログアウト

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1