Pernakah kalian bertanya-tanya apakah API yang telah kita buat sudah memiliki level pengamanan yang cukup agar terhindar dari serangan cyber? Faktanya, banyak developer pemula yang melupakan aspek penting setelah berhasil membuat API, yaitu bagaimana cara melindungi API yang menyimpan data sensitif dari kebocoran. Cara menangani permasalahan tersebut adalah menerapkan autentikasi berbasis token untuk API pada aplikasi yang kita buat, salah satunya menggunakan Laravel Sanctum.
Laravel Sanctum menyediakan sistem autentikasi ringan untuk SPA (Single Page Application), aplikasi mobile, dan API sederhana. Dalam artikel ini akan membahas pengertian dan fitur Laravel Sanctum, serta panduan implementasi autentikasi API yang aman di Laravel.
Apa itu Laravel Sanctum
Laravel Sanctum adalah package atau library resmi yang menawarkan autentikasi berbasis token untuk aplikasi Laravel. Sanctum dirancang untuk Single Page Application, Mobile App, dan API Sederhana tanpa menggunakan sistem yang lebih kompleks seperti Laravel Passport (OAuth2). Sanctum bekerja dengan 2 pendekatan yaitu:
- Token API - untuk aplikasi yang membutuhkan autentikasi berbasis token klasik.
- Cookie-based SPA Authentication - untuk SPA yang berjalan di domain yang sama, menggunakan session cookie yang aman. Namun pada pembahasan ini, kita akan menggunakan Token API Authentication.
Fitur Utama Laravel Sanctum
Laravel Sanctum memiliki beberapa fitur unggulan yaitu:
- Autentikasi Token API
- Autentikasi SPA
- Support Mobile App Authentication
- Token Abilities / Scope Token
- Token Expiration
- Mudah Digunakan dan Ringan
Persiapan
Sebelum kita mengimplementasikan Laravel Sanctum pada aplikasi laravel, pastikan kalian memiliki:
- Laravel 12.x yang sudah terinstall.
- PHP 8.2 atau lebih tinggi.
- Composer
- Pemahaman dasar tentang Laravel.
- Database (MySQL, PostgreeSQL, dll.)
Install Laravel Sanctum
Buka terminal paste kan script dibawah ini.
composer require laravel/sanctum
Publish konfigurasi sanctum.
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
Jalankan migrasi
php artisan migrate
Konfigurasi Laravel Sanctum
- Config Middleware
Buka file bootstrap/app.php
tambahkan kode dibawah ini.
$middleware->statefulApi();
dan
api: __DIR__.'/../routes/api.php',
sehingga full kode untuk file app.php
menjadi seperti ini.
return Application::configure(basePath: dirname(__DIR__))
->withProviders()
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->statefulApi();
})
->withExceptions(function (Exceptions $exceptions) {
})->create();
- CORS
Pastekan perintah dibawah ini pada terminal untuk melakukan publish config cors.php
.
php artisan config:publish cors
Update file config/cors.php
untuk mengizinkan credentials.
'supports_credentials' => true,
- Set Expired Token
Buka file config/sanctum.php
untuk mengatur expired token dalam satuan menit.
'expiration' => 60 //1 hour
Implementasi
- Konfigurasi User Model
Buka file app/Models/User.php
lalu tambahkan trait HasApiTokens
seperti dibawah ini.
<?php
namespace App\Models;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasFactory, Notifiable, HasApiTokens;
}
- Konfigurasi Controller
Buat controller dengan nama AuthController
untuk menagani proses autentikasi.
php artisan make:controller Api/AuthController
buka file AuthController
dan pastekan kode dibawah ini.
<?php
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\Validation\ValidationException;
class AuthController extends Controller
{
public function register(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|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([
'user' => $user,
'message' => 'registration success'
], 201);
}
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['invalid credentials.'],
]);
}
$token = $user->createToken('auth-token')->plainTextToken;
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
'user' => $user,
'message' => 'login success'
]);
}
public function logout(Request $request)
{
$request->user()->currentAccessToken()->delete();
return response()->json([
'message' => 'logout success'
]);
}
public function user(Request $request)
{
return response()->json([
'user' => $request->user(),
'message' => 'user data retrieved successfully'
]);
}
}
Mari kita bahas beberapa bagian kode diatas.
$token = $user->createToken('auth-token')->plainTextToken;
Fungsi createToken()
adalah method dari trait HasApiTokens
untuk generate token berupa plainTextToken
.
$request->user()->currentAccessToken()->delete();
Menghapus token yang telah digenerate dan digunakan oleh user.
- Update Route API
Buat file bernamakan api.php
didalam folder routes/
lalu tempelkan kode dibawah ini.
<?php
use App\Http\Controllers\Api\AuthController;
use Illuminate\Support\Facades\Route;
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->group(function () {
Route::post('/logout', [AuthController::class, 'logout']);
Route::get('/get-user', [AuthController::class, 'user']);
});
Kita mendefinisikan middleware('auth:sanctum')
didalam route group, yang berarti seluruh route didalam group tersebut akan diproteksi oleh auth:sanctum
.
Pengujian API Menggunakan Postman
Kita menggunakan tools Postman untuk menguji API yang telah kita buat.
- Register User
- POST
/api/register
- Body
{"name": "NganggurDev", "email": "bussines.nganggurdev@gmail.com", "password": "admin123", "password_confirmation": "admin123"}
- Login
- POST
/api/login
- Body
{"email": "bussines.nganggurdev@gmail.com", "password": "admin123"}
- Access Protected Route
- GET
/api/get-user
- Header:
Authorization: Bearer <access token>
User Memiliki Bearer Token (Authenticated)
Unauthenticated
4. Logout
- POST
/api/logout
- Header:
Authorization: Bearer <access token>
Masalah Umum Yang Sering Terjadi
- Problem CORS
Solusi: pastikan konfigurasi CORS
sudah benar.
- 401 Unauthorized
Solusi: perika apakah header Authorization
diformat dengan benar: Bearer {token}.
- Session dengan SPA
Solusi: pastikan untuk call api /sanctum/csrf-cookie
sebelum membuat request yang terotentikasi di SPA.
- Token Tidak Expired Sesuai Kebutuhan
**Solusi: ** konfigurasi waktu expiration di config/sanctum.php
dan implementasikan custom expiration untuk token tertentu jika diperlukan.
- Token Terduplikasi untuk User yang Sama
Solusi: implementasikan strategi revoke token lama saat login baru atau batasi jumlah maksimum token aktif per user.
Kesimpulan
Laravel Sanctum menyediakan solusi untuk mengatasi masalah pengamanan data sensitif untuk aplikasi web modern. Dengan mengikuti panduan ini, kita telah mempelajari dasar-dasar implementasi autentikasi API yang aman di Laravel 12.
Terimakasih.