Menerapkan API Token Sanctum di Laravel untuk Autentikasi REST API
Dalam pengembangan REST API, autentikasi adalah komponen penting untuk memastikan hanya klien yang valid dapat mengakses endpoint tertentu. Laravel menyediakan beberapa mekanisme autentikasi API, salah satunya yang paling populer dan ringan adalah Laravel Sanctum.
Sanctum dirancang untuk mengelola token API personal, login SPA (Single Page Application), serta autentikasi mobile. Fleksibilitas dan kemudahan implementasinya menjadikan Sanctum pilihan favorit bagi backend modern yang membutuhkan sistem token tanpa kompleksitas OAuth.
Apa Itu Laravel Sanctum
Laravel Sanctum adalah paket resmi yang menyediakan sistem API Token berbasis Bearer Token. Sanctum mendukung tiga skenario utama:
- API Tokens untuk mobile/IoT/client eksternal
- SPA Authentication menggunakan cookie + session
- Personal Access Tokens untuk fitur user token (mirip GitHub token)
Dalam konteks REST API, kita fokus pada skenario API Tokens, yang memanfaatkan token unik per pengguna.
Instalasi Laravel Sanctum
Untuk menggunakan Sanctum, jalankan perintah berikut pada project Laravel Anda:
composer require laravel/sanctum
Lalu publish konfigurasi:
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Command tersebut akan menambahkan migrasi untuk tabel token.
Jalankan migrasi:
php artisan migrate
Pada langkah ini, tabel berikut akan dibuat:
personal_access_tokens
Tabel ini menyimpan token untuk setiap pengguna.
Konfigurasi Model User
Untuk menghasilkan token, model User harus menggunakan trait HasApiTokens.
Edit file:
app/Models/User.php
Tambahkan:
use LaravelSanctumHasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
Trait tersebut menyediakan method createToken() dan handler token lainnya.
Membuat Endpoint Login untuk Token
Pada API yang membutuhkan autentikasi token, diperlukan endpoint untuk menghasilkan token setelah login berhasil.
Contoh Controller:
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required'
]);
$user = AppModelsUser::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json(['message' => 'Credentials invalid'], 401);
}
$token = $user->createToken('api-token')->plainTextToken;
return response()->json([
'message' => 'Login successful',
'token' => $token
], 200);
}
Response JSON akan berisi token rahasia yang harus disimpan oleh client.
Mengirim Token pada Request
Client harus mengirim header Bearer Token:
Authorization: Bearer <token_yang_didapat>
Contoh request cURL:
curl -H "Authorization: Bearer eyJhbGci..." https://domain.com/api/user
Token kini menjadi identitas autentik pada setiap request.
Proteksi Route Menggunakan Middleware Sanctum
Untuk melindungi endpoint API, gunakan middleware auth:sanctum.
Contoh di file routes/api.php:
Route::middleware('auth:sanctum')->group(function () {
Route::get('/profile', function (Request $request) {
return $request->user();
});
});
Endpoint profile kini hanya dapat diakses jika token valid.
Logout dan Menghapus Token
Untuk logout API Token, kita cukup menghapus token milik user.
Contoh method logout:
public function logout(Request $request)
{
$request->user()->currentAccessToken()->delete();
return response()->json([
'message' => 'Logged out'
]);
}
Jika ingin menghapus semua token user:
$request->user()->tokens()->delete();
Hal ini sesuai untuk fungsi logout from all devices.
Membuat Token dengan Kemampuan (Abilities)
Sanctum mendukung konsep abilities (mirip dengan scope OAuth).
Contoh membuat token dengan akses terbatas:
$token = $user->createToken('admin-token', ['create', 'update'])->plainTextToken;
Memeriksa abilities di Controller:
if ($request->user()->tokenCan('update')) {
// allowed to update
}
Dengan abilities, API dapat menerapkan aturan granular pada level token.
Keamanan dalam Sanctum
Sanctum dianggap aman untuk API karena:
- Token di-hash dalam database (seperti password)
- Mendukung token satu pengguna multi-device
- Token dapat dicabut kapan saja
- Mendukung pembatasan abilities
- Tidak menggunakan session (stateless) dalam mode token
Pastikan client menyimpan token secara aman, misalnya:
- Mobile → Secure Storage
- Web → Local Storage/Cookie HTTP Only
Kesimpulan
Laravel Sanctum memberikan solusi autentikasi API token yang efisien, ringan, dan mudah diterapkan pada REST API modern. Dengan dukungan instalasi sederhana, middleware bawaan, dan fitur kemampuan token, Sanctum mampu melayani penggunaan dari aplikasi SPA, mobile, hingga IoT.
Dibanding sistem OAuth seperti Passport, Sanctum jauh lebih mudah diterapkan untuk proyek yang tidak memerlukan otorisasi tingkat tinggi. Dengan memadukan token, abilities, dan proteksi route, Sanctum dapat menjadi basis keamanan API yang terstruktur.
Baca Juga: Memahami Event Listener Laravel untuk Arsitektur Aplikasi yang Terstruktur