Pernah nggak kamu bikin API yang bagus — endpoint-nya rapi, response-nya konsisten — tapi lupa mengamankannya? Seperti punya rumah mewah tapi pintu depannya dibiarkan terbuka 24 jam. Nah, di sinilah Autentikasi API Laravel Sanctum hadir sebagai solusi. Sanctum adalah package resmi Laravel yang dirancang khusus untuk mengautentikasi SPA (Single Page Application), aplikasi mobile, dan API berbasis token — tanpa kerumitan OAuth penuh seperti Passport.
Kalau kamu sudah mengikuti seri 50 Artikel Belajar Laravel sampai artikel ke-41 ini, berarti kamu sudah siap naik level. Kita sudah bahas API Resource di artikel sebelumnya — sekarang saatnya kita pastikan API itu hanya bisa diakses oleh yang berhak. Mari mulai!
Laravel Sanctum adalah package autentikasi ringan yang menyediakan sistem token API sederhana dan autentikasi session berbasis cookie untuk SPA — tanpa perlu OAuth server yang kompleks.
Sanctum = Passport yang sudah "diet" — tetap powerful, tapi jauh lebih simpel untuk kasus umum.
Apa Itu Laravel Sanctum dan Kenapa Bukan Passport?
Bayangkan kamu mau masuk ke gedung kantor. Ada dua pilihan sistem keamanan: yang pertama, kamu harus melewati metal detector, pemindai retina, verifikasi dua langkah, dan tanda tangan digital (itu Laravel Passport + OAuth). Yang kedua, kamu cukup tunjukkan kartu akses yang sudah terdaftar — masuk deh (itu Laravel Sanctum).
Sanctum cocok untuk kasus:
Laravel Sanctum sudah built-in di Laravel 8+ — kamu tidak perlu instalasi terpisah jika menggunakan versi terbaru. Di Laravel 11, Sanctum sudah menjadi bagian dari starter kit default!
Cara Install dan Konfigurasi Laravel Sanctum Step by Step
Oke, cukup teorinya. Sekarang kita langsung praktik. Berikut langkah-langkah lengkap untuk mengintegrasikan Autentikasi API Laravel Sanctum ke project kamu:
Install Package Sanctum
Untuk Laravel 10 ke bawah, jalankan perintah berikut di terminal:
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Tambahkan HasApiTokens pada Model User
Buka file app/Models/User.php dan tambahkan trait berikut:
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
// ... properti lainnya
}
Buat AuthController untuk Login & Register
Buat controller baru dan implementasikan method login yang menghasilkan token:
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (!Auth::attempt($request->only('email', 'password'))) {
return response()->json(['message' => 'Unauthorized'], 401);
}
$user = Auth::user();
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'token' => $token,
'token_type' => 'Bearer',
]);
}
Berikan nama yang deskriptif pada token saat memanggil createToken() — misalnya 'mobile-app-ios' atau 'web-dashboard'. Ini memudahkan manajemen token per perangkat dan debugging di masa depan.
Daftarkan Route API dengan Middleware Sanctum
Buka routes/api.php dan proteksi route yang membutuhkan autentikasi:
// Route publik (tidak perlu token)
Route::post('/login', [AuthController::class, 'login']);
Route::post('/register', [AuthController::class, 'register']);
// Route yang memerlukan autentikasi Sanctum
Route::middleware('auth:sanctum')->group(function() {
Route::get('/user', function(Request $request) {
return $request->user();
});
Route::post('/logout', [AuthController::class, 'logout']);
Route::apiResource('posts', PostController::class);
});
Implementasi Logout (Revoke Token)
Logout di Sanctum berarti menghapus token dari database — bukan sekadar session expire:
{
// Hapus token yang sedang digunakan
$request->user()->currentAccessToken()->delete();
// Atau hapus SEMUA token user (logout semua perangkat)
// $request->user()->tokens()->delete();
return response()->json(['message' => 'Logged out successfully']);
}
Pastikan APP_URL di file .env sudah diisi dengan benar. Untuk autentikasi SPA berbasis cookie, kamu juga perlu mengatur SANCTUM_STATEFUL_DOMAINS agar tidak terjadi CSRF error saat development.
Token Abilities: Kontrol Akses yang Lebih Granular dengan Sanctum
Salah satu fitur tersembunyi dari Autentikasi API Laravel Sanctum yang sering diabaikan adalah token abilities — semacam "izin khusus" yang bisa kamu lampirkan pada setiap token. Bayangkan ini seperti kunci multifungsi: satu kunci bisa hanya membuka ruang tamu, satu kunci lainnya bisa masuk ke semua ruangan.
$token = $user->createToken('mobile-token', ['post:read', 'post:create'])->plainTextToken;
// Di Controller, cek apakah token memiliki ability tertentu
if ($request->user()->tokenCan('post:delete')) {
// Hanya jalankan ini jika token punya izin delete
$post->delete();
}
💡 Dengan pendekatan ini, kamu bisa membuat token untuk read-only access bagi aplikasi pihak ketiga, sementara admin app mendapat token dengan full access. Ini prinsip Principle of Least Privilege yang sangat baik untuk keamanan.
Untuk menguji API yang sudah kamu buat, gunakan Postman atau Insomnia. Setelah login berhasil dan mendapat token, tambahkan header berikut di setiap request ke endpoint yang dilindungi:
Authorization: Bearer {token_kamu_di_sini}
Accept: application/json
Content-Type: application/json
Sanctum menyimpan token dalam bentuk hash SHA-256 di database, bukan plain text. Token yang dikembalikan ke user hanya muncul sekali saat pembuatan. Jika user lupa tokennya, satu-satunya solusi adalah buat token baru — ini adalah desain keamanan yang intentional.
Autentikasi API Laravel Sanctum: Cara Cek di Frontend (React/Vue)
Jika kamu membangun frontend dengan React atau Vue.js yang terpisah dari Laravel, cara paling simpel adalah menyimpan token di localStorage lalu kirim di setiap request. Berikut contoh dengan JavaScript fetch API:
const loginUser = async (email, password) => {
const response = await fetch('https://api.kamu.com/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
});
const data = await response.json();
localStorage.setItem('token', data.token); // Simpan token
};
// Request ke protected endpoint
const getPosts = async () => {
const token = localStorage.getItem('token');
const response = await fetch('/api/posts', {
headers: { 'Authorization': `Bearer ${token}` }
});
return response.json();
};
Untuk aplikasi yang lebih serius, pertimbangkan menyimpan token di httpOnly cookie daripada localStorage. Cookie yang httpOnly tidak bisa diakses JavaScript, sehingga terlindung dari serangan XSS. Di Laravel, ini bisa dilakukan dengan metode autentikasi SPA Sanctum menggunakan CSRF token + session cookie.
No comments:
Post a Comment