👋
Laravel Sanctumを使ったセッションベース認証
はじめに
こんにちは、ばななです。
前回記事に引き続き、Laravel Sanctumを利用したセッションベースの認証機能を実装します。
概要
- Sanctumを導入してLaravelプロジェクトにセッションベースの認証機能を実装する
- ubuntu × Laravel sail × Dockerの続き
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');
}
}
ホーム画面を表示するためのコントローラーです。
参考にしたサイト
最後に
ご指摘やアドバイスなどございましたら是非お願いします。
Discussion