Laravel Sanctum adalah paket autentikasi ringan untuk aplikasi web single-page, aplikasi seluler, dan API berbasis token. Dengan Sanctum, Anda dapat dengan mudah membuat sistem login yang aman dan terjamin untuk website Anda, tanpa harus berurusan dengan kompleksitas OAuth2 atau JWT. Artikel ini akan memandu Anda langkah demi langkah tentang cara membuat sistem login dengan Laravel Sanctum, memastikan keamanan website terjamin.
1. Pengantar Laravel Sanctum: Apa Itu dan Mengapa Harus Menggunakannya?
Laravel Sanctum, dulunya dikenal sebagai Laravel Airlock, menawarkan pendekatan sederhana dan fleksibel untuk autentikasi. Berbeda dengan sistem autentikasi berbasis token yang lebih kompleks seperti OAuth2, Sanctum fokus pada penggunaan session cookie dan Personal Access Token (PAT) untuk autentikasi.
Mengapa Memilih Laravel Sanctum?
- Sederhana dan Mudah Digunakan: Sanctum sangat mudah dikonfigurasi dan digunakan, bahkan untuk pemula Laravel.
- Ringan dan Cepat: Tidak seperti implementasi autentikasi yang lebih berat, Sanctum minim dan efisien.
- Keamanan Terjamin: Sanctum memanfaatkan session cookie dan enkripsi untuk memastikan keamanan autentikasi.
- Cocok untuk Berbagai Jenis Aplikasi: Ideal untuk SPA, aplikasi mobile, dan API.
- Support Personal Access Tokens (PAT): Memungkinkan pengguna membuat token untuk mengakses API Anda, misalnya untuk integrasi dengan pihak ketiga.
- CSRF Protection: Terintegrasi dengan proteksi CSRF bawaan Laravel.
Singkatnya, Sanctum adalah pilihan yang sangat baik jika Anda mencari solusi autentikasi yang sederhana, aman, dan terpercaya untuk website Anda. Sekarang mari kita masuk ke langkah-langkah implementasinya.
2. Persiapan Awal: Instalasi Laravel dan Konfigurasi Database
Sebelum memulai implementasi sistem login dengan Laravel Sanctum, pastikan Anda memiliki proyek Laravel yang sudah berjalan. Jika belum, Anda dapat membuatnya dengan perintah berikut:
composer create-project laravel/laravel nama-proyek
Ganti nama-proyek dengan nama proyek yang Anda inginkan. Setelah proyek Laravel berhasil dibuat, langkah selanjutnya adalah konfigurasi database.
Konfigurasi Database:
-
Buka file
.envdi direktori proyek Anda. -
Cari variabel-variabel berikut dan sesuaikan dengan konfigurasi database Anda:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=nama_pengguna DB_PASSWORD=kata_sandi
Ganti nama_database, nama_pengguna, dan kata_sandi dengan kredensial database Anda. Pastikan database sudah dibuat di MySQL atau sistem database yang Anda gunakan.
3. Instalasi dan Konfigurasi Laravel Sanctum: Langkah Demi Langkah
Setelah database dikonfigurasi, saatnya untuk menginstal Laravel Sanctum. Buka terminal dan jalankan perintah berikut di direktori proyek Anda:
composer require laravel/sanctum
Setelah instalasi selesai, Anda perlu mempublikasikan konfigurasi dan melakukan migrasi database. Jalankan perintah berikut:
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
php artisan migrate
Perintah php artisan vendor:publish akan menyalin file konfigurasi Sanctum ke direktori config/sanctum.php. File ini berisi opsi konfigurasi yang dapat Anda sesuaikan.
Perintah php artisan migrate akan membuat tabel yang dibutuhkan oleh Sanctum di database Anda, termasuk tabel personal_access_tokens untuk menyimpan Personal Access Tokens.
Terakhir, tambahkan HasApiTokens trait ke model User Anda (terletak di app/Models/User.php):
<?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 ...
}
Pastikan Anda sudah memiliki model User yang benar dan memiliki migrasi yang sesuai. Jika belum, Anda bisa membuat model dan migrasi dengan perintah php artisan make:model User -m.
4. Membuat Route dan Controller untuk Login dan Register
Selanjutnya, kita akan membuat route dan controller untuk menangani proses login dan registrasi. Pertama, buat controller dengan perintah:
php artisan make:controller AuthController
Buka file app/Http/Controllers/AuthController.php dan tambahkan kode berikut:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesHash;
use AppModelsUser;
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([
'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()->tokens()->delete();
return response()->json([
'message' => 'Successfully logged out'
]);
}
}
Kode di atas berisi fungsi untuk:
- register: Menerima input nama, email, dan password, memvalidasinya, membuat user baru, dan menghasilkan token autentikasi.
- login: Menerima input email dan password, memvalidasi kredensial, dan menghasilkan token autentikasi jika login berhasil.
- logout: Menghapus semua token autentikasi user saat ini.
Selanjutnya, definisikan route untuk fungsi-fungsi ini di routes/api.php:
<?php
use AppHttpControllersAuthController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesRoute;
/*
|--------------------------------------------------------------------------
| 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::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 middleware auth:sanctum untuk melindungi route yang membutuhkan autentikasi, seperti /user dan /logout.
5. Membuat Middleware EnsureEmailIsVerified: Tambahan Keamanan
Jika Anda ingin memastikan bahwa pengguna telah memverifikasi email mereka sebelum dapat mengakses fitur-fitur tertentu, Anda dapat membuat middleware EnsureEmailIsVerified. Pertama, buat middleware:
php artisan make:middleware EnsureEmailIsVerified
Buka file app/Http/Middleware/EnsureEmailIsVerified.php dan tambahkan kode berikut:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
class EnsureEmailIsVerified
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure(IlluminateHttpRequest): (IlluminateHttpResponse|IlluminateHttpRedirectResponse) $next
* @return IlluminateHttpResponse|IlluminateHttpRedirectResponse
*/
public function handle(Request $request, Closure $next)
{
if (! Auth::user()->hasVerifiedEmail()) {
return response()->json(['message' => 'Email belum diverifikasi.'], 403);
}
return $next($request);
}
}
Kemudian, daftarkan middleware ini di app/Http/Kernel.php di dalam $routeMiddleware array:
protected $routeMiddleware = [
'auth' => AppHttpMiddlewareAuthenticate::class,
'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class,
'can' => IlluminateAuthMiddlewareAuthorize::class,
'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
'verified' => IlluminateAuthMiddlewareEnsureEmailIsVerified::class, // Ditambahkan disini
'ensure.email.is.verified' => AppHttpMiddlewareEnsureEmailIsVerified::class, // Tambahkan alias
];
Sekarang, Anda dapat menggunakan middleware ini di route Anda:
Route::middleware(['auth:sanctum', 'ensure.email.is.verified'])->group(function () {
Route::get('/profile', function (Request $request) {
return $request->user();
});
});
Pastikan juga bahwa model User mengimplementasikan interface MustVerifyEmail:
<?php
namespace AppModels;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use LaravelSanctumHasApiTokens;
class User extends Authenticatable implements MustVerifyEmail // Implements MustVerifyEmail
{
use HasApiTokens, HasFactory, Notifiable;
// ... kode lainnya ...
}
Dan aktifkan fitur verifikasi email di EventServiceProvider.php:
/**
* The event listener mappings for the application.
*
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
6. Implementasi di Frontend: Integrasi dengan Aplikasi SPA
Setelah backend selesai, langkah selanjutnya adalah mengintegrasikan sistem login ini dengan frontend aplikasi Anda. Asumsikan Anda menggunakan aplikasi SPA (Single Page Application) seperti React, Vue.js, atau Angular.
Alur Kerja:
- Form Login dan Register: Buat form login dan register di frontend Anda.
- Kirim Request ke API: Ketika form disubmit, kirim request POST ke endpoint
/api/registeratau/api/login. - Simpan Token: Jika request berhasil, simpan token yang diterima (dalam format
Bearer) di local storage atau cookie. - Sertakan Token di Header: Setiap kali Anda mengirim request ke API yang membutuhkan autentikasi, sertakan token di header
Authorizationdengan formatBearer <token>.
Contoh dengan JavaScript:
// Contoh Login
fetch('/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: '[email protected]',
password: 'password'
})
})
.then(response => response.json())
.then(data => {
if (data.access_token) {
localStorage.setItem('token', data.access_token);
// Redirect ke halaman yang dilindungi
} else {
// Tampilkan pesan error
}
});
// Contoh Mengakses Endpoint yang Dilindungi
fetch('/api/user', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token')
}
})
.then(response => response.json())
.then(data => {
// Tampilkan data user
});
// Contoh Logout
fetch('/api/logout', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token')
}
})
.then(response => response.json())
.then(data => {
localStorage.removeItem('token');
// Redirect ke halaman login
});
Pastikan Anda menyesuaikan kode di atas dengan framework JavaScript yang Anda gunakan.
7. Keamanan Tambahan: Proteksi CSRF dan Rate Limiting
CSRF Protection:
Laravel Sanctum secara otomatis menyediakan proteksi CSRF saat digunakan dengan session cookie. Pastikan Anda telah mengkonfigurasi CSRF token dengan benar di aplikasi frontend Anda.
Rate Limiting:
Untuk mencegah serangan brute-force, Anda dapat mengimplementasikan rate limiting pada endpoint login. Laravel menyediakan middleware throttle untuk melakukan ini.
Contoh:
Route::middleware('throttle:5,1')->group(function () {
Route::post('/login', [AuthController::class, 'login']);
});
Kode di atas akan membatasi jumlah request ke endpoint /login menjadi 5 kali per menit.
8. Menggunakan Personal Access Tokens (PAT)
Selain autentikasi berbasis session cookie, Sanctum juga mendukung penggunaan Personal Access Tokens (PAT). PAT memungkinkan pengguna membuat token yang dapat digunakan untuk mengakses API Anda.
Membuat PAT:
Anda dapat membuat PAT melalui controller atau model. Contoh melalui controller:
public function createToken(Request $request)
{
$token = $request->user()->createToken($request->token_name);
return ['token' => $token->plainTextToken];
}
Menggunakan PAT:
Sertakan token yang dihasilkan di header Authorization dengan format Bearer <token>.
Revoking PAT:
Anda dapat mencabut PAT dengan menghapusnya dari database.
9. Tips Optimasi Keamanan Laravel Sanctum
Berikut beberapa tips untuk meningkatkan keamanan implementasi Laravel Sanctum Anda:
- Gunakan HTTPS: Pastikan website Anda menggunakan HTTPS untuk mengenkripsi semua komunikasi antara browser dan server.
- Validasi Input: Selalu validasi semua input yang diterima dari pengguna untuk mencegah serangan injection.
- Hash Password: Gunakan fungsi hashing yang kuat (seperti bcrypt) untuk mengenkripsi password pengguna.
- Proteksi CSRF: Aktifkan proteksi CSRF untuk semua form dan request AJAX.
- Rate Limiting: Implementasikan rate limiting pada endpoint login dan endpoint sensitif lainnya.
- Regular Updates: Selalu update Laravel dan paket-paket yang Anda gunakan ke versi terbaru untuk mendapatkan patch keamanan terbaru.
- Monitor Logs: Periksa logs secara berkala untuk mendeteksi aktivitas mencurigakan.
- Gunakan API Gateway (Optional): Jika Anda memiliki banyak microservices, pertimbangkan untuk menggunakan API gateway untuk mengelola autentikasi dan otorisasi.
10. Troubleshooting Masalah Umum dengan Laravel Sanctum
Berikut beberapa masalah umum yang sering terjadi saat menggunakan Laravel Sanctum dan cara mengatasinya:
- Token Tidak Tersimpan di Local Storage: Pastikan Anda menyimpan token dengan benar di local storage atau cookie. Periksa console browser untuk melihat apakah ada error JavaScript.
- 401 Unauthorized: Pastikan Anda menyertakan token yang benar di header
Authorization. Periksa apakah token sudah kadaluarsa atau telah dicabut. - CSRF Token Mismatch: Pastikan Anda telah mengkonfigurasi CSRF token dengan benar di aplikasi frontend Anda.
- Session Cookie Tidak Dibuat: Pastikan konfigurasi session cookie sudah benar di file
config/session.php. - Middleware
auth:sanctumTidak Bekerja: Pastikan Anda telah menginstal dan mengkonfigurasi Laravel Sanctum dengan benar. Periksa apakah modelUsermenggunakan traitHasApiTokens.
11. Kesimpulan: Sistem Login Aman dan Mudah dengan Laravel Sanctum
Laravel Sanctum adalah pilihan yang sangat baik untuk membuat sistem login yang aman dan mudah untuk website Anda. Dengan mengikuti langkah-langkah yang dijelaskan dalam artikel ini, Anda dapat dengan mudah mengintegrasikan Sanctum ke dalam proyek Laravel Anda dan memastikan keamanan website terjamin. Ingatlah untuk selalu mengikuti praktik-praktik keamanan terbaik dan memantau logs secara berkala untuk mendeteksi aktivitas mencurigakan. Dengan implementasi yang tepat, Laravel Sanctum akan memberikan solusi autentikasi yang handal dan efisien.
Dengan pemahaman mendalam tentang cara membuat sistem login dengan Laravel Sanctum dan implementasi praktik keamanan yang baik, Anda dapat membangun aplikasi web yang tidak hanya fungsional tetapi juga aman dan terpercaya. Selamat mencoba!