Pendahuluan
JWT adalah sebuah string yang tersimpan di sisi klien (browser) yang digunakan untuk mengautentikasi setiap request ke server. JWT biasanya disertakan pada Authorization header dari setiap request ke server. Server lalu memeriksa apakah token yang dikirim valid sebelum mengembalikan response yang diminta.
Memulai
Pada terminal, masuk ke direktori api dan install lcobucci/jwt
cd api
composer require lcobucci/jwtMigrasi
Selanjutnya, buat tabel migrasi baru untuk membuat tabel pengguna di database :
20250218_01_createPengguna.php
<?php
return function ($schema, $direction) {
if($direction == 'up') :
$schema->create('pengguna', [
'idPengguna' => 'INT(11) AUTO_INCREMENT PRIMARY KEY',
'nmPengguna' => 'VARCHAR(50)',
'akses' => 'VARCHAR(50)',
'username' => 'VARCHAR(50)',
'password' => 'VARCHAR(50)'
]);
endif;
if($direction == 'down') :
$chema->drop('pengguna');
endif;
};Lalu tambahkan pengguna secara manual melalui phpmyadmin dengan password menggunakan hash md5.
Model
Selanjutnya buat model dengan nama PenggunaModel.php
PenggunaModel.php
<?php
namespace App\Models;
use Selvi\Database\Manager;
use Selvi\Database\Schema;
class PenggunaModel {
private Schema $db;
function __construct() {
$this->db = Manager::get('main');
}
function count($where = [], $orWhere = []) {
return $this->db->select('COUNT(pengguna.idPengguna) as jmlPengguna')
->where($where)->orWhere($orWhere)
->get('pengguna')->row()->jmlPengguna;
}
function result($where = [], $orWhere = [], $order = [], $limit = -1, $offset = 0) {
if($limit > -1) $this->db->limit($limit)->offset($offset);
return $this->db->select(['pengguna.*'])
->where($where)->orWhere($orWhere)
->order($order)->get('pengguna')->result();
}
function row($where) {
return $this->db->select(['pengguna.*'])
->where($where)->get('pengguna')->row();
}
function insert($data) {
$insert = $this->db->insert('pengguna', $data);
if($insert === true) return $this->db->lastId();
return false;
}
function update($where, $data) {
return $this->db->where($where)->update('pengguna', $data);
}
function delete($where) {
return $this->db->where($where)->delete('pengguna');
}
}Middleware
Buat middleware dengan nama AuthMiddleware.php
AuthMiddleware.php
<?php
namespace App\Middlewares;
use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Key\InMemory;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use App\Models\PenggunaModel;
class AuthMiddleware {
private PenggunaModel $penggunaModel;
function __construct() {
$this->tokenConfig = Configuration::forSymmetricSigner(
new Sha256(),
InMemory::plainText('<kata_acak_32_karakter>')
);
$this->penggunaModel = inject(PenggunaModel::class);
}
public function generateToken($claims = []) {
$now = new \DateTimeImmutable();
$builder = $this->tokenConfig->builder()->issuedAt($now)
->expiresAt($now->modify('+10 minutes'));
foreach($claims as $key => $value) {
$builder = $builder->withClaim($key, $value);
}
return $builder->getToken(
$this->tokenConfig->signer(),
$this->tokenConfig->signingKey()
)->toString();
}
}Buat AuthController.php