Laravel Sanctum adalah paket otentikasi yang sangat berguna untuk membangun REST API sederhana dengan mudah dan aman. Dalam tutorial ini, kita akan membahas langkah demi langkah cara membuat REST API sederhana dengan Laravel Sanctum. Kita akan mulai dari instalasi Laravel hingga implementasi otentikasi dan pengujian API kita. Mari kita mulai!
1. Persiapan Awal: Instalasi Laravel dan Konfigurasi Dasar
Sebelum kita mulai membuat REST API sederhana dengan Laravel Sanctum, kita perlu memastikan bahwa Laravel sudah terinstal di sistem kita. Jika belum, ikuti langkah-langkah berikut:
-
Instalasi Laravel menggunakan Composer: Buka terminal Anda dan jalankan perintah berikut:
composer create-project laravel/laravel example-api
Ganti
example-api
dengan nama proyek yang Anda inginkan. -
Masuk ke direktori proyek: Setelah instalasi selesai, masuk ke direktori proyek:
cd example-api
-
Konfigurasi Database: Edit file
.env
dan atur konfigurasi database sesuai dengan database yang Anda gunakan (MySQL, PostgreSQL, dll.). Contoh konfigurasi MySQL:DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=example_api DB_USERNAME=your_username DB_PASSWORD=your_password
Pastikan database
example_api
sudah dibuat di sistem database Anda. -
Migrasi Database: Jalankan migrasi untuk membuat tabel-tabel yang dibutuhkan oleh Laravel:
php artisan migrate
Sekarang, Laravel sudah terinstal dan terkonfigurasi. Kita siap untuk langkah selanjutnya, yaitu menginstal Laravel Sanctum.
2. Instalasi dan Konfigurasi Laravel Sanctum untuk API Authentication
Langkah selanjutnya dalam tutorial membuat REST API sederhana dengan Laravel Sanctum adalah menginstal dan mengkonfigurasi Laravel Sanctum.
-
Instal Laravel Sanctum: Jalankan perintah berikut di terminal:
composer require laravel/sanctum
-
Publikasi Konfigurasi Sanctum: Publikasikan file konfigurasi Sanctum:
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
-
Migrasi Tabel Sanctum: Jalankan migrasi untuk membuat tabel
personal_access_tokens
:php artisan migrate
-
Konfigurasi
User
Model: Tambahkan traitHasApiTokens
ke modelAppModelsUser
:<?php namespace AppModels; use IlluminateContractsAuthMustVerifyEmail; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateFoundationAuthUser as Authenticatable; use IlluminateNotificationsNotifiable; use LaravelSanctumHasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... }
-
Konfigurasi
config/auth.php
: Pastikanapi
guard menggunakansanctum
driver:'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'sanctum', 'provider' => 'users', ], ],
Dengan langkah-langkah ini, Laravel Sanctum sudah terinstal dan siap digunakan.
3. Membuat Controller dan Model untuk API
Untuk membuat REST API sederhana dengan Laravel Sanctum, kita membutuhkan controller dan model yang akan menangani logika aplikasi kita. Dalam contoh ini, kita akan membuat API untuk mengelola Products
.
-
Membuat Model
Product
: Jalankan perintah berikut untuk membuat modelProduct
dan migrasinya:php artisan make:model Product -m
-
Mengedit Migrasi
products
: Buka file migrasi yang baru dibuat (biasanya didatabase/migrations
) dan tambahkan kolom-kolom yang dibutuhkan, misalnya:<?php use IlluminateDatabaseMigrationsMigration; use IlluminateDatabaseSchemaBlueprint; use IlluminateSupportFacadesSchema; class CreateProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->text('description'); $table->decimal('price', 8, 2); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('products'); } }
-
Jalankan Migrasi: Jalankan migrasi untuk membuat tabel
products
:php artisan migrate
-
Membuat Controller
ProductController
: Jalankan perintah berikut untuk membuat controllerProductController
:php artisan make:controller ProductController --resource
Controller ini akan menangani operasi CRUD (Create, Read, Update, Delete) untuk produk.
4. Implementasi CRUD Operations pada ProductController
Sekarang kita akan mengimplementasikan operasi CRUD pada ProductController
untuk membuat REST API sederhana dengan Laravel Sanctum kita berfungsi.
-
Buka
app/Http/Controllers/ProductController.php
dan implementasikan method-method berikut:<?php namespace AppHttpControllers; use AppModelsProduct; use IlluminateHttpRequest; use IlluminateSupportFacadesValidator; class ProductController extends Controller { /** * Display a listing of the resource. * * @return IlluminateHttpResponse */ public function index() { $products = Product::all(); return response()->json($products); } /** * Store a newly created resource in storage. * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function store(Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required|string|max:255', 'description' => 'required|string', 'price' => 'required|numeric', ]); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $product = Product::create($request->all()); return response()->json($product, 201); } /** * Display the specified resource. * * @param AppModelsProduct $product * @return IlluminateHttpResponse */ public function show(Product $product) { return response()->json($product); } /** * Update the specified resource in storage. * * @param IlluminateHttpRequest $request * @param AppModelsProduct $product * @return IlluminateHttpResponse */ public function update(Request $request, Product $product) { $validator = Validator::make($request->all(), [ 'name' => 'string|max:255', 'description' => 'string', 'price' => 'numeric', ]); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $product->update($request->all()); return response()->json($product); } /** * Remove the specified resource from storage. * * @param AppModelsProduct $product * @return IlluminateHttpResponse */ public function destroy(Product $product) { $product->delete(); return response()->json(null, 204); } }
Kode di atas mengimplementasikan:
index()
: Mengambil semua produk.store()
: Menyimpan produk baru.show()
: Menampilkan detail produk.update()
: Memperbarui produk yang ada.destroy()
: Menghapus produk.
5. Konfigurasi Route API dan Perlindungan dengan Sanctum
Setelah controller dan model siap, kita perlu mendefinisikan route API dan melindungi route tersebut dengan Laravel Sanctum agar hanya pengguna yang terautentikasi yang bisa mengaksesnya.
-
Buka
routes/api.php
dan definisikan route untuk resourceproducts
:<?php use IlluminateHttpRequest; use IlluminateSupportFacadesRoute; use AppHttpControllersProductController; /* |-------------------------------------------------------------------------- | API Routes |-------------------------------------------------------------------------- | | Here is where you can register API routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | is assigned the "api" middleware group. Enjoy building your API! | */ Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); Route::middleware('auth:sanctum')->apiResource('products', ProductController::class);
Kode di atas:
- Melindungi route
/user
dengan middlewareauth:sanctum
, yang berarti hanya pengguna yang terautentikasi yang bisa mengakses route ini. - Membuat route resource untuk
products
dan melindungi semua route CRUD (index, store, show, update, destroy) dengan middlewareauth:sanctum
.
- Melindungi route
6. Registrasi dan Login Pengguna untuk Mendapatkan API Token
Sebelum kita bisa menggunakan API, kita perlu membuat mekanisme registrasi dan login pengguna untuk mendapatkan API token yang akan digunakan untuk otentikasi.
-
Membuat Controller
AuthController
: Jalankan perintah berikut:php artisan make:controller AuthController
-
Buka
app/Http/Controllers/AuthController.php
dan implementasikan methodregister
danlogin
:<?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|confirmed', ]); 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|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 route untuk registrasi dan login di
routes/api.php
:Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']);
Dengan kode di atas, kita sudah memiliki endpoint /register
untuk registrasi pengguna dan /login
untuk login pengguna. Kedua endpoint ini akan mengembalikan API token yang akan digunakan untuk otentikasi.
7. Pengujian API dengan Postman atau Insomnia
Langkah terakhir dalam tutorial membuat REST API sederhana dengan Laravel Sanctum adalah menguji API yang sudah kita buat. Kita akan menggunakan Postman atau Insomnia untuk mengirimkan request ke API kita.
-
Registrasi Pengguna: Kirimkan request POST ke endpoint
/register
dengan data:{ "name": "John Doe", "email": "[email protected]", "password": "password", "password_confirmation": "password" }
Anda akan menerima response berupa API token.
-
Login Pengguna: Kirimkan request POST ke endpoint
/login
dengan data:{ "email": "[email protected]", "password": "password" }
Anda akan menerima response berupa API token.
-
Mengakses Endpoint yang Dilindungi: Untuk mengakses endpoint yang dilindungi (misalnya,
/api/products
), tambahkan headerAuthorization
dengan nilaiBearer <API_TOKEN>
, di mana<API_TOKEN>
adalah token yang Anda dapatkan dari proses registrasi atau login.Contoh:
Authorization: Bearer 1|abcdefghijklmnopqrstuvwxyz1234567890
Sekarang Anda bisa mengirimkan request ke endpoint
/api/products
dan melihat daftar produk, membuat produk baru, mengedit produk, atau menghapus produk.
8. Optimasi dan Keamanan Tambahan untuk REST API Anda
Setelah Anda berhasil membuat REST API sederhana dengan Laravel Sanctum, ada beberapa langkah optimasi dan keamanan tambahan yang bisa Anda terapkan:
- Rate Limiting: Terapkan rate limiting untuk mencegah penyalahgunaan API. Anda bisa menggunakan middleware
throttle
di Laravel. - Validasi Input yang Lebih Ketat: Pastikan Anda memvalidasi semua input yang masuk ke API Anda untuk mencegah serangan injection atau data yang tidak valid.
- HTTPS: Pastikan API Anda menggunakan HTTPS untuk mengenkripsi komunikasi antara client dan server.
- CORS: Konfigurasi CORS (Cross-Origin Resource Sharing) untuk mengontrol domain mana yang diizinkan mengakses API Anda.
- Logging: Aktifkan logging untuk memantau aktivitas API dan mendeteksi potensi masalah atau serangan.
- Penggunaan DTO (Data Transfer Object): Implementasikan DTO untuk standarisasi data yang ditransfer antara layer aplikasi. Ini membuat kode lebih mudah dibaca, dipelihara, dan diuji.
- Paginasi: Implementasikan paginasi untuk response API yang besar. Ini akan meningkatkan performa dan pengalaman pengguna. Gunakan method
paginate()
pada Eloquent. - Caching: Gunakan caching untuk menyimpan data yang sering diakses. Ini akan mengurangi beban database dan mempercepat response API.
9. Dokumentasi API Menggunakan Swagger/OpenAPI
Dokumentasi API sangat penting agar developer lain bisa memahami cara menggunakan API Anda dengan benar. Salah satu cara terbaik untuk mendokumentasikan API adalah dengan menggunakan Swagger/OpenAPI.
-
Instal Package Swagger: Gunakan package
darkaonline/l5-swagger
untuk mengintegrasikan Swagger ke dalam proyek Laravel Anda.composer require darkaonline/l5-swagger
-
Konfigurasi L5-Swagger: Publikasikan konfigurasi:
php artisan vendor:publish --provider "L5SwaggerL5SwaggerServiceProvider"
-
Tambahkan Annotations: Tambahkan annotations Swagger ke controller dan model Anda untuk mendeskripsikan endpoint, request, dan response API. Contoh:
/** * @OAGet( * path="/api/products", * summary="Get list of products", * @OAResponse(response="200", description="Success") * ) */ public function index() { // ... }
-
Generate Dokumentasi Swagger: Jalankan perintah berikut untuk menghasilkan dokumentasi Swagger:
php artisan l5-swagger:generate
-
Akses Dokumentasi: Buka
/api/documentation
di browser Anda untuk melihat dokumentasi Swagger API Anda.
Dengan dokumentasi Swagger, developer lain bisa dengan mudah memahami dan menggunakan API Anda.
10. Kesimpulan: Membangun API yang Kuat dan Terpercaya
Dalam tutorial membuat REST API sederhana dengan Laravel Sanctum ini, kita telah membahas langkah demi langkah cara membangun API yang sederhana, aman, dan mudah digunakan. Kita telah membahas instalasi Laravel, konfigurasi Sanctum, pembuatan controller dan model, implementasi operasi CRUD, perlindungan route dengan Sanctum, dan pengujian API. Kita juga telah membahas optimasi dan keamanan tambahan, serta dokumentasi API menggunakan Swagger.
Dengan mengikuti tutorial ini, Anda seharusnya sudah memiliki dasar yang kuat untuk membuat REST API sederhana dengan Laravel Sanctum. Anda bisa mengembangkan API ini lebih lanjut dengan menambahkan fitur-fitur lain, seperti autentikasi OAuth, notifikasi push, atau integrasi dengan layanan pihak ketiga. Selamat mencoba dan semoga berhasil!