iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
Modern Web

Laravel 30天速成筆記系列 第 16

【Day16】API 驗證與 Laravel Sanctum

  • 分享至 

  • xImage
  •  

今天要進入 API 驗證,並使用 Laravel Sanctum 來保護 API
Sanctum 是 Laravel 官方提供的輕量級 API Token 驗證方案,特別適合 SPA(Single Page Application)和行動裝置 App


為什麼需要 API 驗證?

在 API 專案中,如果沒有驗證機制,任何人都可以隨意請求 API,可能導致:

  • 資料外洩
  • 惡意攻擊
  • 未授權操作

因此,我們需要確保:

  1. 使用者必須登入 才能訪問特定 API
  2. 每次請求都要驗證身份

安裝與設定 Laravel Sanctum

在 Laravel 中安裝 Sanctum:

composer require laravel/sanctum

發佈設定檔與 Migration:

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

app/Http/Kernel.php 中的 api middleware 群組加上:

\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,

config/sanctum.php 中可設定 token 過期時間等參數。


建立使用者登入 API

假設我們已經有 users 資料表和 User 模型。

註冊 API

Route::post('/register', function (Request $request) {
    $request->validate([
        'name' => 'required',
        'email' => 'required|email|unique:users',
        'password' => 'required|min:6'
    ]);

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

    return response()->json(['message' => '註冊成功'], 201);
});

登入 API(取得 Token)

Route::post('/login', function (Request $request) {
    $request->validate([
        'email' => 'required|email',
        'password' => 'required'
    ]);

    $user = App\Models\User::where('email', $request->email)->first();

    if (! $user || ! Hash::check($request->password, $user->password)) {
        return response()->json(['message' => '帳號或密碼錯誤'], 401);
    }

    $token = $user->createToken('api-token')->plainTextToken;

    return response()->json(['token' => $token]);
});

保護 API 路由

routes/api.php

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

呼叫 API 時,需要在 Header 加入:

Authorization: Bearer {token}

登出(刪除 Token)

Route::post('/logout', function (Request $request) {
    $request->user()->tokens()->delete();
    return response()->json(['message' => '已登出']);
})->middleware('auth:sanctum');

小結

  • Sanctum 適合輕量 API 驗證
  • 登入成功後會產生 Token,之後每次請求都必須附上
  • auth:sanctum middleware 保護需要驗證的 API
  • Token 可隨時刪除(登出)

如果需要更複雜的 OAuth2 驗證,可以考慮 Laravel Passport,但對於一般專案,Sanctum 足夠且更簡單


上一篇
【Day 15】Laravel API 入門與 Resource
系列文
Laravel 30天速成筆記16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言