Oke, siap! Berikut adalah artikel SEO tentang “Laravel Sanctum Tutorial: Implementasi Authentication API dengan Laravel Sanctum” dalam bahasa Indonesia, mengikuti semua instruksi yang telah diberikan.
Laravel Sanctum adalah solusi authentication API yang ringan dan sederhana untuk aplikasi Laravel. Dalam tutorial ini, kita akan membahas secara mendalam bagaimana cara mengimplementasikan authentication API dengan Laravel Sanctum, langkah demi langkah. Apakah kamu ingin membuat aplikasi web atau mobile yang aman dengan API backend Laravel? Kalau iya, kamu berada di tempat yang tepat!
Apa itu Laravel Sanctum dan Mengapa Harus Menggunakannya?
Sebelum kita mulai masuk ke kode, mari kita pahami dulu apa itu Laravel Sanctum. Sederhananya, Laravel Sanctum menyediakan sistem authentication berbasis token yang sangat cocok untuk:
- Single-Page Applications (SPAs): Jika kamu membangun aplikasi frontend dengan Vue, React, atau Angular dan membutuhkan API backend Laravel.
- Mobile Applications: Untuk aplikasi iOS dan Android yang berkomunikasi dengan server Laravel.
- Simple APIs: Ketika kamu tidak membutuhkan fitur-fitur kompleks dari sistem authentication berbasis OAuth2 seperti Laravel Passport.
Keuntungan Menggunakan Laravel Sanctum:
- Mudah Diimplementasikan: Konfigurasi dan penggunaan Sanctum relatif lebih sederhana dibandingkan Laravel Passport.
- Ringan: Meminimalkan overhead dibandingkan solusi authentication yang lebih kompleks.
- Aman: Sanctum dirancang dengan mempertimbangkan keamanan, menggunakan token yang dienkripsi dan cookies untuk session management.
- Stateful Authentication: Mendukung authentication stateful menggunakan cookies dan sessions, ideal untuk aplikasi web.
- Token-Based Authentication: Mendukung authentication token-based untuk API yang digunakan oleh aplikasi mobile atau pihak ketiga.
Singkatnya, Laravel Sanctum adalah pilihan yang tepat jika kamu membutuhkan solusi authentication API yang cepat, mudah, dan aman untuk aplikasi Laravel kamu.
Persiapan Awal: Instalasi dan Konfigurasi Laravel Sanctum
Sebelum kita mulai coding, pastikan kamu sudah memiliki proyek Laravel yang berjalan. Jika belum, kamu bisa membuat proyek baru dengan perintah:
composer create-project --prefer-dist laravel/laravel sanctum-example
cd sanctum-example
Setelah proyek Laravel kamu siap, langkah selanjutnya adalah menginstal Laravel Sanctum menggunakan Composer:
composer require laravel/sanctum
Setelah proses instalasi selesai, kamu perlu melakukan beberapa konfigurasi:
-
Publish Konfigurasi Sanctum:
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Perintah ini akan membuat file konfigurasi
config/sanctum.php
. Kamu bisa menyesuaikan konfigurasi di file ini sesuai kebutuhan. Biasanya, konfigurasi default sudah cukup untuk kebanyakan kasus. -
Migrasi Database:
Sanctum membutuhkan tabel database untuk menyimpan personal access token. Jalankan perintah migrasi:
php artisan migrate
Pastikan konfigurasi database di
.env
sudah benar sebelum menjalankan perintah ini. -
Konfigurasi Model User:
Buka model
AppModelsUser
kamu dan tambahkanHasApiTokens
trait 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; // ... kode lainnya ... }
HasApiTokens
trait ini akan menambahkan beberapa method yang diperlukan untuk mengelola token pada modelUser
.
Membuat Endpoint API untuk Registrasi dan Login dengan Sanctum
Sekarang, mari kita buat endpoint API untuk registrasi dan login. Kita akan menggunakan controller untuk menangani logika ini.
-
Buat Controller:
Buat controller baru bernama
AuthController
menggunakan perintah:php artisan make:controller AuthController
-
Kode Controller:
Buka
app/Http/Controllers/AuthController.php
dan tambahkan kode berikut:<?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|confirmed', ]); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 422); } $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), 'remember_token' => Str::random(10), ]); $token = $user->createToken('auth_token')->plainTextToken; return response()->json([ 'data' => $user, '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(['errors' => $validator->errors()], 422); } $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([ 'data' => $user, 'access_token' => $token, 'token_type' => 'Bearer', ]); } public function logout(Request $request) { $request->user()->currentAccessToken()->delete(); return response()->json([ 'message' => 'Successfully logged out' ]); } }
Penjelasan Kode:
register()
: Menerima data registrasi (nama, email, password), melakukan validasi, membuat user baru, dan menghasilkan token menggunakancreateToken()
. Token ini kemudian dikembalikan dalam response.login()
: Menerima data login (email, password), melakukan validasi, memeriksa apakah user ada dan password cocok. Jika berhasil, menghasilkan token dan mengembalikannya dalam response.logout()
: Menerima request, menghapus token saat ini yang digunakan oleh user, dan mengembalikan pesan sukses.
-
Definisikan Routes:
Buka
routes/api.php
dan tambahkan route berikut:<?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']); });
Penjelasan Kode:
/register
dan/login
route terhubung ke methodregister()
danlogin()
diAuthController
./user
route dan/logout
route berada di dalam middleware groupauth:sanctum
. Ini berarti route ini memerlukan authentication menggunakan Sanctum./user
akan mengembalikan informasi user yang sedang login.
Mengamankan Endpoint API dengan Laravel Sanctum Middleware
Seperti yang kita lihat di route di atas, kita menggunakan middleware auth:sanctum
untuk mengamankan endpoint /user
dan /logout
. Middleware ini secara otomatis akan memvalidasi token yang dikirimkan dalam header request.
Bagaimana Cara Kerja Middleware auth:sanctum
?
- Sanctum akan mencari token di header
Authorization
dengan formatBearer <token>
. - Jika token ditemukan, Sanctum akan mencari personal access token yang sesuai di database.
- Jika token valid, Sanctum akan meng- authenticate user dan mengizinkan akses ke route.
- Jika token tidak valid atau tidak ditemukan, Sanctum akan mengembalikan response
401 Unauthorized
.
Implementasi Logout API dengan Revoking Token
Method logout()
di AuthController
kita menggunakan currentAccessToken()->delete()
untuk menghapus token yang sedang digunakan. Ini adalah cara yang tepat untuk logout dari aplikasi karena hanya token yang digunakan saat ini yang dihapus. Ini memungkinkan user untuk tetap login di perangkat lain.
Opsi Lain untuk Revoking Token:
- Menghapus Semua Token User: Kamu bisa menggunakan
$request->user()->tokens()->delete()
untuk menghapus semua token yang dimiliki oleh user. Ini akan memaksa user untuk logout dari semua perangkat. - Menghapus Token Tertentu: Kamu bisa menggunakan
$token->delete()
untuk menghapus token tertentu berdasarkan ID.
Pengujian API Authentication dengan Postman atau Insomnia
Sekarang kita telah membuat endpoint API, saatnya untuk mengujinya. Kamu bisa menggunakan aplikasi seperti Postman atau Insomnia untuk mengirimkan request ke API kita.
Langkah-langkah Pengujian:
-
Register: Kirim request
POST
ke/api/register
dengan data seperti:{ "name": "John Doe", "email": "[email protected]", "password": "password", "password_confirmation": "password" }
Kamu akan menerima response JSON yang berisi data user, access token, dan token type.
-
Login: Kirim request
POST
ke/api/login
dengan data seperti:{ "email": "[email protected]", "password": "password" }
Kamu akan menerima response JSON yang mirip dengan response registrasi.
-
Get User: Kirim request
GET
ke/api/user
. Pastikan untuk menambahkan headerAuthorization
dengan nilaiBearer <access_token>
(ganti<access_token>
dengan token yang kamu terima dari response registrasi atau login). Kamu akan menerima response JSON yang berisi data user yang sedang login. -
Logout: Kirim request
POST
ke/api/logout
. Pastikan untuk menambahkan headerAuthorization
seperti pada langkah sebelumnya. Kamu akan menerima response JSON yang berisi pesan sukses.
Menggunakan Laravel Sanctum dengan Single-Page Applications (SPAs)
Salah satu kasus penggunaan utama Laravel Sanctum adalah dengan Single-Page Applications (SPAs). Untuk menggunakannya dengan SPA, kamu perlu memastikan bahwa:
- Frontend kamu menyimpan token dengan aman (biasanya di local storage atau cookies).
- Frontend kamu menambahkan header
Authorization
dengan token yang sesuai setiap kali mengirimkan request ke API.
Contoh Kode JavaScript (menggunakan Axios):
import axios from 'axios';
// Fungsi untuk menyimpan token
function setToken(token) {
localStorage.setItem('access_token', token);
}
// Fungsi untuk mendapatkan token
function getToken() {
return localStorage.getItem('access_token');
}
// Fungsi untuk menghapus token
function removeToken() {
localStorage.removeItem('access_token');
}
// Konfigurasi Axios
axios.defaults.baseURL = '/api';
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
// Interceptor untuk menambahkan header Authorization
axios.interceptors.request.use(function (config) {
const token = getToken();
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
}, function (error) {
return Promise.reject(error);
});
// Contoh penggunaan untuk mendapatkan data user
axios.get('/user')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
Konfigurasi CORS:
Pastikan kamu telah mengkonfigurasi CORS (Cross-Origin Resource Sharing) dengan benar agar aplikasi frontend kamu dapat mengakses API backend kamu. Kamu bisa mengkonfigurasi CORS di file config/cors.php
. Atau menggunakan package fruitcake/laravel-cors
.
Integrasi Laravel Sanctum dengan Aplikasi Mobile (Android & iOS)
Laravel Sanctum juga sangat cocok untuk aplikasi mobile. Caranya hampir sama dengan SPA, hanya saja kamu perlu menyimpan token di tempat yang aman di perangkat mobile (misalnya, menggunakan secure storage).
Pertimbangan Keamanan untuk Aplikasi Mobile:
- Gunakan Secure Storage: Jangan simpan token di plain text. Gunakan secure storage yang disediakan oleh platform mobile (Android Keystore, iOS Keychain).
- Refresh Token: Pertimbangkan untuk menggunakan refresh token untuk memperpanjang masa berlaku access token tanpa meminta user untuk login ulang. Ini bisa meningkatkan user experience dan keamanan.
- SSL/TLS: Pastikan semua komunikasi antara aplikasi mobile dan server menggunakan SSL/TLS untuk mengenkripsi data.
Customisasi dan Konfigurasi Lanjutan Laravel Sanctum
Laravel Sanctum menawarkan beberapa opsi konfigurasi lanjutan untuk menyesuaikan perilaku authentication sesuai kebutuhan kamu.
- Token Expiration: Kamu bisa mengatur masa berlaku token di file
config/sanctum.php
dengan mengubah nilaiexpiration
. - Token Name: Kamu bisa mengubah nama token yang digunakan oleh Sanctum dengan mengubah nilai
token_name
. - Hashing Algorithm: Kamu bisa mengubah algoritma hashing yang digunakan untuk menyimpan token di database dengan mengubah nilai
hashing_algorithm
. - Custom Guard: Kamu bisa membuat custom guard untuk Sanctum jika kamu memiliki kebutuhan authentication yang sangat spesifik.
Troubleshooting dan Solusi untuk Masalah Umum Laravel Sanctum
Berikut adalah beberapa masalah umum yang mungkin kamu temui saat menggunakan Laravel Sanctum dan solusinya:
- 401 Unauthorized: Pastikan token yang kamu kirimkan valid dan belum expired. Periksa juga apakah kamu telah mengkonfigurasi CORS dengan benar.
- Token Mismatch: Pastikan kamu menggunakan token yang benar untuk user yang sedang login.
- Session Issues: Jika kamu menggunakan stateful authentication, pastikan konfigurasi session kamu benar dan cookie diatur dengan benar.
- CSRF Token Mismatch: Jika kamu menggunakan stateful authentication dengan SPA, pastikan kamu mengirimkan CSRF token di header request. Laravel sudah menyediakan fitur ini, biasanya dengan menggunakan package
laravel/fortify
.
Kesimpulan: Mengamankan Aplikasi Anda dengan Laravel Sanctum
Laravel Sanctum adalah solusi authentication API yang sangat baik untuk aplikasi Laravel. Dengan kemudahan implementasi dan fitur-fitur keamanan yang ditawarkan, Sanctum adalah pilihan yang tepat untuk mengamankan aplikasi web dan mobile kamu. Tutorial ini telah membahas langkah-langkah dasar implementasi Laravel Sanctum, mulai dari instalasi dan konfigurasi hingga pembuatan endpoint API dan pengujian. Dengan pemahaman yang baik tentang konsep dan implementasi Laravel Sanctum, kamu dapat membangun aplikasi yang aman dan skalabel. Jangan ragu untuk menjelajahi dokumentasi resmi Laravel Sanctum untuk mempelajari lebih lanjut tentang fitur-fitur dan opsi konfigurasi yang tersedia.
Semoga tutorial ini bermanfaat! Selamat mencoba dan semoga berhasil!