👋

Laravel Sanctumを使ったセッションベース認証

2024/10/04に公開

はじめに

こんにちは、ばななです。
前回記事に引き続き、Laravel Sanctumを利用したセッションベースの認証機能を実装します。

概要

Sanctumの導入と認証システム作成

<Sanctumのインストール>

Dockerシェル内に移動

./vendor/bin/sail shell

Dockerを起動したうえでDockerシェル内に移動

Sanctumのインストール

composer require laravel/sanctum

Sanctumのマイグレーションを公開

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

<Sanctumの設定>

Sanctumのミドルウェアを設定

// app/Http/Kernel.php

'api' => [
		'auth:sanctum',
		\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
		\Illuminate\Routing\Middleware\SubstituteBindings::class,
],

一番上の行に追加しています。
これで認証システムの設定は完了です。

ルーティング

// web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\HomeController;

// デフォルトルート:ログイン画面にリダイレクト
Route::get('/', function () {
    return redirect('/login');
});

// ログインページのルート
Route::get('/login', function () {
    return view('auth.login');
})->name('login');

// ログイン処理
Route::post('/login', [AuthController::class, 'login']);

// ログアウト処理
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');

// 認証が必要なルート
Route::middleware(['auth:sanctum'])->group(function () {

    // ダッシュボード(ホーム画面)
    Route::get('/home', [HomeController::class, 'index'])->name('home');
});

認証トークンが必要なページを個別に設定しています。
新たに認証が必要な画面を作った際には設定しましょう。

<画面の作成>

ログイン画面の作成

<!-- resources/views/auth/login.blade.php -->

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ログイン</title>
</head>
<body>
    <h1>ログイン</h1>
    <form method="POST" action="{{ route('login') }}">
        @csrf
        <div>
            <label for="email">メールアドレス</label>
            <input type="email" id="email" name="email" required>
        </div>
        <div>
            <label for="password">パスワード</label>
            <input type="password" id="password" name="password" required>
        </div>
        <button type="submit">ログイン</button>
    </form>
</body>
</html>

CSRF攻撃対策のため、CSRFトークンを付与しましょう。

ホーム画面の作成

<!-- resources/views/admin/home.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home</title>
</head>
<body>
    <h1>Welcome</h1>
    <form method="POST" action="{{ route('logout') }}">
        @csrf
        <button type="submit">ログアウト</button>
    </form>
</body>
</html>

<コントローラの作成>

AuthController

// app/Http/Controllers/AuthController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
		// ログイン処理
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            // 認証成功後、セッションを作成しホーム画面にリダイレクト
            return redirect()->intended('/home');
        }

        // 認証失敗時はログインページにリダイレクト
        return back()->withErrors([
            'email' => 'メールアドレスまたはパスワードが正しくありません。',
        ]);
    }

		// ログアウト処理
    public function logout(Request $request)
    {
        Auth::logout();
        // ログアウト後はログインページにリダイレクト
        return redirect('/login');
    }
}

AuthControllerを作成し上記のように認証ロジックを実装。

HomeController

// app/Http/Controllers/HomeController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    public function index()
    {
        // ホームビューを表示
        return view('admin.home');
    }
}

ホーム画面を表示するためのコントローラーです。

参考にしたサイト

https://readouble.com/laravel/10.x/ja/sanctum.html

最後に

ご指摘やアドバイスなどございましたら是非お願いします。

Discussion