Membuat Rest Api Server Dengan Code Igniter 3: Memasang JWT Authentication

JWT Authentication adalah konsep login menggunakan token. JTW sendiri adalah singkatan dari JSON Web Token. JSON adalah Javascript Object Notation. JSON adalah object data dalam bentuk javascript yang simple dan mudah dipahami. Web Token adalah Token untuk web. Aish ngawur banget, kamu nyari gampangnya saja wkwkwk.

Pentingnya Keamanan WEB API 

Tanpa basa basi, melanjutkan artikel kemarin tetang membuat rest api server dengan code igniter 3. Jangan pernah menyepelekan data. Semua data memiliki hak untuk dilindungi dan mendapat perlindungan seperti halnya perempuan. Karena perlindungan adalah hak segala bangsa. 

Selain itu menambahkan perlindungan pada API membuat tidurmu lebih tenang. Bayangkan kalau ada berita data KPU bocor. Duh programmer KPU bisa panas dingin. Meski pihak KPU sudah mengakui bahwa data yang ada di web bukanlah data sebenarnya. Data asli mereka ada di komputer lokal alias lokalhost dan tidak terhubung dengan internet, atau malah tidak terhubung dengan jaringan? Kalau memang demikian, maka data mereka berada di tempat yang sangat aman, kecuali yang nyolong punya akses fisik ke komputer tersebut.   

Ada banyak cara mengamankan API, dan penggunaan token ini hanya salah satu. Masih banyak "salah " yang digunakan untuk mengamankan web Api. Misal menggunakan firewall, proxy, mengaktifkan perlindungan CSRF dan masih banyak lagi.

Memasang JWT ke Code Igniter 3

Siapkan Code Igniter 3 dengan library Restfull API

Sebelumnya aku sudah membuat artikel membuat rest api server dengan code igniter 3. Kalau kamu belum membacanya, klik saja disini.

Install library JWT ke Code Igniter

  1. Download library JWT, ada banyak sekali library JWT yang betebaran digithub, aku menggunakan library jwt firebase/php-jwt: PHP package for JWT (github.com).

  2. Extract file zip hasil download, didalam folder src ada 4 files yang nanti akan disalin ke folder library di Code Igniter 3.


    isi folder src di JWT master

  3. Salin file-file yang ada di folder src ke folder application\library di Code Igniter 3.
     
    folder libraries di Code Igniter

Lets Code

Load library JWT di controller

Buka file api.php di controller, kemudian tambahkan kode-kode ini diatas use, tepatnya seperti dibawah ini:

defined('BASEPATH') OR exit('No direct script access allowed');
require APPPATH . '/libraries/JWT.php';
require APPPATH . '/libraries/ExpiredException.php';
require APPPATH . '/libraries/BeforeValidException.php';
require APPPATH . '/libraries/SignatureInvalidException.php';
require APPPATH . '/libraries/JWK.php';


Memanggil Class JWT

Tambahkan class JWT dibawah class rest controller, seperti dibawah ini:

use chriskacerguis\RestServer\RestController;
use \Firebase\JWT\JWT;
use \Firebase\JWT\ExpiredException;

Buat fungsi untuk konfigurasi token

function configToken(){
        $cnf['exp'] = 3600//milisecond
        $cnf['secretkey'] = '2212336221';
        return $cnf;        
    }

fungsi diatas adalah fungsi bantuan untuk JWT, sebenarnya ada beberapa konfigurasi, tetapi aku memakai dua konfigurasi ini dulu.

exp: waktu expired token, kita bisa mengkonfigurasi berapa detik token dianggap tidak berlaku, untuk menggunakan service pengguna harus generate token lagi.

secretkey: Secret key adalah kunci unik untuk mengenkripsi token. Usahakan membuat secretkey acak yang sulit ditebak.

Service Meminta Token (post)

Setiap permintaan api akan kita lindungi dengan permintaan token di sebagai authentifikasinya. Kecuali service untuk meminta token itu sendiri. Sebagai contoh token yang akan digenerate berdasarkan user dan password. 

Tambahkan fungsi/service get token di Api.php

public function getToken_post(){               
            $exp = time() + 3600;
            $token = array(
                "iss" => 'apprestservice',
                "aud" => 'pengguna',
                "iat" => time(),
                "nbf" => time() + 10,
                "exp" => $exp,
                "data" => array(
                    "username" => $this->input->post('username'),
                    "password" => $this->input->post('password')
                )
            );       
        
        $jwt = JWT::encode($token$this->configToken()['secretkey']);
        $output = [
                'status' => 200,
                'message' => 'Berhasil login',
                "token" => $jwt,                
                "expireAt" => $token['exp']
            ];      
        $data = array('kode'=>'200''pesan'=>'token''data'=>array('token'=>$jwt'exp'=>$exp));
        $this->response($data200 );       
    }


Fungsi Mengecek keabsahan token
Untuk mempermudah dan mengurangi pengulangan kode, aku membuat fungsi untuk mengecek token yang dikirim. Kodenya seperti dibawah ini:

public function authtoken(){
        $secret_key = $this->configToken()['secretkey']; 
        $token = null
        $authHeader = $this->input->request_headers()['Authorization'];  
        $arr = explode(" "$authHeader); 
        $token = $arr[1];        
        if ($token){
            try{
                $decoded = JWT::decode($token$this->configToken()['secretkey'], array('HS256'));          
                if ($decoded){
                    return 'benar';
                }
            } catch (\Exception $e) {
                $result = array('pesan'=>'Kode Signature Tidak Sesuai');
                return 'salah';
                
            }
        }       
    }

Tambahkan Fungsi Mengecek Keabsahan Token Sebelum Service Memberikan respon.
Supaya token dicek terlebih dahulu sebelum service melakukan tugas yang lain, maka tempatkan script ini disetiap fungsi di kontroller:

 if ($this->authtoken() == 'salah'){
            return $this->response(array('kode'=>'401''pesan'=>'signature tidak sesuai''data'=>[]), '401');
            die();
        }

Contohnya di fungsi get siswa seperti dibawah ini:

public function siswa_get(){             
        
        if ($this->authtoken() == 'salah'){
            return $this->response(array('kode'=>'401''pesan'=>'signature tidak sesuai''data'=>[]), '401');
            die();
        }
        $this->db->select('*');        
        $data = array ('data'=>$this->db->get('siswa')->result());        
        $this->response($data200 );
    }

Note: 

Sebenarnya ada cara yang lebih simpel, simpel bukan berarti lebih mudah lho ya!

Fungsi getToken dijadikan controller sendiri saja, setelah itu fungsi cek token dimasukkan di class construct, lumayan nih ngirit 4 baris kode yang sebenarnya bisa dikopas.

Tetapi begitulah oknum orang Indonesia, kalau ada yang susah, ngapain bikin yang gampang, eh tapi buatku lebih gampang copas sih. Copas dikit apa susahnya. Paling kodingannya saja yang kelihatan panjang, 


TESTING

Sekarang saatnya mencoba hasil kodingannya, kira-kira berhasil nggak ya? kalau nggak berhasil kan malu.

Sebagai alat percobaan aku menggunakan aplikasi POSTMAN

Mengakses API get Siswa tanpa Token

Kita coba ambil data siswa tanpa token, alamat apinya disini: "localhost/restapi/index.php/api/siswa" bagaimanakah hasilnya? apakah apinya akan menolak dia dan menerimamu eh, apa tah.

percobaan pertama, akses API tanpa token

Percobaan Kedua, Akses API Dengan Token

Sesuai dengan nama percobaannya, sekarang kita pakai token untuk mengakses API siswa. 
  1. Panggil get Token
    Panggil fungsi get Token dengan alamat: "localhost/restapi/index.php/api/getToken", api get token adalah satu-satunya api yang tidak dilindungi oleh token. 



Panggil API Siswa
Sebelum memanggil API get Siswa lakukan beberapa setting seperti dibawah ini:
  • Klik Tab Authorization
  • Pada dropdown type, pilih "Bearer Token"

pilih bearer token
  • Masukkan Token yang kita dapat dari langkah pertama ke textbox Token (biasanya sudah masuk otomatis)
  • Klik SEND
  • Tralala, berhasil 

    berhasil hoyee

PENUTUP

Apa yang aku tulis disini adalah catatan belajarku. Bukan karena aku adalah suhu badan, master driver. Jujur saja waktu membuat tulisan ini aku sambil googling, baca-baca manual dan mencoba satu-satu. Soalnya aku berencara pakai Code Igniter 3 buat service antrian versi 2 nya BPJS, programmer SIMRS insyaallah tahu kalau di antrian bpjs kita harus menggunakan authentifikasi salah satu yang disarankan adalah JWT. Kalau kamu nggak tahu kok kebangeten banget. 
Meski aku masih belajar, tapi  feel free to ask saja, nanti kita menangis bersama. Demikian rangkaian tutorial membuat web service dengan Code Igniter 3 terutama memasang JWT authentication di Code Igniter 3.

download sourcenya di

https://github.com/vbcupu/Code-Igniter-3-Restfull-API-With-JWT-Authentication




12 comments for "Membuat Rest Api Server Dengan Code Igniter 3: Memasang JWT Authentication"

  1. Terimakasih mas, blognya sangat bermanfaat. kebetulan juga lagi bridging BPJS

    ReplyDelete
    Replies
    1. sama2 mas. Kata temenku bridging yg paling susah adalah bridging BPJS, kalau bisa bridging BPJS bikin bridging lainnya gampang wkwkwk

      Delete
  2. permisi mas, saya sdh ngikutin tutornya akan tetapi response yang diberikan selalu 401, itu knp ya mas, berikut link source codenya : https://pastebin.com/nQvKYUAV

    ReplyDelete
  3. min pas di decode gagal terus knpa ya ?

    ReplyDelete
  4. php-jwt install pake composer , sepertinya kode di atas tidak jalan di php-jwt terbaru, encode dan decode pakai yang di web https://github.com/firebase/php-jwt

    ReplyDelete
    Replies
    1. saya belum mencoba versi terbaru, kapan2 akan saya coba

      Delete
  5. {
    "kode": "401",
    "pesan": "signature tidak sesuai",
    "data": []
    }

    ReplyDelete
  6. {
    "status": false,
    "error": "Unknown method"
    }

    apakah kemungkinan ada yang salah saat muncul error tersebut?

    untuk tutorial sudah sesuai dengan perintah

    ReplyDelete
  7. username dan password yang dimasukkan didalam controller getToken itu username dan password darimana?

    ReplyDelete

Post a Comment