Membuat Autentikasi REST API Dengan Zend Framework

Pada tulisan sebelumnya saya telah membahas bagaimana membuat RESTful Web Service menggunakan Zend Framework. Dan kali ini saya akan membahas bagaimana membuat autentikasi pada RESTful Web Service dengan menggunakan Zend Framework.

Autentikasi sangat umum digunakan pada aplikasi yang bersifat privasi. Dengan begitu, resource yang sifatnya privasi hanya bisa diakses dengan melakukan autentikasi terlebih dahulu. Pada aplikasi web, untuk membuat autentikasi cukup dengan membuat form, kemudian melakukan autentikasi pada nilai yang dikirim oleh form tersebut. Dan ini sangat mudah dilakukan. Bagaimana dengan RESTful resource? Tentu pembuatan autentikasi di sini tidak sama dengan pembuatan autentikasi pada aplikasi web biasa. Lalu bagaimana solusinya? Kita kita bisa meniru konsep yang digunakan oleh Amazon S3 dalam melakukan authentikasi pada RESTful API miliknya.

Berikut ini adalah point - point penting yang digunakan oleh Amazon S3.
API KEY
Sama seperti layanan lainnya (contoh: Amazon S3) kita juga akan menggunakan API KEY. Ini ditujukan sebagai penanda dari user. Fungsi API KEY sama dengan username, dan API key juga harus unik. API KEY ini juga akan selalu dikirimkan pada setiap request.

SECRET KEY
SECRET KEY digunakan untuk menghasilkan HASH.

Resource
Resource adalah controller dan action yang akan diakses

StringToSign
Adalah penggabungan kata dari method, date, dan resource (method + date + resource).
StringToSign juga dibutuhkan untuk menghasilkan HASH.

Date
Dibutuhkan untuk mengetahui waktu dari request dikirimkan. Date dibuat dalam format RFC 1123. Dari nilai Date ini kita bisa melakukan pembatasan waktu, sehingga request yang sama tidak akan bisa digunakan lagi dalam rentang waktu yang sudah kita tentukan. Ini dibuat dengan alasan keamanan. Nilai Date didapat dengan dari gmdate(DATE_RFC1123, time()).

HASH
Merupakan sekumpulan karakter acak yang dibutuhkan untuk menentukan apakah request tersebut valid atau tidak. HASH ini dihasilkan dari StringToSign. Disini kita akan menggunakan algoritma SHA1 dengan SECRET KEY sebagai keynya. HASH dihasilkan dari base64_encode(hash_hmac('sha1', StringToSign, SECRET_KEY)).

Semua point - point penting diatas, akan dikirimkan melalui Request Header HTTP. Dengan menambahkan parameter Authorization dan Date. Authorization akan berisi "API_KEY:HASH" sedangkan Date akan berisi nilai Date yang dihasilkan.

Berikutnya server akan memperoses request tersebut. Dan di sinilah Zend Framework akan beraksi untuk melakukan autentikasi dan juga mengecek request tersebut valid atau tidak dan akan memberikan response sebagai berikut:
- Jika request tersebut tidak valid maka akan memberikan HTTP response kode 405.
- Jika request tersebut mencoba mengakses resource diluar hak aksesnya, maka akan memberikan HTTP response kode 401
- Jika request tersebut expired, maka akan memberikan HTTP response kode 408
- Jika request tersebut menggunakan method yang tidak disupport, maka akan memberikan HTTP response kode 400
- Jika request tersebut valid, maka akan memberikan HTTP response kode 200
Untuk melihat daftar HTTP Response kode yang lebih lengkap bisa di lihat di sini.

Berikut ini contoh controller yang akan melakukan proses di atas.

<?php
class Api_TestController extends Zend_Rest_Controller
{
        protected 
$_format;

        public function 
init()
        {
            
// set response sebagai json
            
$this->_helper->getHelper('contextSwitch')
                          ->
addActionContext('get''json')
                          ->
initContext();

            
// pisahkan API KEY dengan HASH pada Authorization header
            
list($apiKey$hash) = explode(':'$this->getRequest()->getParam('Authorization'));
            
// ambil Date dari request header
            
$date $this->getRequest()->getParam('Date');

            
/**
             * Kemudian lakukan query ke database berdasarkan API KEY
             * Buat HASH berdasarkan API KEY, method, resource, dan date.
             * Kemudian bandingkan dengan HASH yang dikirim.
             * Jika tidak sesuai maka kirimkan HTTP response kode di atas dengan menggunakan cara berikut ini
             * 
             * $this->getResponse()->setHttpResponseCode(code)
                                   ->sendResponse();
             */

        
}

        public function 
getAction()
        {
        }
}
?>

Comments

Kirim Komentar

Tidak akan dipublikasikan
  • Alamat web dan email dirubah menjadi hyperlink secara otomatis
  • Tag HTML yang diizinkan: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Baris baru maupun paragraph dipisahkan secara otomatis

Informasi lebih lanjut tentang format pesan