Chuyển đến nội dung chính

レッスン 9: 認証 — 聖域と強化

Laravel Sanctum (SPA 認証、API トークン)。 Fortify (登録、ログイン、メール認証、2FA)。パスワードのハッシュ化、覚えておいてください。カスタム ガード、マルチ認証。

💻 プログラミング — レッスン 9 レッスン 9: 認証 — 聖域と強化

Laravel: 基本から上級まで

パート 3: 認証と認可

xdev.asia

1. ララベルの聖域

composer require laravel/sanctum
php artisan install:api
// User model
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens;
}

// Login & issue token
public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    if (!Auth::attempt($credentials)) {
        throw ValidationException::withMessages([
            'email' => ['Thông tin đăng nhập không chính xác.'],
        ]);
    }

    $user = Auth::user();
    $token = $user->createToken('api', ['products:read', 'orders:write']);

    return response()->json([
        'token' => $token->plainTextToken,
        'user' => new UserResource($user),
    ]);
}

// Protect routes
Route::middleware('auth:sanctum')->group(function () {
    Route::apiResource('products', ProductController::class);
    Route::post('/logout', function (Request $request) {
        $request->user()->currentAccessToken()->delete();
        return response()->json(['message' => 'Logged out']);
    });
});

2. SPA認証

// config/sanctum.php
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost:3000')),

// config/cors.php
'supports_credentials' => true,

3. Laravel Fortify (2FA)

use Laravel\Fortify\Fortify;

// FortifyServiceProvider
Fortify::loginView(fn () => view('auth.login'));
Fortify::registerView(fn () => view('auth.register'));

// Enable 2FA
'features' => [
    Features::registration(),
    Features::emailVerification(),
    Features::twoFactorAuthentication(['confirm' => true]),
],

4. マルチ認証 (ガード)

// config/auth.php
'guards' => [
    'web' => ['driver' => 'session', 'provider' => 'users'],
    'admin' => ['driver' => 'session', 'provider' => 'admins'],
],
'providers' => [
    'users' => ['driver' => 'eloquent', 'model' => User::class],
    'admins' => ['driver' => 'eloquent', 'model' => Admin::class],
],

// Route
Route::middleware('auth:admin')->prefix('admin')->group(function () {
    Route::get('/dashboard', [AdminController::class, 'dashboard']);
});

次の記事: 認可 — ゲートとポリシー。