Cara Implementasi JWT Authentication di Laravel

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.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top