Wajek Docs
menu
close

Best Practice : Sistem autentikasi pengguna berbasis JWT (JSON Web Token)

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/jwt

Migrasi

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