Sabtu, 29 Juli 2017

Tutorial Membuat REST API dengan Codeigniter dan JWT



Pengertian Rest API
RESTful API / REST API merupakan implementasi dari API (Application Programming Interface). REST (Representional State Transfer) adalah suatu arsitektur metode komunikasi yang menggunakan protokol HTTP untuk pertukaran data dan metode ini sering diterapkan dalam pengembangan aplikasi. Dimana tujuannya adalah untuk menjadikan sistem yang memiliki performa yang baik, cepat dan mudah untuk di kembangkan (scale) terutama dalam pertukaran dan komunikasi data.
Membuat Database
Tutorial Membuat REST API dengan Codeigniter dan JWT
Download semua yang diperlukan
·         Framework Codeigniter 3.1.5 (https://codeigniter.com/download)
·         Library PHP-JWT  (https://github.com/firebase/php-jwt)
·         Library REST Server (https://github.com/chriskacerguis/codeigniter-restserver)
Satukan file Codeigniter dengan Library Rest Server, lalu install PHP JWT dengan composer didalam folder ci kamu dengan cara “composer require firebase/php-jwt” tanpa tanda kutip atau bisa lihat gambar dibawah ini.
Lalu buat file bernama Rest.php didalam folder controller
<?php

defined('BASEPATH') OR exit('No direct script access allowed');

require APPPATH . '../vendor/autoload.php';
require APPPATH . '/libraries/REST_Controller.php';
use \Firebase\JWT\JWT;

class Rest extends REST_Controller {
    private $secretkey = 'kode_rahasia_kamu'; //ubah dengan kode rahasia apapun

    public function __construct(){
        parent::__construct();
        $this->load->library('form_validation');
    }

    // method untuk melihat token pada user
    public function generate_post(){
        $this->load->model('loginmodel');
        $date = new DateTime();
        $username = $this->post(' username ',TRUE); //ini adalah kolom username pada database yang saya berinama username.
        $pass = $this->post('password',TRUE); //ini adalah kolom password pada database yang saya berinama password.
        $dataadmin = $this->loginmodel->is_valid($username);
        if ($dataadmin) {
            if (password_verify($pass,$dataadmin->password)) {
                $payload['id'] = $dataadmin->id_user;
                $payload[username] = $dataadmin-> username;
                $payload['iat'] = $date->getTimestamp(); //waktu di buat
                $payload['exp'] = $date->getTimestamp() + 3600; //satu jam
                $output['token'] = JWT::encode($payload,$this->secretkey);
                return $this->response($output,REST_Controller::HTTP_OK);
            } else {
                $this->viewtokenfail($username);
            }
        } else {
            $this->viewtokenfail($username);
        }
    }

    // method untuk jika generate token diatas salah
    public function viewtokenfail($username){
        $this->response([
          'status'=>FALSE,
          'username'=>$username,
          'message'=>'Invalid!'
          ],REST_Controller::HTTP_BAD_REQUEST);
    }

    // method untuk mengecek token setiap melakukan post, put, etc
    public function cektoken(){
        $this->load->model('loginmodel');
        $jwt = $this->input->get_request_header('Authorization');
        try {
            $decode = JWT::decode($jwt,$this->secretkey,array('HS256'));
            if ($this->loginmodel->is_valid_num($decode-> username)>0) {
                return true;
            }
        } catch (Exception $e) {
            exit('Wrong Token');
        }
    }

}
?>

Lalu buat file Api.php di folder controller
<?php

defined('BASEPATH') OR exit('No direct script access allowed');
   
require APPPATH . 'controllers/Rest.php';

class api extends Rest {

    function __construct($config = 'rest') {
        parent::__construct($config);
        $this->load->database();
        $this->cektoken();
    }

    /* index page */
    function index_get($table = '', $id = '') {
        if ($table == '') {
            redirect(base_url());
        } else {
            $get_id = 'id_'.$table;
            if ($id == '') {
            // baseurl/?table=nama_table (semua data)
                $data = $this->db->get($table)->result();
            } else {
            // baseurl/?table=nama_table&id=id (satu data)
                $this->db->where($get_id, $id);
                $data = $this->db->get($table)->result();
            }
            $this->response($data, 200);
        }
    }

    function index_post($table = '') { // baseurl/?table=nama_table
        $insert = $this->db->insert($table, $this->post());
        $id = $this->db->insert_id();
        if ($insert) {
            $response = array(
                'data' => $this->post(),
                'table' => $table,
                'id' => $id,
                'status' => 'success'
                );
            $this->response($response, 200);
        } else {
            $this->response(array('status' => 'fail', 502));
        }
    }

    function index_put($table = '', $id = '') { // baseurl/nama_table/id
        $get_id = 'id_'.$table;
        $this->db->where($get_id, $id);
        $update = $this->db->update($table, $this->put());
        if ($update) {
            $response = array(
                'data' => $this->put(),
                'table' => $table,
                'id' => $id,
                'status' => 'success'
                );
            $this->response($response, 200);
        } else {
            $this->response(array('status' => 'fail', 502));
        }
    }

    function index_delete($table = '', $id = '') {
        $get_id = 'id_'.$table;
        $this->db->where($get_id, $id);
        $delete = $this->db->delete($table);
        if ($delete) {
            $response = array(
                'table' => $table,
                'id' => $id,
                'status' => 'success'
                );
            $this->response($response, 201);
        } else {
            $this->response(array('status' => 'fail', 502));
        }
    }
}
?>

Dan terakhir buat file Loginmodel.php di folder models
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Loginmodel extends CI_Model{
  public function __construct()
  {
    parent::__construct();
    $this->load->database();
  }
  public function is_valid($username){
    $this->db->select('*');
    $this->db->from('user');
    $this->db->where('username',$username);
    $query = $this->db->get();
    return $query->row();
  }
  public function is_valid_num($username){
    $this->db->select('*');
    $this->db->from('user');
    $this->db->where('username',$username);
    $query = $this->db->get();
    return $query->num_rows();
  }
}

Setelah ketiganya telah dibuat lakukan konfigurasi database di config/database.php

Lakukan test dengan menggunakan postman.
Dan lakukan login dengan username password di index.php/rest/generate
Salin token yang muncul lalu pasti di bagian header dan tambahkan authentication dengan value token yang kamu salin tadi.

Menggunakan INNER JOIN, RIGHT JOIN DAN LEFT JOIN

Apa sih perintah JOIN itu? Perintah JOIN dalam SQL digunakan untuk menampilkan data pada table yang saling berhubungan atau berelasi....