Implementasi JWT untuk API di CodeIgniter 4

Implementasi JWT untuk API di CodeIgniter 4

JSON Web Token (JWT) adalah standar yang digunakan untuk membuat token aman dalam proses autentikasi dan otorisasi API. Dalam artikel ini, kita akan mempelajari bagaimana menerapkan JWT di CodeIgniter 4 untuk mengamankan API.

1. Apa Itu JSON Web Token (JWT)?

JWT adalah token yang dienkripsi dalam format JSON dan sering digunakan untuk autentikasi pengguna dalam API. Token JWT berisi tiga bagian:

  • Header: Informasi tentang algoritma enkripsi.
  • Payload: Data atau klaim yang akan dikirimkan, seperti ID pengguna.
  • Signature: Tanda tangan untuk memverifikasi token.

2. Instalasi Library JWT

Kita akan menggunakan library firebase/php-jwt untuk mengelola JWT di CodeIgniter 4. Instal library ini melalui Composer:

composer require firebase/php-jwt

3. Konfigurasi JWT

Buat file konfigurasi untuk menyimpan secret key JWT. Buat file baru di app/Config/JWT.php:

<?php
namespace Config;

class JWT {
    public static $secretKey = 'your_secret_key'; // Ganti dengan secret key Anda
    public static $tokenExpiration = 3600; // Waktu kadaluarsa dalam detik
}
?>

4. Membuat Controller untuk Login dan Token

Kita akan membuat controller yang bertanggung jawab untuk menghasilkan token JWT ketika pengguna berhasil login. Buat file baru di app/Controllers/Api/Auth.php:

<?php
namespace App\Controllers\Api;

use CodeIgniter\RESTful\ResourceController;
use \Firebase\JWT\JWT;
use Config\JWT as JWTConfig;
use App\Models\UserModel;

class Auth extends ResourceController {
    public function login() {
        $model = new UserModel();

        $email = $this->request->getVar('email');
        $password = $this->request->getVar('password');

        $user = $model->where('email', $email)->first();

        if (!$user || !password_verify($password, $user['password'])) {
            return $this->failUnauthorized('Email atau password salah.');
        }

        // Membuat payload token
        $payload = [
            'iat' => time(), // Waktu token dibuat
            'exp' => time() + JWTConfig::$tokenExpiration, // Waktu kadaluarsa token
            'sub' => $user['id'], // ID pengguna
            'email' => $user['email']
        ];

        // Generate token
        $token = JWT::encode($payload, JWTConfig::$secretKey, 'HS256');

        return $this->respond([
            'status' => 'success',
            'message' => 'Login berhasil',
            'token' => $token
        ]);
    }
}
?>

5. Middleware untuk Validasi JWT

Kita perlu membuat filter atau middleware untuk memvalidasi token JWT di setiap request API. Buat file baru di app/Filters/JwtAuth.php:

<?php
namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;
use \Firebase\JWT\JWT;
use Config\JWT as JWTConfig;

class JwtAuth implements FilterInterface {
    public function before(RequestInterface $request, $arguments = null) {
        $authHeader = $request->getServer('HTTP_AUTHORIZATION');

        if (!$authHeader) {
            return service('response')
                ->setJSON(['message' => 'Token tidak ditemukan'])
                ->setStatusCode(401);
        }

        $token = explode(' ', $authHeader)[1];

        try {
            JWT::decode($token, JWTConfig::$secretKey, ['HS256']);
        } catch (\Exception $e) {
            return service('response')
                ->setJSON(['message' => 'Token tidak valid', 'error' => $e->getMessage()])
                ->setStatusCode(401);
        }
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) {
        // Tidak diperlukan
    }
}
?>

6. Menambahkan Filter di Konfigurasi

Tambahkan filter JWT di file app/Config/Filters.php:

'filters' => [
    'jwtAuth' => ['before' => ['api/*']]
]

7. Menambahkan Rute API

Tambahkan rute untuk login dan proteksi API di file app/Config/Routes.php:

$routes->group('api', function($routes) {
    $routes->post('login', 'Api\Auth::login');
    $routes->get('protected', 'Api\Protected::index', ['filter' => 'jwtAuth']);
});

8. Pengujian API

Gunakan Postman untuk menguji API. Kirimkan permintaan POST /api/login dengan body JSON berikut:

{
    "email": "admin@example.com",
    "password": "password123"
}

Token akan dikembalikan jika login berhasil. Gunakan token tersebut di Header Authorization untuk mengakses endpoint yang dilindungi:

Authorization: Bearer <token>

Kesimpulan

Dengan JWT di CodeIgniter 4, Anda dapat membuat autentikasi API yang aman dan mudah diimplementasikan. JWT memastikan bahwa hanya pengguna yang memiliki token valid yang dapat mengakses endpoint API tertentu.

Check Also

Migrasi Database dengan CodeIgniter 4

Migrasi Database dengan CodeIgniter 4 CodeIgniter 4 menyediakan fitur migrasi database untuk mengelola perubahan skema …

Verified by MonsterInsights