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.