Laravel Sanctum adalah cara yang sangat nyaman untuk mengotentikasi aplikasi single-page (SPA), aplikasi seluler, dan API sederhana berbasis token. Dalam tutorial ini, kita akan mempelajari langkah demi langkah cara membuat API sederhana dengan Laravel Sanctum menggunakan bahasa Indonesia. Anda akan belajar cara mengimplementasikan autentikasi token untuk endpoint API Anda, memungkinkan pengguna mengakses data Anda dengan aman.
Apa Itu Laravel Sanctum dan Mengapa Anda Harus Menggunakannya?
Sebelum kita mulai coding, mari kita pahami dulu apa itu Laravel Sanctum dan mengapa ia menjadi pilihan populer untuk autentikasi API.
Laravel Sanctum menyediakan sistem autentikasi berbasis token yang ringan, ideal untuk:
- Aplikasi SPA (Single-Page Application): Sanctum memungkinkan aplikasi frontend Anda (misalnya, React, Vue.js, Angular) untuk dengan mudah berinteraksi dengan backend Laravel Anda.
- Aplikasi Seluler: Sanctum memungkinkan aplikasi seluler Anda untuk mengautentikasi pengguna dan mengakses data API Anda dengan aman.
- API Sederhana: Jika Anda membutuhkan autentikasi sederhana untuk API Anda tanpa kerumitan protokol OAuth, Sanctum adalah solusi yang tepat.
Keunggulan menggunakan Laravel Sanctum:
- Ringan dan Mudah Digunakan: Setup yang cepat dan sederhana dibandingkan dengan sistem autentikasi berbasis OAuth yang lebih kompleks.
- Aman: Menggunakan token API untuk autentikasi, mengurangi risiko serangan CSRF (Cross-Site Request Forgery).
- Fleksibel: Dapat digunakan untuk berbagai jenis aplikasi.
- Terintegrasi dengan Laravel: Fitur-fitur Sanctum sangat terintegrasi dengan framework Laravel.
Persiapan Awal: Instalasi Laravel dan Konfigurasi Database
Langkah pertama adalah memastikan Anda memiliki lingkungan pengembangan Laravel yang berfungsi. Jika belum, ikuti langkah-langkah berikut:
-
Instalasi Laravel: Gunakan Composer untuk membuat proyek Laravel baru.
composer create-project laravel/laravel:^9.0 belajar-sanctum cd belajar-sanctum
Ganti
belajar-sanctum
dengan nama proyek yang Anda inginkan. -
Konfigurasi Database: Edit file
.env
dan atur koneksi database Anda. Pastikan database yang Anda gunakan sudah dibuat.DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=belajar_sanctum DB_USERNAME=root DB_PASSWORD=
Ganti
belajar_sanctum
,root
, dan password sesuai dengan konfigurasi database Anda. -
Migrasi Database: Jalankan migrasi default untuk membuat tabel-tabel yang diperlukan.
php artisan migrate
Instalasi dan Konfigurasi Laravel Sanctum
Setelah proyek Laravel Anda siap, langkah selanjutnya adalah menginstal dan mengkonfigurasi Laravel Sanctum.
-
Instalasi Sanctum: Gunakan Composer untuk menginstal package Sanctum.
composer require laravel/sanctum
-
Konfigurasi Sanctum: Jalankan perintah
vendor:publish
untuk mempublish file konfigurasi Sanctum.php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Perintah ini akan membuat file konfigurasi
config/sanctum.php
yang dapat Anda sesuaikan sesuai kebutuhan. Periksa file ini untuk opsi-opsi konfigurasi yang tersedia. -
Migrasi Sanctum: Jalankan migrasi Sanctum untuk membuat tabel
personal_access_tokens
.php artisan migrate
Tabel ini akan digunakan untuk menyimpan token API yang dihasilkan.
-
Model User: Pastikan model
AppModelsUser
menggunakan traitHasApiTokens
dari Sanctum.<?php namespace AppModels; use IlluminateContractsAuthMustVerifyEmail; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateFoundationAuthUser as Authenticatable; use IlluminateNotificationsNotifiable; use LaravelSanctumHasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... sisa kode model User }
Membuat Route dan Controller untuk Autentikasi
Sekarang kita akan membuat route dan controller untuk menangani proses registrasi dan login pengguna.
-
Membuat Controller: Buat controller baru bernama
AuthController
.php artisan make:controller AuthController
-
Kode Controller (AuthController.php):
<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; use IlluminateSupportFacadesHash; use IlluminateSupportFacadesValidator; use IlluminateSupportStr; 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) { $validator = Validator::make($request->all(), [ 'email' => 'required|string|email|max:255', 'password' => 'required|string', ]); 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', ]); } public function logout(Request $request) { $request->user()->currentAccessToken()->delete(); return response()->json([ 'message' => 'Successfully logged out' ]); } }
Kode ini berisi tiga method:
register()
: Menerima data registrasi dari pengguna, memvalidasinya, membuat user baru, dan menghasilkan token API.login()
: Menerima kredensial login dari pengguna, memvalidasinya, dan menghasilkan token API jika kredensial valid.logout()
: Mencabut token API yang sedang digunakan oleh pengguna.
-
Membuat Route: Tambahkan route untuk registrasi, login, dan logout di file
routes/api.php
.<?php use AppHttpControllersAuthController; use IlluminateHttpRequest; use IlluminateSupportFacadesRoute; Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); Route::middleware('auth:sanctum')->group(function () { Route::get('/user', function (Request $request) { return $request->user(); }); Route::post('/logout', [AuthController::class, 'logout']); });
Perhatikan penggunaan
Route::middleware('auth:sanctum')->group(...)
untuk melindungi routeuser
danlogout
. Route ini hanya dapat diakses oleh pengguna yang sudah terautentikasi (memiliki token API yang valid).
Membuat Endpoint API yang Terproteksi (Protected)
Sekarang, mari kita buat contoh endpoint API yang memerlukan autentikasi.
-
Membuat Controller: Buat controller baru bernama
ProductController
.php artisan make:controller ProductController
-
Kode Controller (ProductController.php):
<?php namespace AppHttpControllers; use IlluminateHttpRequest; class ProductController extends Controller { public function index() { // Dummy data for products $products = [ ['id' => 1, 'name' => 'Product A', 'price' => 100], ['id' => 2, 'name' => 'Product B', 'price' => 200], ]; return response()->json($products); } }
Controller ini hanya memiliki satu method
index()
yang mengembalikan daftar produk dummy. -
Membuat Route: Tambahkan route untuk mengakses daftar produk di file
routes/api.php
, dan pastikan route tersebut berada di dalam middlewareauth:sanctum
.<?php use AppHttpControllersAuthController; use AppHttpControllersProductController; use IlluminateHttpRequest; use IlluminateSupportFacadesRoute; Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); Route::middleware('auth:sanctum')->group(function () { Route::get('/user', function (Request $request) { return $request->user(); }); Route::post('/logout', [AuthController::class, 'logout']); Route::get('/products', [ProductController::class, 'index']); // Route terproteksi });
Pengujian API dengan Postman atau Insomnia
Untuk menguji API yang telah kita buat, Anda dapat menggunakan aplikasi seperti Postman atau Insomnia.
-
Registrasi Pengguna: Kirim request POST ke endpoint
/api/register
dengan data nama, email, dan password. Anda akan menerima respon berupa token API. -
Login Pengguna: Kirim request POST ke endpoint
/api/login
dengan data email dan password. Anda juga akan menerima respon berupa token API. -
Mengakses Endpoint Terproteksi:
- Set header
Authorization
dengan nilaiBearer <token_api>
, ganti<token_api>
dengan token yang Anda dapatkan dari proses registrasi atau login. - Kirim request GET ke endpoint
/api/products
. Anda akan menerima respon berupa daftar produk. - Jika Anda mencoba mengakses endpoint ini tanpa header
Authorization
yang valid, Anda akan menerima respon error dengan kode 401 (Unauthorized).
- Set header
-
Logout Pengguna: Kirim request POST ke endpoint
/api/logout
dengan headerAuthorization
yang valid. Anda akan menerima respon bahwa logout berhasil. Setelah logout, token API Anda tidak akan valid lagi.
Tips Tambahan untuk Pengembangan API yang Lebih Baik
Berikut adalah beberapa tips tambahan untuk mengembangkan API yang lebih baik dengan Laravel Sanctum:
- Validasi Input: Selalu validasi input dari pengguna untuk mencegah serangan dan memastikan data yang disimpan konsisten. Gunakan Validator Laravel untuk memudahkan proses validasi.
- Error Handling: Implementasikan error handling yang baik untuk memberikan informasi yang jelas dan berguna kepada pengguna jika terjadi kesalahan.
- Dokumentasi API: Buat dokumentasi API yang lengkap dan mudah dipahami. Ini akan membantu developer lain (atau Anda sendiri di masa depan) untuk menggunakan API Anda dengan benar. Anda bisa menggunakan tools seperti Swagger/OpenAPI untuk membuat dokumentasi otomatis.
- Rate Limiting: Implementasikan rate limiting untuk mencegah penyalahgunaan API. Laravel menyediakan middleware
throttle
yang dapat Anda gunakan. - Penggunaan UUID: Pertimbangkan penggunaan UUID sebagai primary key untuk model-model Anda. Ini dapat meningkatkan keamanan dan fleksibilitas aplikasi Anda. Anda dapat menggunakan package seperti
ramsey/uuid
untuk menghasilkan UUID. - Pengujian Otomatis: Buat unit test dan feature test untuk memastikan API Anda berfungsi dengan benar dan tidak ada regression setelah perubahan kode.
Kesimpulan: Membuat API Sederhana dengan Laravel Sanctum
Selamat! Anda telah berhasil membuat API sederhana dengan Laravel Sanctum menggunakan bahasa Indonesia. Anda telah mempelajari cara menginstal dan mengkonfigurasi Sanctum, membuat route dan controller untuk autentikasi, dan membuat endpoint API yang terproteksi. Dengan pengetahuan ini, Anda dapat mengembangkan API yang lebih kompleks dan aman dengan Laravel Sanctum. Jangan ragu untuk bereksperimen dengan fitur-fitur Sanctum lainnya dan menjelajahi dokumentasi resminya.
Semoga tutorial ini bermanfaat! Jika Anda memiliki pertanyaan atau saran, jangan ragu untuk meninggalkan komentar di bawah. Selamat mencoba!