今天要進入 API 驗證,並使用 Laravel Sanctum 來保護 API
Sanctum 是 Laravel 官方提供的輕量級 API Token 驗證方案,特別適合 SPA(Single Page Application)和行動裝置 App
在 API 專案中,如果沒有驗證機制,任何人都可以隨意請求 API,可能導致:
因此,我們需要確保:
在 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 過期時間等參數。
假設我們已經有 users
資料表和 User 模型。
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);
});
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]);
});
在 routes/api.php
:
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
呼叫 API 時,需要在 Header 加入:
Authorization: Bearer {token}
Route::post('/logout', function (Request $request) {
$request->user()->tokens()->delete();
return response()->json(['message' => '已登出']);
})->middleware('auth:sanctum');
auth:sanctum
middleware 保護需要驗證的 API如果需要更複雜的 OAuth2 驗證,可以考慮 Laravel Passport,但對於一般專案,Sanctum 足夠且更簡單