Halo para developer Laravel! Pernahkah kalian merasa kesulitan mengamankan API dengan cara yang sederhana namun efektif? Nah, artikel ini hadir untuk menjawab masalah tersebut! Kita akan membahas tuntas tentang Laravel Sanctum Authentication Tutorial: Otentikasi API Sederhana. Sanctum adalah package Laravel yang ringan dan mudah digunakan untuk otentikasi API, terutama bagi aplikasi single-page (SPA), aplikasi mobile, dan API yang sederhana.
Dalam tutorial ini, kita akan menjelajahi langkah-langkah implementasi Sanctum secara mendalam, mulai dari instalasi, konfigurasi, hingga penggunaan praktis dalam aplikasi Laravel Anda. Jadi, siapkan secangkir kopi, dan mari kita mulai!
1. Mengapa Memilih Laravel Sanctum untuk Otentikasi API?
Sebelum kita masuk ke implementasi, mari kita pahami dulu mengapa Sanctum menjadi pilihan populer untuk otentikasi API. Ada beberapa keuntungan utama yang ditawarkan:
- Ringan dan Mudah Digunakan: Sanctum dirancang dengan sederhana. Konfigurasinya minimal, sehingga cocok untuk proyek-proyek kecil hingga menengah.
- Otentikasi Berbasis Token: Sanctum menggunakan token API untuk autentikasi. Token ini dapat dengan mudah dicabut, memberikan kontrol yang lebih baik atas keamanan aplikasi Anda.
- CSRF Protection: Sanctum menyediakan perlindungan CSRF (Cross-Site Request Forgery) untuk aplikasi SPA, mencegah serangan dari situs web jahat.
- Cocok untuk SPA, Mobile App, dan API Sederhana: Sanctum sangat ideal untuk aplikasi single-page (React, Vue, Angular), aplikasi mobile (React Native, Flutter), atau API yang tidak memerlukan fitur otentikasi yang terlalu kompleks.
- Maintainable: Dikembangkan dan dipelihara oleh tim Laravel, yang berarti mendapatkan update keamanan dan fitur terbaru secara berkala.
Dibandingkan dengan Passport yang lebih kompleks dan berat, Sanctum menawarkan solusi yang lebih ringan dan cepat untuk kebutuhan otentikasi API yang sederhana. Inilah alasan utama mengapa banyak developer memilih Laravel Sanctum Authentication Tutorial: Otentikasi API Sederhana ini sebagai panduan.
2. Persiapan Awal: Instalasi dan Konfigurasi Laravel Sanctum
Langkah pertama dalam Laravel Sanctum Authentication Tutorial: Otentikasi API Sederhana adalah instalasi dan konfigurasi. Pastikan Anda sudah memiliki proyek Laravel yang berjalan sebelum melanjutkan. Jika belum, buat proyek Laravel baru terlebih dahulu.
Instalasi Laravel Sanctum:
Buka terminal Anda dan jalankan perintah berikut di direktori proyek Laravel Anda:
composer require laravel/sanctum
Perintah ini akan mengunduh dan menginstal Sanctum ke dalam proyek Anda.
Migrasi Database:
Setelah instalasi selesai, jalankan migrasi database untuk membuat tabel yang dibutuhkan oleh Sanctum:
php artisan migrate
Perintah ini akan membuat tabel personal_access_tokens yang digunakan untuk menyimpan token API.
Konfigurasi Model User:
Buka model User Anda (biasanya terletak di app/Models/User.php) dan tambahkan trait HasApiTokens ke dalam model tersebut:
<?php
namespace AppModels;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use LaravelSanctumHasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
// ... (kode lainnya)
}
Pastikan Anda sudah mengimport HasApiTokens dari namespace LaravelSanctumHasApiTokens.
Konfigurasi config/sanctum.php (Opsional):
Secara default, Sanctum sudah memiliki konfigurasi yang cukup baik. Namun, Anda bisa menyesuaikannya jika diperlukan. Beberapa konfigurasi yang mungkin perlu Anda perhatikan:
stateful: Daftar domain yang dianggap stateful (biasanya digunakan untuk SPA).expiration: Lama token API berlaku.
Anda dapat mempublikasikan file konfigurasi Sanctum dengan menjalankan perintah berikut:
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Setelah itu, Anda dapat menemukan file konfigurasi di config/sanctum.php.
3. Membuat Endpoint Register dan Login dengan Sanctum
Setelah konfigurasi selesai, mari kita buat endpoint register dan login yang akan menghasilkan token API menggunakan Sanctum.
Endpoint Register:
Buat controller baru untuk menangani pendaftaran pengguna (misalnya, AuthController):
php artisan make:controller AuthController
Buka app/Http/Controllers/AuthController.php dan tambahkan method register berikut:
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesHash;
use IlluminateSupportFacadesValidator;
class AuthController extends Controller
{
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8'
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 400);
}
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password)
]);
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
]);
}
}
Endpoint Login:
Tambahkan juga method login ke AuthController:
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|string|email|max:255',
'password' => 'required|string|min:8'
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 400);
}
$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json([
'message' => 'Invalid credentials'
], 401);
}
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
]);
}
Definisikan Routes:
Buka routes/api.php dan definisikan routes untuk kedua endpoint ini:
<?php
use AppHttpControllersAuthController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesRoute;
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Perhatikan middleware auth:sanctum yang akan kita bahas lebih lanjut nanti.
4. Melindungi Routes dengan Middleware auth:sanctum
Setelah kita mendapatkan token API, bagaimana cara melindungi routes agar hanya bisa diakses oleh pengguna yang terotentikasi? Di sinilah peran penting middleware auth:sanctum.
Middleware auth:sanctum akan memvalidasi token API yang dikirimkan dalam header Authorization. Jika token valid, maka request akan diteruskan ke controller. Jika tidak valid, maka akan dikembalikan response error 401 (Unauthorized).
Pada contoh di atas, kita sudah menggunakan middleware auth:sanctum untuk melindungi route /user:
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Artinya, hanya pengguna yang sudah login dan memiliki token API valid yang bisa mengakses route ini dan mendapatkan informasi user.
Contoh Penggunaan di Controller:
Anda juga bisa menggunakan middleware di dalam controller. Misalnya:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class UserController extends Controller
{
public function __construct()
{
$this->middleware('auth:sanctum');
}
public function index()
{
// Hanya bisa diakses oleh pengguna yang terotentikasi
return response()->json(auth()->user());
}
}
Pada contoh ini, method index di controller UserController hanya bisa diakses oleh pengguna yang terotentikasi.
5. Menguji Otentikasi API dengan Token
Sekarang, mari kita uji endpoint yang sudah kita buat menggunakan aplikasi seperti Postman atau Insomnia.
Register Pengguna:
Kirim request POST ke endpoint /api/register dengan data berikut:
{
"name": "John Doe",
"email": "[email protected]",
"password": "password123"
}
Jika berhasil, Anda akan mendapatkan response JSON yang berisi access_token dan token_type.
Login Pengguna:
Kirim request POST ke endpoint /api/login dengan data berikut:
{
"email": "[email protected]",
"password": "password123"
}
Anda juga akan mendapatkan response JSON yang berisi access_token dan token_type.
Akses Route yang Dilindungi:
Untuk mengakses route yang dilindungi (misalnya, /api/user), tambahkan header Authorization ke dalam request Anda. Nilai header Authorization harus berupa Bearer <access_token>, di mana <access_token> adalah token yang Anda dapatkan dari proses register atau login.
Jika token valid, Anda akan mendapatkan response JSON yang berisi informasi user. Jika tidak valid, Anda akan mendapatkan response error 401.
6. Customizing Token Expiration dan Abilities
Sanctum memungkinkan Anda untuk mengatur masa berlaku token dan memberikan kemampuan (abilities) tertentu pada token tersebut.
Token Expiration:
Anda bisa mengatur masa berlaku token dengan mengubah konfigurasi expiration di config/sanctum.php. Secara default, token tidak memiliki masa berlaku. Anda bisa mengatur masa berlakunya dalam menit.
Selain itu, Anda juga bisa mengatur masa berlaku token saat membuat token dengan menggunakan method expireAt:
$token = $user->createToken('auth_token')->plainTextToken;
// Token berlaku selama 1 jam
$token = $user->createToken('auth_token')->expiresAt(now()->addHours(1))->plainTextToken;
Token Abilities:
Token abilities memungkinkan Anda untuk memberikan kemampuan (permissions) tertentu pada token. Misalnya, Anda bisa membuat token yang hanya bisa digunakan untuk membaca data, atau token yang bisa digunakan untuk membaca dan menulis data.
Untuk menggunakan token abilities, Anda perlu mendefinisikannya saat membuat token:
$token = $user->createToken('auth_token', ['server:update'])->plainTextToken;
Pada contoh ini, token memiliki kemampuan server:update. Kemudian, Anda bisa menggunakan middleware ability untuk melindungi routes:
Route::middleware(['auth:sanctum', 'ability:server:update'])->post('/servers/{server}', function (Request $request, Server $server) {
// Update the server...
});
Route ini hanya bisa diakses oleh token yang memiliki kemampuan server:update.
7. Revoking Token: Logout dan Pencabutan Token Tertentu
Logout:
Untuk logout, Anda perlu mencabut token yang sedang digunakan. Anda bisa melakukannya dengan menggunakan method currentAccessToken()->delete():
Route::middleware('auth:sanctum')->post('/logout', function (Request $request) {
$request->user()->currentAccessToken()->delete();
return response()->json([
'message' => 'Successfully logged out'
]);
});
Mencabut Token Tertentu:
Anda juga bisa mencabut token tertentu dengan menggunakan method tokens()->where('id', $tokenId)->delete():
Route::middleware('auth:sanctum')->post('/revoke/{tokenId}', function (Request $request, $tokenId) {
$request->user()->tokens()->where('id', $tokenId)->delete();
return response()->json([
'message' => 'Token revoked'
]);
});
8. Integrasi Laravel Sanctum dengan SPA (Single-Page Application)
Salah satu kekuatan utama Sanctum adalah kemampuannya untuk berintegrasi dengan SPA (Single-Page Application) seperti React, Vue, atau Angular.
CSRF Protection:
Sanctum menyediakan perlindungan CSRF (Cross-Site Request Forgery) untuk SPA. Anda perlu memastikan bahwa SPA Anda mengirimkan header X-CSRF-TOKEN dengan setiap request. Token CSRF ini biasanya disimpan di cookie setelah login.
Konfigurasi stateful:
Pastikan Anda sudah menambahkan domain SPA Anda ke dalam konfigurasi stateful di config/sanctum.php.
Contoh Implementasi dengan Axios (JavaScript):
import axios from 'axios';
axios.defaults.baseURL = 'http://localhost:8000/api';
axios.defaults.withCredentials = true; // Penting untuk mengirimkan cookie
// Register
axios.post('/register', {
name: 'John Doe',
email: '[email protected]',
password: 'password123'
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
// Login
axios.post('/login', {
email: '[email protected]',
password: 'password123'
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
// Akses Route yang Dilindungi
axios.get('/user')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
// Logout
axios.post('/logout')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
Perhatikan axios.defaults.withCredentials = true; yang penting untuk mengirimkan cookie (termasuk token CSRF) ke server.
9. Keamanan Tambahan: Tips dan Praktik Terbaik dengan Sanctum
Selain implementasi dasar, ada beberapa tips dan praktik terbaik yang perlu Anda perhatikan untuk meningkatkan keamanan aplikasi Anda saat menggunakan Sanctum:
- Validasi Input: Selalu validasi input dari user untuk mencegah serangan seperti SQL Injection atau Cross-Site Scripting (XSS).
- Hashing Password: Gunakan hashing password yang kuat seperti bcrypt atau Argon2 untuk melindungi password user.
- Rate Limiting: Implementasikan rate limiting untuk mencegah serangan brute-force.
- HTTPS: Selalu gunakan HTTPS untuk mengenkripsi komunikasi antara client dan server.
- Regularly Update: Pastikan Anda selalu menggunakan versi terbaru dari Laravel dan Sanctum untuk mendapatkan update keamanan terbaru.
- Store Token Securely: Jangan menyimpan token API di client-side storage (seperti local storage atau cookies) jika memungkinkan. Lebih baik gunakan server-side session atau HTTP-only cookies.
- Limit Token Lifespan: Batasi masa berlaku token untuk mengurangi risiko jika token dicuri.
- Implementasikan Two-Factor Authentication (2FA): Pertimbangkan untuk menambahkan 2FA untuk lapisan keamanan tambahan.
10. Troubleshooting Masalah Umum pada Laravel Sanctum
Meskipun Sanctum relatif mudah digunakan, terkadang Anda mungkin menemui beberapa masalah. Berikut adalah beberapa masalah umum dan cara mengatasinya:
- 401 Unauthorized: Pastikan Anda mengirimkan token API yang valid di header
Authorization. Periksa juga apakah token sudah expired atau sudah dicabut. - CSRF Token Mismatch: Pastikan SPA Anda mengirimkan header
X-CSRF-TOKENdengan setiap request. Periksa juga apakah domain SPA Anda sudah terdaftar di konfigurasistateful. - Token Tidak Ditemukan: Pastikan Anda sudah menjalankan migrasi database untuk membuat tabel
personal_access_tokens. - Error Saat Membuat Token: Periksa apakah model
UserAnda sudah menggunakan traitHasApiTokens.
Jika Anda masih menemui masalah, coba cari solusi di forum Laravel, Stack Overflow, atau dokumentasi resmi Sanctum.
11. Alternatif Otentikasi API Selain Laravel Sanctum
Meskipun Laravel Sanctum Authentication Tutorial: Otentikasi API Sederhana ini membahas Sanctum, penting juga untuk mengetahui alternatif lain untuk otentikasi API. Beberapa alternatif populer meliputi:
- Laravel Passport: Passport adalah paket otentikasi OAuth2 yang lebih lengkap dan kompleks daripada Sanctum. Cocok untuk aplikasi yang membutuhkan fitur otentikasi yang lebih canggih seperti client credentials, grant types, dan refresh tokens.
- JWT (JSON Web Token): JWT adalah standar industri untuk otentikasi API berbasis token. Ada beberapa paket Laravel yang menyediakan implementasi JWT, seperti Tymon JWT Auth.
- API Keys: API Keys adalah string unik yang digunakan untuk mengidentifikasi aplikasi atau pengguna yang mengakses API. Cocok untuk API yang membutuhkan kontrol akses yang lebih granular.
Pilihan terbaik tergantung pada kebutuhan spesifik proyek Anda.
12. Kesimpulan: Otentikasi API Sederhana dengan Laravel Sanctum
Selamat! Anda telah menyelesaikan Laravel Sanctum Authentication Tutorial: Otentikasi API Sederhana ini. Kita telah membahas langkah-langkah implementasi Sanctum secara mendalam, mulai dari instalasi, konfigurasi, pembuatan endpoint register dan login, hingga perlindungan routes dengan middleware auth:sanctum. Anda juga telah mempelajari cara mengatur masa berlaku token, memberikan kemampuan (abilities), mencabut token, dan mengintegrasikan Sanctum dengan SPA.
Sanctum adalah solusi otentikasi API yang sederhana, ringan, dan mudah digunakan. Cocok untuk aplikasi single-page (SPA), aplikasi mobile, dan API yang sederhana. Dengan panduan ini, Anda sekarang memiliki dasar yang kuat untuk mengamankan API Anda dengan Sanctum. Selamat mencoba dan semoga sukses!



