
Cara Implementasi JWT Authentication di Laravel – Keamanan merupakan aspek penting dalam pengembangan aplikasi web modern, terutama pada bagian autentikasi dan manajemen akses. Salah satu metode populer untuk mengamankan API adalah menggunakan JSON Web Token (JWT). JWT memungkinkan pertukaran data secara aman antar server dan client dengan mekanisme token yang ringan, efisien, dan mudah digunakan pada aplikasi berbasis REST API maupun SPA (Single Page Application) seperti Vue, React, atau mobile apps.
Pada framework Laravel, implementasi JWT dapat dilakukan dengan memanfaatkan package pihak ketiga seperti tymon/jwt-auth yang sudah banyak digunakan dan mudah diintegrasikan. Artikel ini akan membahas langkah-langkah lengkap cara implementasi JWT Authentication di Laravel mulai dari instalasi hingga pengujian endpoint.
Apa Itu JWT?
JWT (JSON Web Token) adalah format token berbasis JSON yang digunakan untuk mengirimkan informasi aman antara dua pihak. JWT dikodekan menggunakan algoritma kriptografi seperti HS256 atau RS256. Token ini biasanya dikirim melalui header Authorization dengan format Bearer <token>.
JWT terdiri dari tiga bagian utama:
- Header – berisi metadata token (algoritma dan tipe token)
- Payload – berisi data pengguna atau klaim
- Signature – digunakan untuk validasi keaslian token
Kelebihan JWT:
- Tidak memerlukan penyimpanan session di server
- Cocok untuk aplikasi mobile & SPA
- Mudah digunakan dalam arsitektur microservices
Instalasi Paket JWT di Laravel
Sebelum mulai, pastikan Laravel sudah terinstal. Selanjutnya pasang package JWT berikut melalui Composer:
composer require tymon/jwt-auth
Setelah selesai, publish file konfigurasi JWT:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Generate secret key untuk token:
php artisan jwt:secret
Perintah di atas akan menambahkan secret key pada file .env untuk kebutuhan enkripsi.
Konfigurasi Model User
Agar Laravel dapat mengenali token saat proses login dan verifikasi, tambahkan trait JWT ke model User:
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
}
Trait ini menentukan bagaimana suatu user menghasilkan token JWT dan klaim tambahan.
Membuat Auth Controller untuk Login, Register, dan Logout
Selanjutnya buat controller untuk proses autentikasi:
php artisan make:controller AuthController
Isi controller dengan fungsi login, register, dan logout:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class AuthController extends Controller
{
public function register(Request $request)
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password)
]);
return response()->json(['message' => 'User registered successfully']);
}
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Invalid credentials'], 401);
}
return response()->json([
'token' => $token
]);
}
public function logout()
{
JWTAuth::invalidate(JWTAuth::getToken());
return response()->json(['message' => 'Successfully logged out']);
}
}
Menambahkan Middleware Proteksi Route
Daftarkan middleware JWT pada app/Http/Kernel.php:
'jwt.verify' => \App\Http\Middleware\JwtMiddleware::class,
Buat middleware:
php artisan make:middleware JwtMiddleware
Isi middleware:
<?php
namespace App\Http\Middleware;
use Closure;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class JwtMiddleware
{
public function handle($request, Closure $next)
{
try {
$user = JWTAuth::parseToken()->authenticate();
} catch (JWTException $e) {
return response()->json(['error' => 'Token is invalid or expired'], 401);
}
return $next($request);
}
}
Konfigurasi Route API
Edit file routes/api.php:
use App\Http\Controllers\AuthController;
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
Route::middleware('jwt.verify')->group(function () {
Route::post('logout', [AuthController::class, 'logout']);
Route::get('user', function () {
return auth()->user();
});
});
Pengujian Endpoint JWT
Anda dapat menggunakan Postman, Insomnia, atau Thunder Client untuk mencoba API berikut:
Register
POST /api/register
Body (JSON):
{
"name": "User Test",
"email": "test@mail.com",
"password": "123456"
}
Login
POST /api/login
Response akan memberikan:
{
"token": "eyJ0eXAiOiJKV1QiLCJh..."
}
Akses endpoint protected
Tambahkan header:
Authorization: Bearer <token>
Kesimpulan
Implementasi JWT Authentication di Laravel merupakan solusi tepat untuk aplikasi modern berbasis API karena memiliki keunggulan berupa keamanan tinggi, fleksibilitas, serta tidak memerlukan penyimpanan session pada server. Dengan package tymon/jwt-auth, proses instalasi dan konfigurasi menjadi lebih mudah, termasuk pembuatan token, autentikasi pengguna, serta proteksi route.
Dengan mengikuti langkah-langkah mulai dari instalasi package, konfigurasi model, pembuatan controller, middleware, hingga pengujian API, Anda dapat membangun sistem login yang aman dan efisien untuk aplikasi skala kecil hingga besar.