Panduan Lengkap Laravel Sanctum
Sistem Autentikasi API, Mobile Apps, dan SPA pada Framework Laravel
Dalam pengembangan aplikasi web modern, pemisahan antara arsitektur backend dan frontend telah menjadi standar industri yang sangat populer. Pola pengembangan seperti *Single Page Applications* (SPA) menggunakan React, Vue.js, atau Angular, serta aplikasi mobile (Android & iOS) menuntut adanya mekanisme pertukaran data yang cepat, ringan, dan aman. Framework Laravel menjawab tantangan ini dengan menyediakan komponen autentikasi bawaan yang tangguh, salah satunya adalah Laravel Sanctum.
Laravel Sanctum memberikan solusi sistem autentikasi kelas ringan untuk SPA, aplikasi seluler, dan API berbasis token sederhana. Tidak seperti sistem autentikasi tradisional yang sangat bergantung pada *session* dan *cookies* stateful, Sanctum memanfaatkan teknologi *Personal Access Tokens*. Setiap platform klien yang melakukan *request* akan divalidasi melalui string token unik terenkripsi. Keunggulan utama dari pendekatan token-based ini adalah fleksibilitasnya, di mana token dapat dengan mudah dicabut (*revoked*), dibatasi masa aktifnya, atau dikelola secara mandiri oleh pengguna dari berbagai perangkat yang berbeda.
1. Instalasi dan Konfigurasi Awal
Jalankan perintah Composer berikut di dalam direktori proyek Laravel Anda untuk memasang paket Sanctum:
composer require laravel/sanctum
Setelah paket terpasang, rilis berkas konfigurasi bawaan dan jalankan migrasi database untuk membuat tabel penyimpanan token:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Mengonfigurasi Model User
Tambahkan trait HasApiTokens ke dalam file model User Anda agar dapat memanggil fungsi pembuatan token:
// app/Models/User.php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
// ... properti lainnya
}
Membuat Auth Controller
Gunakan perintah berikut untuk men-generate AuthController untuk API:
php artisan make:controller API/AuthController --api
Isi app/Http/Controllers/API/AuthController.php dengan logika register, login, dan logout berikut:
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\JsonResponse;
class AuthController extends Controller
{
public function register(Request $request): JsonResponse
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'success' => true,
'user' => $user,
'token' => $token,
'token_type' => 'Bearer',
], 201);
}
public function login(Request $request): JsonResponse
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required|string',
]);
if (!Auth::attempt($credentials)) {
return response()->json(['success' => false, 'message' => 'Invalid credentials'], 401);
}
$user = Auth::user();
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'success' => true,
'token' => $token,
'token_type' => 'Bearer',
]);
}
public function logout(Request $request): JsonResponse
{
$request->user()->currentAccessToken()->delete();
return response()->json(['success' => true, 'message' => 'Successfully logged out']);
}
}
2. Proteksi Route API
Buka file routes/api.php untuk mendaftarkan endpoint publik dan membungkus endpoint privat menggunakan middleware auth:sanctum:
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\API\AuthController;
// Public Routes
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
// Protected Routes
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout']);
Route::get('user', function (Request $request) {
return $request->user();
});
});
3. Implementasi Sisi Klien
Untuk berinteraksi dengan API terproteksi Sanctum, simpan token hasil login ke dalam storage aplikasi klien, lalu sematkan sebagai **Bearer Token** pada Header HTTP setiap kali melakukan request.
Contoh Request dengan JavaScript Fetch API:
const getProfile = async () => {
const token = localStorage.getItem('auth_token');
const response = await fetch('/api/user', {
headers: {
'Authorization': `Bearer ${token}`,
'Accept': 'application/json',
},
});
return response.json();
};
Best Practices Keamanan API Token
Pastikan Anda mengikuti standarisasi industri berikut saat memproduksi API secara publik:
- Wajib HTTPS: Selalu paksa endpoint API berjalan di atas SSL/TLS guna mencegah pencurian token lewat metode sniffing jaringan.
- Abilities Control: Manfaatkan fitur Token Abilities Sanctum untuk membatasi hak akses fungsionalitas token secara spesifik berdasarkan tipe perangkat.
- Token Expiration: Atur masa kedaluwarsa token pada berkas konfigurasi secara berkala guna meminimalkan penyalahgunaan token yang telah usang.