
Laravel Sanctum: Khi Vệ Sĩ Tí Hon Gánh Vác Trọng Trách Khổng Lồ
Chào các bạn, lại là Creyt đây! Trong thế giới lập trình đầy rẫy những 'anh hùng' bảo vệ dữ liệu, hôm nay chúng ta sẽ diện kiến một 'vệ sĩ' đặc biệt của Laravel: Sanctum. Không ồn ào, không phô trương như Passport – khẩu đại bác hạng nặng cho OAuth2, Sanctum là một con dao Thụy Sĩ tinh gọn, chuyên trị những tác vụ chứng thực API "tại gia" một cách hiệu quả đến kinh ngạc.
Sanctum là gì và để làm gì?
Hãy hình dung thế này: Bạn có một ngôi nhà đẹp (backend Laravel) và bạn muốn xây thêm một căn phòng khách hiện đại (Single Page Application - SPA) hoặc một căn bếp tiện nghi (Mobile App), thậm chí là một cái chòi nhỏ để hàng xóm qua lấy đồ (API từ bên thứ ba đơn giản). Bạn cần một chìa khóa để ra vào những khu vực này mà không phải làm lại toàn bộ hệ thống khóa cửa chính. Đó chính là lúc Sanctum ra tay.
Sanctum cung cấp hai cơ chế chứng thực chính:
- SPA Authentication (Chứng thực cho Ứng dụng Một Trang): Cho phép SPA của bạn (chạy trên một miền phụ hoặc miền khác) giao tiếp với backend Laravel bằng cách sử dụng cơ chế session/cookie của Laravel, nhưng vẫn được bảo vệ bởi CSRF. Đây là một sự kết hợp ngọt ngào giữa sự tiện lợi của session và sự linh hoạt của API.
- API Token Authentication (Chứng thực bằng Token API): Cung cấp một cách cực kỳ đơn giản để cấp các "chìa khóa" (API tokens) cho mobile apps, các ứng dụng khác, hoặc thậm chí là chính bạn để tương tác với API của bạn. Mỗi chìa khóa này có thể được cấp các "quyền hạn" (abilities/scopes) cụ thể, như "chỉ được đọc", "được tạo", "được xóa", v.v.
Nói tóm lại, Sanctum sinh ra để giải quyết nhu cầu chứng thực cho first-party applications – những ứng dụng mà bạn kiểm soát hoàn toàn hoặc có mối quan hệ chặt chẽ với backend Laravel của bạn. Nó nhẹ, dễ triển khai và đủ mạnh mẽ cho hầu hết các trường hợp sử dụng phổ biến.
Code Ví Dụ Minh Hoạ: Bắt Tay Vào "Khóa Cửa" Bằng Sanctum
Đừng lý thuyết suông! Chúng ta cùng đi vào thực chiến để thấy Sanctum hoạt động như thế nào.
Bước 1: Cài Đặt Sanctum
Đầu tiên, bạn cần mời "vệ sĩ" Sanctum về nhà:
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Lệnh migrate sẽ tạo bảng personal_access_tokens trong database của bạn, nơi lưu trữ các "chìa khóa" (tokens) mà Sanctum sẽ phát hành.
Bước 2: Cấu Hình Cho SPA (Nếu bạn dùng SPA)
Nếu bạn đang xây dựng một SPA, bạn cần cấu hình một chút để Laravel và SPA "bắt tay" được với nhau. Mở file config/sanctum.php và thêm domain của SPA vào mảng stateful:

// config/sanctum.php
'stateful' => [
'localhost', 'localhost:3000', '127.0.0.1', '127.0.0.1:8000', '::1',
// Thêm domain của SPA của bạn vào đây
'your-spa-domain.com',
'sub.your-spa-domain.com'
],
Trên phía frontend (ví dụ với Axios trong JavaScript), bạn cần đảm bảo rằng các request gửi kèm cookie và gọi endpoint để lấy CSRF token:
// Ví dụ với Axios trong ứng dụng SPA của bạn
import axios from 'axios';
axios.defaults.withCredentials = true; // Rất quan trọng để gửi kèm cookie
axios.defaults.baseURL = 'http://localhost:8000'; // Hoặc URL API của bạn
// Lấy CSRF cookie trước khi gửi các request POST/PUT/DELETE
axios.get('/sanctum/csrf-cookie').then(response => {
// Sau khi lấy được cookie, bạn có thể thực hiện đăng nhập
axios.post('/login', {
email: 'test@example.com',
password: 'password'
}).then(response => {
console.log('Đăng nhập thành công!', response.data);
}).catch(error => {
console.error('Lỗi đăng nhập:', error);
});
});
Bước 3: Tạo Personal Access Tokens (Cho Mobile/Ứng dụng khác)
Đây là cách bạn phát hành "chìa khóa" cho các ứng dụng khác. Trong User model của bạn, hãy thêm trait HasApiTokens:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens; // <-- Thêm dòng này
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
// ... (các thuộc tính khác của User model)
}
Giờ, bạn có thể tạo một endpoint API để người dùng đăng nhập và nhận về token của họ:
// routes/api.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
Route::post('/tokens/create', function (Request $request) {
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
return response()->json(['message' => 'Thông tin đăng nhập không hợp lệ.'], 401);
}
// Tạo token với các quyền hạn (abilities) cụ thể
$token = $user->createToken($request->device_name, ['server:update', 'user:read'])->plainTextToken;
return response()->json(['token' => $token]);
});
// Ví dụ về cách bảo vệ route bằng Sanctum
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware(['auth:sanctum', 'ability:server:update'])->post('/servers/{id}', function (Request $request, $id) {
// Logic để update server, chỉ những token có ability 'server:update' mới được phép
return response()->json(['message' => "Server {$id} updated."]);
});
Khi client nhận được token, họ sẽ gửi nó trong header Authorization với prefix Bearer:
Authorization: Bearer <YOUR_GENERATED_TOKEN>
Bước 4: Bảo Vệ Các Route Của Bạn
Để bảo vệ các route, bạn chỉ cần sử dụng middleware auth:sanctum. Sanctum sẽ tự động kiểm tra xem có session hợp lệ (cho SPA) hay token hợp lệ (cho API client) hay không.
// routes/api.php
Route::middleware('auth:sanctum')->group(function () {
Route::get('/profile', function (Request $request) {
return $request->user();
});
Route::post('/posts', function (Request $request) {
// Tạo bài viết mới
});
});
Mẹo Vặt Từ Giảng Viên Creyt (Best Practices)
- Quản lý Quyền Hạn (Abilities/Scopes) Nghiêm ngặt: Đừng bao giờ cấp token full quyền nếu không thật sự cần thiết. Hãy nghĩ kỹ xem mỗi token cần làm gì và chỉ cấp những quyền hạn đó. Đây là nguyên tắc "ít đặc quyền nhất" (least privilege) kinh điển.
- Lưu trữ Token An Toàn: Hướng dẫn client của bạn (mobile app, desktop app) lưu trữ token một cách bảo mật. Tuyệt đối không lưu vào Local Storage của trình duyệt nếu đó là token cho dữ liệu nhạy cảm, vì nó dễ bị tấn công XSS. Hãy cân nhắc
HttpOnlycookies hoặc bộ nhớ an toàn của thiết bị. - Thu Hồi Token Định Kỳ hoặc Khi Cần: Cung cấp cơ chế cho phép người dùng thu hồi (revoke) các token của họ (ví dụ: khi thiết bị bị mất hoặc không còn sử dụng).
auth()->user()->tokens()->delete()hoặcauth()->user()->tokens()->where('id', $tokenId)->delete();. - Sử dụng CSRF Cookie cho SPA: Đừng quên gọi endpoint
/sanctum/csrf-cookietrước khi thực hiện các request cần bảo vệ CSRF trên SPA. Điều này đảm bảo tính toàn vẹn của ứng dụng. - Giới Hạn Tốc Độ (Rate Limiting): Luôn áp dụng rate limiting cho các endpoint API của bạn để ngăn chặn các cuộc tấn công Brute Force hoặc DDoS nhỏ. Laravel có sẵn middleware
throttlerất mạnh mẽ. - Token Expiration (Tự động hết hạn): Mặc định, Sanctum token không hết hạn. Bạn có thể tự triển khai cơ chế hết hạn bằng cách thêm cột
expires_atvào bảngpersonal_access_tokensvà kiểm tra thủ công, hoặc dùng một số package mở rộng. Tuy nhiên, vớifirst-party applications, việc quản lý này thường ít khắt khe hơn OAuth2.
Ứng Dụng Thực Tế: Sanctum "Làm Gì" Ngoài Đời
Sanctum không phải là "đồ chơi" để học cho vui, nó đang được ứng dụng rộng rãi trong rất nhiều sản phẩm thực tế:
- Các Ứng Dụng SaaS (Software as a Service) với Frontend JavaScript: Imagine một nền tảng quản lý dự án (như Trello, Asana) được xây dựng với Laravel backend và React/Vue/Angular frontend. Sanctum là lựa chọn hoàn hảo để chứng thực SPA với backend, đảm bảo người dùng có trải nghiệm mượt mà mà vẫn bảo mật.
- Mobile Apps: Một ứng dụng di động cho phép người dùng quản lý hồ sơ cá nhân, đặt hàng, hoặc truy cập nội dung độc quyền từ backend Laravel. Sanctum cung cấp các API token để app giao tiếp an toàn.
- Headless CMS: Bạn có một hệ thống quản lý nội dung (CMS) mạnh mẽ được xây dựng bằng Laravel, nhưng bạn muốn hiển thị nội dung đó trên nhiều kênh khác nhau (website, mobile, smart TV). Sanctum giúp bạn bảo vệ các API cung cấp nội dung này.
- Internal Microservices: Trong một kiến trúc microservices nhỏ, nơi các dịch vụ nội bộ cần giao tiếp với nhau. Sanctum có thể cung cấp các token đơn giản để các dịch vụ này xác thực lẫn nhau mà không cần đến sự phức tạp của OAuth2.
Sanctum là minh chứng cho triết lý "đơn giản mà hiệu quả" của Laravel. Nó không cố gắng giải quyết mọi vấn đề chứng thực API trên đời, mà tập trung vào việc làm tốt nhất những gì nó được thiết kế: cung cấp một giải pháp chứng thực API nhẹ nhàng, mạnh mẽ và an toàn cho các ứng dụng "tại gia". Hãy làm chủ nó, và bạn sẽ có thêm một công cụ cực kỳ đắc lực trong bộ đồ nghề của mình!
Thuộc Series: Lavarel
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!