Categories
Dokumentasi

API Yang Tidak Membakar: Hello World!

Daftar Isi

API Hello World

|-Simpel

Akses: https://www.example.org/helloworld-simpel

<?php
//nama file: helloworld-simpel.php
// Ini untuk mengaktifkan error pada saat produksi
// matikan jika sudah live
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

/*
* Halaman Hello World Simpel
*/
//format request: https://www.example.org/helloworld-simpel

$un  = filter_input(INPUT_POST, "username", FILTER_SANITIZE_STRING);
$ps  = filter_input(INPUT_POST, "password", FILTER_SANITIZE_STRING);
//set format JSON untuk API dan menon-aktifkan cache browser
header('Content-Type: application/json');
header('Cache-Control: no-store');

//username dan password dapat juga disimpan di basis data
if ($un == "hello" && $ps == "world")
    echo json_encode(["kode" => "00", "pesan" => "Hello World"]);
else
    echo json_encode(["kode" => "99", "pesan" => "Wrong username or password"]);

|-Dengan Token

Akses: https://www.example.org/token, kemudian https://www.example.org/helloworld-token

  1. Siapkan basis data untuk menyimpan informasi token yang berhasil dibuatA). Pada basis data setidak-tidaknya terdapat kolom tokenA.1), waktu kadaluarsaA.2) dan usernameA.3). Pada basis data ini didesain dalam 1 hari hanya ada satu token untuk setiap user, sehingga dibuat indeks unik untuk tanggal pembuatan token dan user yang membuat tokenA.4.
  2. Buat trigger untuk basis data untuk meyimpan informasi token tersebutB) agar:
    • token dapat dibuat secara acakB.5)
    • waktu kadaluarsa dapat dibuat hari ini (now()) jam 23:59:59B.6)
    • tanggal pembuatan diatur pada tanggal sekarang (date(now()))B.7)
  3. Buat prosedur untuk mendapatkan tokenC)
    • masukkan username ke dalam tabel untuk menyimpan informasi token apabila username belum ada pada tabelC.9) (kerjasama on duplicate key updateC.9) dan indeks unikA.4))
    • berikan informasi token dan waktu kadaluarsanyaC.10)
  4. Buat prosedur untuk mengecek token D) yang mengembalikan nilai 1 apabila token ada dan tidak kadaluarsaD.10)
DELIMITER $$

#A
CREATE TABLE `token` (
#A.1
  `idtoken` char(36) NOT NULL,
#A.2
  `expired` datetime DEFAULT NULL,
  `createdtime` datetime DEFAULT NULL,
  `createddate` date DEFAULT NULL,
#A.3
  `username` char(10) DEFAULT NULL,
  PRIMARY KEY (`idtoken`),
#A.4
  UNIQUE KEY `call` (`createddate`,`username`),
  KEY `expired` (`expired`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8$$

#B
CREATE DEFINER=`root`@`localhost` TRIGGER `spc`.`token_BEFORE_INSERT` BEFORE INSERT ON `token` FOR EACH ROW
BEGIN
#B.5
  set NEW.idtoken     = rpad(replace(uuid(), "-", ""), 36, floor(rand()*1000));
#B.6
  set NEW.expired     = concat(date(now()), ' 23:59:59');
  set NEW.createdtime = now();
#B.7
  set NEW.createddate = date(now());
END$$

#C
CREATE DEFINER=`root`@`localhost` PROCEDURE `token`(username_ char(10))
BEGIN
#C.8
  insert into token(username) values (username_) on duplicate key update username=username_;
#C.9
  select idtoken, expired from token where username=username_ and createddate=date(now());
END$$

#D
CREATE DEFINER=`root`@`localhost` FUNCTION `validasitoken`(token_ varchar(40)) RETURNS int(11)
BEGIN
#D.10
  return ifnull((select 1 from token where idtoken=token_ and expired>now()), 0);
END

DELIMITER ;
  1. Siapkan berkas library untuk method-method yang umum dan sering digunakan
<?php
//nama file: lib.php

/**
 * method untuk menampilkan json respon dari API
 * @param String  $status  kode respon
 * @param String  $message pesan respon
 */
function response($status, $message, $data)
{
    //buat array respon
    $respon["status"]   = $status;
    $respon["message"]  = $message;
    //ubah data menjadi array 2 dimensi
    foreach ($data as $id => $isi)
    {
        $respon[$id]    = $isi;
    }
    //tampilkan respon API
    echo json_encode($respon);
}

/**
 * method untuk melakukan validasi terhadap token yang digunakan, diletakkan setelah koneksi dilakukan
 * @global MySQLi $conn
 * @param String $token Token
 */
function validasi_token($token)
{
    global $conn;
    //cek apakah token ada dan tidak kadaluarsa?
    $stmt = $conn->prepare("select validasitoken(?) as valid");
    $stmt->bind_param("s", $token);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc())
    {
       return $row['valid'];
    }                                                                                                                                                                                                                                                                                                                                                                                   }
  1. Buat program untuk mendapatkan token
<?php
//nama file: token.php
// Ini untuk mengaktifkan error pada saat produksi
// matikan jika sudah live
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

/*
* Halaman Get Token
*/
//format request: https://www.example.org/token

$un  = filter_input(INPUT_POST, "username", FILTER_SANITIZE_STRING);
$ps  = filter_input(INPUT_POST, "password", FILTER_SANITIZE_STRING);
//set format JSON untuk API dan menon-aktifkan cache browser
header('Content-Type: application/json');
header('Cache-Control: no-store');

//username dan password dapat juga disimpan di basis data
if ($un == "hello" && $ps == "world")
{
    //koneksi ke basis data secara aman
    $conn = new mysqli($servername, $username, $password, $dbname);
    $conn->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
    $conn->ssl_set('/etc/mysql/ssl/client-key.pem', '/etc/mysql/ssl/client-cert.pem', '/etc/mysql/ssl/ca-cert.pem', NULL, NULL);
    $conn->real_connect($servername, $username, $password, $dbname, 3306, NULL, MYSQLI_CLIENT_SSL);
    if ($conn->connect_error)
    {
        response ("91", "Webservice temporary unavailable", ["token" => ""]);
    }
    else
    {
        $stmt = $conn->prepare("call h2htoken(?)");
        $stmt->bind_param("s", $un);
        $stmt->execute();
        $result = $stmt->get_result();
        while ($row = $result->fetch_assoc())
        {
           response ("00", "Approve, token expired: " . $row['expired'], ["token" => $row['idtoken']]);
        }
        if (method_exists($stmt,'close'))
        {
            $stmt->close();
        }
    }
}
else
    response ("99", "Wrong username or password", ["token" => ""]);
<?php
//nama file: helloworld-token.php
// Ini untuk mengaktifkan error pada saat produksi
// matikan jika sudah live
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

/*
* Halaman Hello World Dengan Token
*/
//format request: https://www.example.org/helloworld-token

$tkn = filter_input(INPUT_POST, "token", FILTER_SANITIZE_STRING);
//set format JSON untuk API dan menon-aktifkan cache browser
header('Content-Type: application/json');
header('Cache-Control: no-store');

if (validasi_token($tkn))
    echo json_encode(["kode" => "00", "pesan" => "Hello World"]);
else
    echo json_encode(["kode" => "92", "pesan" => "Token invalid or expired"]);

Testing

Percobaan dapat menggunakan add-ons RESTer pada browser Mozilla Firefox

mencoba api dengan RESTer
mencoba api dengan RESTer

Demikian, semoga bermanfaat. [bst]

By basit

Biro Pengembangan Teknologi Dan Sistem Informasi

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.