API (Application Programming Interface) menjadi tulang punggung banyak aplikasi modern. Mereka memungkinkan sistem yang berbeda untuk berkomunikasi dan bertukar data. Jika Anda sedang membangun aplikasi web atau mobile dengan Laravel, mengamankan API Anda adalah prioritas utama. Untungnya, Laravel menawarkan paket otentikasi yang sangat baik bernama Sanctum. Artikel ini akan memandu Anda melalui cara membuat API dengan Laravel Sanctum, dengan fokus pada otentikasi API aman. Kita akan membahas langkah demi langkah, mulai dari persiapan hingga implementasi lengkap.
1. Pengantar: Mengapa Laravel Sanctum untuk Otentikasi API?
Sebelum kita menyelami cara membuat API dengan Laravel Sanctum, mari kita pahami mengapa Sanctum menjadi pilihan populer.
- Ringan dan Mudah Digunakan: Sanctum sangat sederhana untuk dikonfigurasi dan diimplementasikan dibandingkan dengan solusi otentikasi yang lebih rumit seperti OAuth 2.0 untuk aplikasi single-page (SPA), aplikasi seluler, dan API sederhana.
- Stateful dan Stateless Authentication: Sanctum mendukung stateful authentication menggunakan cookies, yang ideal untuk aplikasi web berbasis browser. Ia juga mendukung stateless authentication menggunakan API tokens, yang sempurna untuk aplikasi seluler dan API.
- Aman: Sanctum dirancang dengan mempertimbangkan keamanan. Ia menggunakan enkripsi yang kuat untuk melindungi kredensial pengguna dan mencegah serangan umum.
- Integrasi yang Mulus: Sanctum terintegrasi dengan baik dengan kerangka kerja Laravel lainnya, seperti middleware dan gate, sehingga memudahkan untuk mengamankan rute API Anda.
2. Persiapan Awal: Instalasi dan Konfigurasi Laravel Sanctum
Langkah pertama dalam cara membuat API dengan Laravel Sanctum adalah menginstal dan mengkonfigurasi paket ini di proyek Laravel Anda.
-
Instal Paket Sanctum: Buka terminal Anda dan jalankan perintah berikut di direktori proyek Laravel Anda:
composer require laravel/sanctum -
Publikasikan Konfigurasi dan Migrasi: Setelah paket diinstal, publikasikan file konfigurasi dan migrasi Sanctum menggunakan perintah:
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"Perintah ini akan membuat file
config/sanctum.phpdan migrasi di direktoridatabase/migrations. -
Jalankan Migrasi: Jalankan migrasi untuk membuat tabel yang diperlukan oleh Sanctum:
php artisan migrateMigrasi ini akan membuat tabel
personal_access_tokens, yang digunakan untuk menyimpan API tokens. -
Konfigurasi Model User: Pastikan model
UserAnda menggunakan traitHasApiTokensdari Sanctum. Buka fileapp/Models/User.phpdan tambahkan trait berikut:<?php namespace AppModels; use IlluminateContractsAuthMustVerifyEmail; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateFoundationAuthUser as Authenticatable; use IlluminateNotificationsNotifiable; use LaravelSanctumHasApiTokens; // Tambahkan trait ini class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... } -
Konfigurasi Middleware Sanctum: Tambahkan middleware
EnsureFrontendRequestsAreStatefulke kernel HTTP Anda. Buka fileapp/Http/Kernel.phpdan tambahkan baris berikut ke properti$middlewareGroupsdi grupapi:protected $middlewareGroups = [ 'web' => [ AppHttpMiddlewareEncryptCookies::class, IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class, IlluminateSessionMiddlewareStartSession::class, IlluminateViewMiddlewareShareErrorsFromSession::class, AppHttpMiddlewareVerifyCsrfToken::class, IlluminateRoutingMiddlewareSubstituteBindings::class, ], 'api' => [ AppHttpMiddlewareEncryptCookies::class, // penting untuk stateful auth IlluminateSessionMiddlewareStartSession::class, // penting untuk stateful auth IlluminateRoutingMiddlewareThrottleRequests::class . ':60,1', IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class, AppHttpMiddlewareTrustProxies::class, LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful::class, // Tambahkan baris ini ], ];Middleware ini memastikan bahwa permintaan dari frontend aplikasi Anda diperlakukan sebagai stateful, memungkinkan penggunaan cookies untuk otentikasi.
Dengan langkah-langkah ini, Anda telah berhasil menginstal dan mengkonfigurasi Laravel Sanctum. Sekarang kita dapat melanjutkan ke pembuatan API endpoints.
3. Membuat API Endpoints: Rute dan Controller
Selanjutnya dalam cara membuat API dengan Laravel Sanctum, kita akan membuat beberapa API endpoints sederhana. Kita akan membuat rute untuk mengambil informasi pengguna yang diautentikasi dan rute untuk membuat API token baru.
-
Membuat Controller API: Buat controller API menggunakan perintah berikut:
php artisan make:controller Api/UserControllerIni akan membuat file
app/Http/Controllers/Api/UserController.php. -
Menambahkan Metode ke Controller: Buka file
app/Http/Controllers/Api/UserController.phpdan tambahkan metode berikut:<?php namespace AppHttpControllersApi; use AppHttpControllersController; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; class UserController extends Controller { public function index(Request $request) { return response()->json([ 'user' => $request->user() ]); } public function generateToken(Request $request) { $request->validate([ 'device_name' => 'required', ]); $token = $request->user()->createToken($request->device_name)->plainTextToken; return response()->json([ 'token' => $token, ]); } }- Metode
indexmengembalikan informasi pengguna yang diautentikasi. - Metode
generateTokenmembuat token API baru untuk pengguna yang diautentikasi. Ia memerlukan nama perangkat (device_name) sebagai input.
- Metode
-
Mendefinisikan Rute API: Buka file
routes/api.phpdan tambahkan rute berikut:<?php use IlluminateHttpRequest; use IlluminateSupportFacadesRoute; use AppHttpControllersApiUserController; Route::middleware('auth:sanctum')->get('/user', [UserController::class, 'index']); Route::middleware('auth:sanctum')->post('/tokens/create', [UserController::class, 'generateToken']);- Rute
/usermenggunakan middlewareauth:sanctumuntuk memastikan bahwa hanya pengguna yang diautentikasi yang dapat mengaksesnya. Ia memanggil metodeindexpadaUserController. - Rute
/tokens/createjuga menggunakan middlewareauth:sanctumdan memanggil metodegenerateTokenpadaUserController. Rute ini digunakan untuk membuat API token baru.
- Rute
4. Otentikasi Pengguna: Login dan Registrasi
Untuk menggunakan API kita, pengguna perlu diautentikasi terlebih dahulu. Mari kita buat rute dan controller untuk login dan registrasi. Ini sangat penting dalam cara membuat API dengan Laravel Sanctum
-
Membuat Controller Auth: Buat controller untuk menangani proses otentikasi:
php artisan make:controller AuthController -
Menambahkan Fungsi Login dan Registrasi: Buka
app/Http/Controllers/AuthController.phpdan tambahkan fungsi berikut:<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; 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', ]); } public function login(Request $request) { if (!Auth::attempt($request->only('email', 'password'))) { return response()->json([ 'message' => 'Invalid login credentials' ], 401); } $user = User::where('email', $request['email'])->firstOrFail(); $token = $user->createToken('auth_token')->plainTextToken; return response()->json([ 'access_token' => $token, 'token_type' => 'Bearer', ]); } public function logout(Request $request) { $request->user()->currentAccessToken()->delete(); return response()->json([ 'message' => 'Successfully logged out' ]); } }register: Menerima data registrasi, memvalidasi, membuat user baru, dan mengembalikan access token.login: Menerima email dan password, mencoba login, dan mengembalikan access token jika berhasil.logout: Menghapus token akses saat ini untuk user yang terautentikasi.
-
Mendefinisikan Rute Auth: Tambahkan rute untuk registrasi, login, dan logout di
routes/api.php:<?php use AppHttpControllersAuthController; use IlluminateSupportFacadesRoute; Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); Route::middleware('auth:sanctum')->post('/logout', [AuthController::class, 'logout']);/register: Untuk mendaftarkan pengguna baru./login: Untuk melakukan proses login./logout: Untuk melakukan proses logout, hanya bisa diakses oleh user yang sudah terautentikasi (menggunakanauth:sanctummiddleware).
5. Menguji API Endpoints: Menggunakan Postman atau Tools Sejenis
Setelah membuat API endpoints, penting untuk mengujinya. Anda dapat menggunakan tools seperti Postman, Insomnia, atau curl untuk mengirim permintaan ke API Anda. Ini adalah bagian penting dari cara membuat API dengan Laravel Sanctum dan memastikan semuanya berfungsi dengan benar.
-
Mendaftar Pengguna: Kirim permintaan POST ke endpoint
/api/registerdengan data berikut:{ "name": "John Doe", "email": "[email protected]", "password": "password123" }Jika berhasil, Anda akan menerima respons JSON yang berisi
access_tokendantoken_type. -
Login Pengguna: Kirim permintaan POST ke endpoint
/api/logindengan data berikut:{ "email": "[email protected]", "password": "password123" }Jika berhasil, Anda akan menerima respons JSON yang berisi
access_tokendantoken_type. -
Mengakses Rute yang Dilindungi: Gunakan
access_tokenyang Anda peroleh dari proses login atau registrasi. Set headerAuthorizationdengan valueBearer <access_token>. Misalnya:Bearer eyJ0eXAiOiJKV1QiLC....Kirim permintaan GET ke endpoint
/api/user. Pastikan untuk menyertakan headerAuthorizationdengan token yang Anda dapatkan dari langkah sebelumnya.Jika berhasil, Anda akan menerima respons JSON yang berisi informasi pengguna yang diautentikasi.
-
Membuat API Token Baru: Kirim permintaan POST ke endpoint
/api/tokens/createdengan data berikut dan headerAuthorizationyang sudah di set:{ "device_name": "My Mobile App" }Jika berhasil, Anda akan menerima respons JSON yang berisi
token. Ini adalah token API yang dapat Anda gunakan untuk mengakses API Anda dari aplikasi seluler Anda. -
Logout Pengguna: Kirim permintaan POST ke endpoint
/api/logoutdengan headerAuthorizationyang sudah di set. Jika berhasil, Anda akan menerima respons dengan pesan sukses.
6. Otentikasi Stateful vs. Stateless: Memilih Pendekatan yang Tepat
Laravel Sanctum menawarkan dua pendekatan otentikasi utama: stateful dan stateless. Memahami perbedaan antara keduanya sangat penting dalam cara membuat API dengan Laravel Sanctum yang efektif.
-
Stateful Authentication (Menggunakan Cookies): Cocok untuk aplikasi web berbasis browser. Sanctum menggunakan cookies untuk melacak sesi pengguna. Ini lebih aman dan lebih efisien untuk aplikasi web karena browser secara otomatis menangani manajemen cookies. Middleware
EnsureFrontendRequestsAreStatefulmemastikan bahwa permintaan dari frontend aplikasi Anda diperlakukan sebagai stateful. -
Stateless Authentication (Menggunakan API Tokens): Cocok untuk aplikasi seluler, aplikasi SPA (Single-Page Application), dan API yang digunakan oleh pihak ketiga. Setiap permintaan harus menyertakan API token di header
Authorization. Ini lebih fleksibel karena tidak bergantung pada cookies, tetapi memerlukan penanganan token yang hati-hati.
Pilihan antara stateful dan stateless authentication tergantung pada jenis aplikasi yang Anda bangun. Jika Anda membangun aplikasi web tradisional, stateful authentication adalah pilihan yang lebih baik. Jika Anda membangun aplikasi seluler atau API, stateless authentication adalah pilihan yang lebih baik.
7. Meningkatkan Keamanan API dengan Laravel Sanctum
Selain otentikasi dasar, ada beberapa langkah yang dapat Anda ambil untuk meningkatkan keamanan API Anda menggunakan Laravel Sanctum. Ini adalah bagian penting dari cara membuat API dengan Laravel Sanctum yang aman.
-
Rate Limiting: Gunakan middleware
throttleuntuk membatasi jumlah permintaan yang dapat dilakukan oleh pengguna dalam jangka waktu tertentu. Ini membantu mencegah serangan brute-force dan DDoS. Contohnya:Route::middleware('auth:sanctum', 'throttle:60,1')->get('/user', [UserController::class, 'index']);Kode di atas membatasi pengguna untuk melakukan 60 permintaan per menit ke endpoint
/user. -
Scopes (Kemampuan): Gunakan scopes untuk membatasi akses ke API endpoints berdasarkan kemampuan pengguna. Anda dapat mendefinisikan scopes di model
Userdan kemudian menggunakan middlewareabilityuntuk melindungi rute.// Di model User.php public function tokensCan() { return [ 'server:update', ]; } // Di routes/api.php Route::middleware(['auth:sanctum', 'ability:server:update'])->post('/server/update', function () { // Logic untuk update server });Hanya token yang memiliki kemampuan
server:updateyang dapat mengakses rute/server/update. -
Enkripsi: Pastikan semua komunikasi antara klien dan server dienkripsi menggunakan HTTPS. Ini melindungi data sensitif dari intersepsi.
-
Validasi Input: Selalu validasi input pengguna untuk mencegah serangan injeksi SQL, XSS, dan serangan lainnya. Gunakan fitur validasi bawaan Laravel untuk memvalidasi data yang diterima dari permintaan API.
-
Rotasi Token: Pertimbangkan untuk menerapkan rotasi token, di mana token API secara berkala diganti dengan token baru. Ini mengurangi risiko jika token bocor.
-
Penyimpanan Token yang Aman: Simpan API tokens di database Anda dengan aman menggunakan hash. Laravel Sanctum secara otomatis menangani ini.
8. Contoh Implementasi: API untuk Aplikasi To-Do
Mari kita lihat contoh implementasi yang lebih lengkap: membangun API untuk aplikasi To-Do sederhana. Ini akan memberikan gambaran yang lebih jelas tentang cara membuat API dengan Laravel Sanctum dalam skenario praktis.
-
Membuat Model dan Migrasi To-Do: Buat model dan migrasi untuk tabel
todos:php artisan make:model Todo -mBuka file migrasi dan tambahkan kolom berikut:
<?php use IlluminateDatabaseMigrationsMigration; use IlluminateDatabaseSchemaBlueprint; use IlluminateSupportFacadesSchema; class CreateTodosTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('todos', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('description')->nullable(); $table->boolean('completed')->default(false); $table->foreignId('user_id')->constrained()->onDelete('cascade'); // Relasi ke user $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('todos'); } }Jalankan migrasi:
php artisan migrateDi model
Todo.php, tambahkan relasi ke modelUser:<?php namespace AppModels; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateDatabaseEloquentModel; class Todo extends Model { use HasFactory; protected $fillable = ['title', 'description', 'completed', 'user_id']; public function user() { return $this->belongsTo(User::class); } } -
Membuat Controller To-Do: Buat controller untuk menangani logika API To-Do:
php artisan make:controller Api/TodoControllerBuka
app/Http/Controllers/Api/TodoController.phpdan tambahkan fungsi berikut:<?php namespace AppHttpControllersApi; use AppHttpControllersController; use AppModelsTodo; use IlluminateHttpRequest; use IlluminateSupportFacadesValidator; class TodoController extends Controller { public function index(Request $request) { $todos = $request->user()->todos; // Ambil To-Do milik user yang login return response()->json($todos); } public function store(Request $request) { $validator = Validator::make($request->all(), [ 'title' => 'required|string|max:255', 'description' => 'nullable|string', ]); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $todo = new Todo([ 'title' => $request->title, 'description' => $request->description, 'user_id' => $request->user()->id, ]); $todo->save(); return response()->json($todo, 201); // 201 Created } public function show(Request $request, $id) { $todo = $request->user()->todos()->find($id); // Hanya To-Do milik user yang login if (!$todo) { return response()->json(['message' => 'To-Do not found'], 404); } return response()->json($todo); } public function update(Request $request, $id) { $validator = Validator::make($request->all(), [ 'title' => 'string|max:255', 'description' => 'nullable|string', 'completed' => 'boolean', ]); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $todo = $request->user()->todos()->find($id); if (!$todo) { return response()->json(['message' => 'To-Do not found'], 404); } $todo->title = $request->input('title', $todo->title); $todo->description = $request->input('description', $todo->description); $todo->completed = $request->input('completed', $todo->completed); $todo->save(); return response()->json($todo); } public function destroy(Request $request, $id) { $todo = $request->user()->todos()->find($id); if (!$todo) { return response()->json(['message' => 'To-Do not found'], 404); } $todo->delete(); return response()->json(['message' => 'To-Do deleted']); } } -
Mendefinisikan Rute To-Do: Tambahkan rute untuk To-Do di
routes/api.php:<?php use AppHttpControllersApiTodoController; use IlluminateSupportFacadesRoute; Route::middleware('auth:sanctum')->group(function () { Route::get('/todos', [TodoController::class, 'index']); Route::post('/todos', [TodoController::class, 'store']); Route::get('/todos/{id}', [TodoController::class, 'show']); Route::put('/todos/{id}', [TodoController::class, 'update']); Route::delete('/todos/{id}', [TodoController::class, 'destroy']); });Kita menggunakan
groupuntuk mengelompokkan semua rute To-Do di bawah middlewareauth:sanctum.
Sekarang Anda memiliki API To-Do yang lengkap yang aman dengan Laravel Sanctum. Anda dapat menguji API ini menggunakan Postman atau tools sejenis. Pastikan untuk menyertakan header Authorization dengan token yang valid.
9. Troubleshooting Umum: Mengatasi Masalah Otentikasi
Meskipun Laravel Sanctum relatif mudah digunakan, Anda mungkin mengalami beberapa masalah saat mengimplementasikannya. Berikut beberapa tips untuk mengatasi masalah umum dalam cara membuat API dengan Laravel Sanctum:
-
401 UnauthorizedError: Ini biasanya berarti token API Anda tidak valid atau tidak ada. Pastikan Anda menyertakan headerAuthorizationyang benar dengan token yang valid. Periksa juga apakah middlewareauth:sanctumtelah dikonfigurasi dengan benar. -
CSRF Token Mismatch: Jika Anda menggunakan stateful authentication (cookies), pastikan frontend Anda mengirimkan CSRF token dengan setiap permintaan. Laravel secara otomatis menghasilkan CSRF token untuk setiap sesi. Anda dapat mengambil CSRF token dari cookie
XSRF-TOKEN. Pastikan middlewareVerifyCsrfTokendiaktifkan. -
Sesi Tidak Terbentuk: Jika Anda menggunakan stateful authentication, pastikan sesi Laravel telah dikonfigurasi dengan benar. Periksa file
config/session.phpdan pastikan opsi konfigurasi yang benar telah diatur. Pastikan juga middlewareStartSessiondiaktifkan. -
Token Tidak Dibuat: Jika Anda mengalami masalah dalam membuat token, pastikan model
UserAnda menggunakan traitHasApiTokensdan bahwa migrasipersonal_access_tokenstelah berhasil dijalankan. -
Masalah Konfigurasi Middleware: Pastikan middleware
EnsureFrontendRequestsAreStatefultelah dikonfigurasi dengan benar di kernel HTTP Anda. Ini sangat penting untuk stateful authentication.
10. Kesimpulan: Mengamankan API Anda dengan Laravel Sanctum
Dalam artikel ini, kita telah membahas cara membuat API dengan Laravel Sanctum, dengan fokus pada otentikasi API aman. Kita telah membahas instalasi, konfigurasi, pembuatan API endpoints, otentikasi pengguna, dan peningkatan keamanan.
Laravel Sanctum adalah alat yang ampuh dan mudah digunakan untuk mengamankan API Anda. Dengan mengikuti panduan ini, Anda dapat membangun API yang aman dan andal untuk aplikasi web dan seluler Anda. Ingatlah untuk selalu memprioritaskan keamanan dan mengikuti praktik terbaik untuk melindungi data pengguna Anda. Selamat mencoba dan semoga sukses dengan proyek Laravel Anda!

