PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum


การกำหนด Authentication จำกัดการเข้าถึง API ให้กับ RESTful Services

25 July 2017 By
restful codeigniter


เนื้อหาต่อไปนี้เรามาดูการกำหนดให้ API ของเรานั้น มีการจำกัดการเข้าถึงข้อมูล เช่น สามารถเรียกใช้งาน
API นี้ได้เมื่อมีการระบุ username และ password ถูกต้อง หรือ เข้าถึง API ได้เฉพาะจาก IP ที่ระบุไว้แล้ว
เท่านั้น แบบนี้เป็นต้น
 
บทความนี้เป็นบทความต่อเนื่อง สามารถทบทวนบทความก่อนหน้าได้ที่
 
เพิ่มความสามารถ RESTful Services ใน CodeIgniter อย่างง่าย 
http://www.ninenik.com/content.php?arti_id=809 via @ninenik
 
 

การจำกัดการเข้าถึงข้อมูล API ด้วย Basic Authentication และ Digest Authentication 

 
การกำหนด Authentication ทั้งสองวิธีมีลักษณะการใช้งานคล้ายกัน แต่วิธี Digest Authentication จะมีความปลอดภัย
กว่า Basic Authentication โดยที่วิธี Digest Authentication รองรับการป้องกันการโจมตีในลักษณะการพยายามส่งค่า username 
และ password เข้ามาซ้ำๆ ซึ่งวิธีแบบ Basic จะไม่รองรับในส่วนนี้
ทำความเข้าใจความแตกต่างเพิ่มเติมทั้งสองกรณีได้ที่ลิ้งค์นี้
 
https://stackoverflow.com/questions/2384230/what-is-digest-authentication
 
สำหรับวิธีการจำกัดการเข้าถึงข้อมูล API ด้วย Basic Authentication และ Digest Authentication ในการใช้งาน RESTFul services
ข้างต้น สามารถทำได้ดังนี้ 
ให้ไปที่ไฟล์ rest.php ในโฟลเดอร์ apps > config ดังรูป
 
 

 
 
ส่วนที่ต้องแก้ไขมีคือ ให้หาส่วนของการตั้งค่า $config['rest_auth']
โดยค่าเดิมจะเป็น
 
$config['rest_auth'] = FALSE;
 
ให้เปลี่ยนเป็น 

$config['rest_auth'] = 'basic';
// หรือ 
// $config['rest_auth'] = 'digest';
 
ในที่นี้เราจะใช้เป็น basic
 
จากนั้นส่วนของการตั้งค่า $config['auth_source']
โดยค่าเดิมจะเป็น
 
$config['auth_source'] = 'ldap';
 
ให้เปลี่ยนเป็น ค่าว่าง
 
$config['auth_source'] = '';
 
และส่วนการตั้งค่าต่อมาคือ $config['rest_valid_logins']
เป็นส่วนที่ใช้กำหนด username และ password สำหรับใช้งาน
โดยค่าเดิมจะเป็น
 
$config['rest_valid_logins'] = ['admin' => '1234'];
 
สามารถเปลี่ยนเป็นค่าอื่นตามต้องการ หรือเพิ่มค่าเข้าไปเพิ่มเติมได้ โดยเป็นข้อมูลที่อยู่ในรูปแบบ array
สมมติเราลองเพิ่ม username เป็น demo และ password เป็น test เข้าไปก็จะได้เป็น
 
$config['rest_valid_logins'] = ['admin' => '1234','demo' => 'test'];
 
เวลาที่เราทดสอบการใช้งาน หากต้องการให้เปลี่ยนค่าหรือต้องการทดสอบค่าใหม่ ให้เรามาเปลี่ยนค่า password 
ในส่วนนี้ได้ ยกตัวอย่างเช่น เราทดสอบล็อกอินผ่านแล้ว ก็จะไม่ขึ้นการตรวจสอบอีก ดังนั้นถ้าต้องการทดสอบ
การตรวจสอบการล็อกอินใหม่อีกครั้ง ก็ให้มาเปลี่ยนค่า password สลับไปมา เพื่อจะได้ทดสอบได้
(ตั้งแต่ PHP 5.4 เราสามารถใช้รูปแบบปีกกาสี่เหลี่ยมแทนการกำหนดตัวแปรแบบ array ได้ เช่นจากเดิม
array('admin' => '1234','demo' => 'test') สามารถใช้เป็น ['admin' => '1234','demo' => 'test'] แทนได้)
 
เรามาลองทดสอบเรียก API ผ่าน url จากบราวเซอร์กันดู
 
/api/v1/provinces?fields=province_name
 
หลังจากมีการกำหนด Basic Authentication จะขึ้นแสดงสำหรับการเข้าใช้งานดังรูป
 


 
 
ทดสอบกรอกข้อมูลไม่ถูกต้อง ก็จะไม่สามารถเข้าถึง API นี้ได้ หรือกรณีเรากดปุ่ม Cancel
ก็จะแสดง HTTP status code เป็น 401 Unauthorized
พร้อมกับข้อความ error แจ้งดังรูป
 
 

 
 
เรามาดูวิธีการเรียกใช้งานที่ไม่ผ่าน url ทางบราวเซอร์โดยตรง หรือวิธีการใช้งานด้วย Requests for PHP 
จากบทความ
เรียกใช้ Requests for PHP สำหรับใช้งาน HTTP library ใน codeigniter 
http://www.ninenik.com/content.php?arti_id=701 via @ninenik
 
ให้สร้างไฟล์ทดสอบชื่อ Testrequest.php ในโฟลเดอร์ apps > controllers ดังรูป
 
 

 
 
และกำหนดโค้ดตัวอย่างดังนี้
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
 
class Testrequest extends CI_Controller {
 
    public function __construct()
    {
        parent::__construct();
        $this->load->library('PHPRequests');
    }
 
    public function index(){
        $headers = array('Accept' => 'application/json');
        $options = array('auth' => array('user', 'pass'));
        $response = Requests::get('http://localhost/learnci//api/v1/provinces', $headers, $options);
 
        echo "<pre>";
        echo $response->status_code."<br>";
        var_dump($response->status_code);
// int(200)
 
        var_dump($response->headers['content-type']);
// string(31) "application/json; charset=utf-8"
 
        var_dump($response->body);
        echo "</pre>";
    }
}
 
ทดสอบรันไฟล์เพื่อเรียก API 
 
 

 
 
จะเห็นว่าในตัวอย่างโค้ดไฟล์ Testrequest.php เรากำหนด username เป็น user และ password เป็น pass
ซึ่งไม่ใช่ข้อมูลที่ถูกต้อง เพราะว่า API ของเราจำกัดการเข้าถึงแบบ Basic Authentication โดยใช้ 
username เป็น admin และ password เป็น 1234 ดังนั้นหลังจากรันไฟล์เพื่อทดสอบจึงขึ้นสถานะเป็น 401 Unauthorized
คือไม่ได้รับการรับรองการเข้าถึงข้อมูล ทีนี้เราลองเปลี่ยน username และ password ให้ถูกต้องในไฟล์ Testrequest.php
เป็นดังนี้
 
$options = array('auth' => array('admin', '1234'));
 
ทดสอบรันไฟล์ Testrequest.php อีกครั้ง ดังรูป
 
 

 
 
ผลลัพธ์ที่ได้คือเราสามารถเข้าถึง API ได้ พร้อมกับส่งกลับข้อมูลและ HTTP status code 200 ok
ดังรูปด้านบน
 
ส่วนวิธีการใช้งานแบบ Digest Authentication นั้น เท่าที่ลองทดสอบดู ยังไม่สามารถใช้งานได้อย่างสมบูรณ์
โดยสามารถใช้งานกรณีกำหนดให้เรียกใช้ผ่าน บราวเซอร์ได้ แต่ยังไม่สามารถเรียกใช้งานผ่าน Request API
จึงขอยังไม่ลงรายละเอียด หากมีอัพเดทจะนำมาเพิ่มหรือเขียนเป็นบทความต่อในภายหลัง
    อย่างไรก็ดีถึงแม้การใช้งานแบบ Basic Authentication จะไม่มีความปลอดภัย สำหรับการจำกัดการเข้าถึงข้อมูล API
แต่ถ้า เว็บไซต์ของเรารองรับ SSL หรือที่เรียกผ่าน https การใช้งานแบบ Basic ก็ยังถือว่ามีความปลอดภัยแล้วในระดับหนึ่ง
นอกจากนั้น เรายังสามารถใช้งานร่วมกับ การกำหนดการจำกัดเฉพาะ IP ควบคู่ร่วมกันได้อีกด้วย จะขอกล่าวในหัวข้อตอนท้าย
 
 

การจำกัดการเข้าถึงข้อมูล API ด้วย session

 
ในกรณีที่เราต้องการเรียกใช้งานผ่าน Ajax โดยให้ฝั่งผู้ใช้ที่ร้องขอข้อมูล API ถูกจำกัดการเข้าใช้งานด้วย 
ตัวแปร session ใน PHP เราสามารถกำหนดให้ RESTFul services ของเรา เลือกกำหนดตัวแปร session ที่ต้องการ
ใช้ เพื่อตรวจสอบก่อนเข้าใช้งานได้ ดังนี้
 
ให้ไปที่ไฟล์ rest.php ในโฟลเดอร์ apps > config 
 
แล้วให้เปลี่ยนส่วนของการตั้งค่า $config['rest_auth']
เป็น
 
$config['rest_auth'] = 'session';
 
แล้วเปลี่ยนค่าในส่วนของ $config['auth_source']
ให้เป็นชื่อตัวแปร session ที่เราต้องการเช็ค สมมติ เช่น เมื่อมีการล็อกอินเข้าใช้งาน เราได้สร้างตัวแปร
session ที่ชื่อว่า ses_auth มีค่าเท่ากับ 1 เพิ่มเข้ามา เราก็ใช้ชื่อตัวแปร session นี้กำหนดค่าลงไปใน 
$config['auth_source'] จะได้เป็นดังนี้
 
$config['auth_source'] = 'ses_auth';
 
ต่อไป เรามาลองสมมติการเรียกใช้งานผ่านหน้า home ด้วย ajax 
 
หมายเหตุ:: เนื่องจากเนื้อหาเกี่ยวกับ codeigniter นี้เป็นการใช้รูปแบบที่ผู้เขียนกำหนดตั้งแต่ต้น 
ดังนั้นโครงสร้างจึงเป็นไปตามตัวอย่างโค้ดที่แจกใน บทความเรื่อง
ภาคจบโปรเจ็ค การใช้งาน codeigniter และการกำหนด URL รองรับ SEO 
http://www.ninenik.com/content.php?arti_id=683 via @ninenik
แต่ถ้าใครศึกษาเกี่ยวกับ Codeigniter มาพอสมควรแล้ว ก็สามารถที่จะนำไปใช้หรือทำความเข้าใจได้ไม่ยากนัก

 
ให้เราเปิดไฟล์ home.php ในโฟลเดอร์ apps > views > pages
 
 

 
 
แล้วแทรกโค้ดการเรียกข้อมูลจาก REST API ผ่าน คำสั่ง getJSON() ของ jQuery ดังนี้
 
<div class="container">  
<h1><?=$title_h1?></h1>  

<br>
<pre id="place_debug">

</pre>  
<script type="text/javascript">
$(function(){
     $.getJSON("<?=base_url("/api/v1/provinces?fields=province_name")?>",function(data){
		 $("#place_debug").text(data);
		 console.log(data);
     });	
});
</script>
</div> 
 
หมายเหตุ: เนื้องจากโครงสร้างเว็บของเรามีการใช้งาน jQuery อยู่แล้วจึงสามารถเรียกใช้งานคำสั่ง jQuery ได้เลย
 
มาดูผลลัพธ์เมื่อหน้า home.php โหลดขึ้นมา ก็จะใช้งาน Ajax ผ่านคำสั่ง getJSON()  ดังรูป
 
 

 
 
จะเห็นว่าในส่วนของ console จะมีการไป GET ค่าจาก API ที่เราระบุ แต่เกิด error ขึ้น และมี HTTP status code
เป็น 401 (Unauthorized) ทั้งนี้ก็เพราะ เราจำกัดการเข้าถึง API ด้วยตัวแปร session ที่ชื่อ ses_auth
เมื่อเราไม่มีค่าตัวแปรนี้มาก่อน ฝั่งของ REST API ก็จะไม่ส่งข้อมูลกลับมา
 
ทีนี้เราลองเพิ่มคำสั่ง สำหรับกำหนดตัวแปร session เข้าไปดู เป็นแบบนี้  
 
<div class="container">  
<h1><?=$title_h1?></h1>  

<br>
<pre id="place_debug">

</pre>  
<?php
$this->session->set_userdata('ses_auth',1); // สมมติกำหนดตัวแปร session ชื่อ ses_auth
//if($this->session->has_userdata('ses_auth')){ // การเช็คว่ามีตัวแปรนี้หรือไม่
//		$this->session->unset_userdata('ses_auth');// การล้างค่าตัวแปร
//}
?>
<script type="text/javascript">
$(function(){
     $.getJSON("<?=base_url("/api/v1/provinces?fields=province_name")?>",function(data){
		 $("#place_debug").text(data);
			console.log(data);
     });	
});
</script>
</div> 
 
สังเกตว่าเรามีการกำหนดตัวแปร session ชื่อ ses_auth มีค่าเท่ากับ 1 เข้าไปตรงๆ เพื่อทดสอบ
ที่นี้ลองรีเฟรสหน้า home นี้อีกครั้งดูการทำงาน จะได้ผลลัพธ์ดังรูป
 
 

 
 
จะเห็นว่ามีรายการ object ข้อมูล ถูกส่งกลับมา พร้อมนำไปใช้งานต่อไป ทั้งนี้ก็เพราะว่า ฝั่ง REST API มีการตรวจสอบ
ตัวแปร session ตามที่เรากำหนด และเมื่อมีค่าตัวแปร ก็สามารถเข้าถึงข้อมูล API ได้นั่นเอง
 
 

การจำกัดการเข้าถึงข้อมูล API ด้วย IP address

 
ถึงแม้การจำกัดการเข้าถึงข้อมูล API ด้วยวิธีข้างต้นจะมีความปลอดภัยในระบบดับหนึ่งแล้ว เรายังสามารถกำหนด
การจำกัดการเข้าถึงเพิ่มเติมโดยการใช้งาน IP white-list และ IP Blacklist ได้อีกด้วย ซึ่งจะช่วยเพิ่มระดับ
ความปลอดภัยของข้อมูล API เพิ่มขึ้นอีก 
ความหมายก็ตามชื่อที่เรียกเลย 
IP white-list ก็คือ กำหนด IP address ที่สามารถเข้าถึง API ได้
IP Blacklist ก็คือ กำหนด IP address ที่ต้องการป้องกันไม่ให้เข้าถึง API
 
การกำหนด REST IP white-list ให้เรากำหนดค่าในไฟล์ rest.php ในโฟลเดอร์ apps > config 
ดูในส่วนของค่า
 
$config['rest_ip_whitelist_enabled'] = FALSE; // ค่าเริ่มต้นเป็น FALSE ถ้าต้องการใช้งานให้กำหนดเป็น TRUE
 
กำหนดให้เป็น TRUE 
 
$config['rest_ip_whitelist_enabled'] = TRUE; // ซึ่งหมายถึงเปิดใช้งานการจำกัด้วย IP white-list
 
หลังจากนั้นเราก็สามารถไประบุ IP address ในส่วนของค่า 
 
$config['rest_ip_whitelist'] = '';
 
ตัวอย่างเช่น 
 
$config['rest_ip_whitelist'] = '123.456.789.0, 987.654.32.1';
 
เป็นการกำหนด IP สองค่าเข้าไปใน white-list คั่นแต่ละค่าด้วย , (comma) 
 
เรามาลองรันหน้า home ดูผลลัพธ์ที่ได้อีกครั้ง ก็จะพบว่า ไม่สามารถเรียกดูข้อมูลได้แล้ว ถึงแม้จะผ่าน
ด่านแรก คือมีตัวแปร session ตามที่กำหนด แต่ก็มาติดด่านที่สองคือ IP ไม่ตรงกับที่อนุญาตให้เข้าถึง
หลักการทำงานก็ประมาณนี้ การกำหนด IP white-list เหมาะสำหรับกรณีที่ API นี้ให้สามารถเรียกใช้งานผ่านเว็บไซต์
ของเราเว็บไซต์เดียว โดยเว็บไซต์ของเราต้องมี IP แบบ static ด้วย หรือก็คือมี IP ที่ไม่ซ้ำกับคนอื่น
 
สำหรับหลักกากำหนดใน REST IP Blacklist ก็จะทำในลักษณะคล้ายกัน ในความหมายตรงกันข้ามคือ
IP ที่กำหนด คือ IP ที่ไม่สามารถเข้าถึง API ได้ กำหนดในไฟล์ rest.php ในโฟลเดอร์ apps > config
โดยเปิดหรือปิดใช้งานในส่วนของการกำหนดค่า
 
$config['rest_ip_blacklist_enabled'] = FALSE;
 
และกำหนด IP address ในส่วนของการกำหนดค่า
 
$config['rest_ip_blacklist'] = '';
 
สำหรับเนื้อหาเกี่ยวกับการจำกัดการเข้าถึงข้อมูล API ในเบี้องต้นก็มีเพียงเท่านี้ อย่างไรก็ตาม ในส่วนของ RESTFul
services ยังรองรับการกำหนด API key ไว้นำมาเป็นบทความเพิ่มเติมในโอกาสต่อๆ ไป 
 


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 29-07-2017


การจำกัดการเข้าถึงข้อมูล API ด้วย Digest Authentication 

 
เพิ่มเติมตอนนี้เราสามารถใช้งาน การจำกัดการเข้าถึงข้อมูล API ด้วย Digest Authentication ได้แล้ว
    อย่างที่เราทราบไปแล้วเบี้องต้นว่า การจำกัดการเข้าถึงแบบ Basic Authentication นั้น username และ password
จะถูกส่งเป็นชุดข้อความโดยเข้ารหัสด้วย base64_encode() ผ่านมาทาง HTTP Request ซึ่งถ้าเว็บไซต์ของเรายังไม่รองรับ
ระบบ SSL หรือ https ข้อมูลส่วนนี้ก็จะถูกดักจับค่านี้ และแปลงกลับด้วย base64_decode()  ลองมาดูตัวอย่างการ
ใช้งาน Basic Authentication เมื่อมีการล็อกอินสำเร็จ จะได้ค่า Authorization ใน Request headers ดังรูป
 
 

 
 
ซึ่งค่า Authorization ที่ได้คือ YWRtaW46MTIzNA==
สามารถแปลงกลับด้วยคำสั่ง base64_decode()  เช่น
 
<?php
echo base64_decode("YWRtaW46MTIzNA==");
?>
 
ค่าที่ได้คือ username และ password ในรูปแบบดังนี้
 
admin:1234
 
จะเห็นว่าค่าเหล่านี้สามารถดักจับ หรือขโมยค่าไป หรือถูกจัดเก็บไว้ในบราวเซอร์อย่างถาวร
ถ้าผู้ใช้ให้ทำการบันทึกไว้ และยิ่งถ้าเราใช้ใน computer ที่เป็นแบบใช้ร่วมกัน ค่านี้ก็สามารถถูกขโมย
โดยผู้ใช้งานคนอื่นก็ได้
 
คำถามเพิ่มเติมคือว่า แล้วถ้าเราใช้เว็บที่รองรับ SSL และใช้การจำกัดการเข้าถึงด้วย Basic Authentication
username และ password จะปลอดภัยในระหว่างการส่งผ่านข้อมูลหรือ คำตอบก็คือ ปลอดภัย เพราะมีการเข้า
รหัสให้กับข้อมูลของเรา แต่ถ้าถามว่าแค่มี SSL แล้วเพียงพอแล้วหรือไม่ จุดนี้อาจจะตอบได้เลยว่าไม่เพียงพอ
แต่ก็ขึ้นอยู่กับว่าเว็บไซต์ของเราเป็นเว็บเกี่ยวกับอะไร ความปลอดภัยของข้อมูลจำเป็นมากน้อยแค่ไหน ประกอบด้วย
 
กลับมาที่เรื่องการจำกัดการเข้าถึงข้อมูล API ด้วย Digest Authentication กันต่อ สมมติถ้าเว็บเรายังไม่รองรับ SSL
การใช้งาน Digest Authentication แทน Basic Authentication จึงเป็นวิธีที่เหมาะสมและปลอดภัยกว่า
เนื้องจากจะมีการเข้ารหัสข้อมูลการล็อกอินในระดับความปลอดภัยระดับหนึ่งอยู่แล้ว มาลองทดสอบดูค่ากรณีเราล็อกอิน
ผ่าน Digest Authentication แล้วค่าที่ได้จะเป็นดังรูป
 
 
 

จะเห็นส่วนของค่า Authorization จะเรายังพอเห็น username แต่เราจะไม่เห็นในส่วนของ password เพราะรูปแบบ
ของ password จะมีการจัดรูปแบบใหม่ โดยอาศัยการส่งค่าต่างๆ ที่เกี่ยวข้องไปดำเนินการอีกที 
อย่างไรก็ตามถ้าสนใจ หลักการทำงานของ Digest Authentication สามารถค้นหาเพื่มเติมเองได้ ในที่นี้จะขอข้าม
มาเรื่องการใช้งานกันต่อ
 
ให้ทำตามขึ้นตอนดังนี้
เริ่มต้นทำการสร้างไฟล์ชื่อ Api_auth.php ไว้ในโฟลเดอร์ apps > libraries ดังรูป

 

 
 
จากนั้นกำหนด class และ function ในไฟล์ Api_auth.php ตามโค้ดดังนี้
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Api_auth
{	
	protected $rest_realm;
	protected $rest_valid_logins;
    public function __construct($config = 'rest')
    {
        $this->ci =& get_instance();
        $this->ci->config->load($config);		
		$this->rest_realm = $this->ci->config->item('rest_realm');
		$this->rest_valid_logins = $this->ci->config->item('rest_valid_logins');
	}
	public function login($username,$password)
	{
		$rest_valid_logins = $this->rest_valid_logins;
		if($rest_valid_logins){
			if(array_key_exists($username,$rest_valid_logins)){
				return md5($username.':'.$this->rest_realm.':'.$rest_valid_logins[$username]);
			}
		}
	}
}
 
ชื่อคลาส Api_auth และฟังก์ชั่น login จะเป็นส่วนที่เราจะนำไปเรียกใช้งาน โดยส่วนของฟังก์ชั่น login
นั้น จะใช้สำหรับรับค่า username ที่ส่งเข้ามาแล้วนำไปตรวจสอบกับค่าที่กำหนดไว้ หาก username และ
password ตรงกับที่เรากำหนดใน ส่วนของการตั้งค่า $config['rest_valid_logins'] ในไฟล์ rest.php แล้ว
REST ก็จะอนุญาตให้เข้าถึงข้อมูล API ได้
    
 
จากนั้นให้ไปที่ไฟล์ rest.php ในโฟลเดอร์ apps > config 
แก้ไขส่วนของการกำหนดค่า  $config['rest_auth']
เป็นค่าดังนี้
 
$config['rest_auth'] = 'digest';
 
ต่อด้วยกำหนดค่า $config['auth_source'] เป็นดังนี้
 
$config['auth_source'] = 'library';
 
การกำหนด auth_source เป็น library นั้นเพราะเราจะใช้การตรวจสอบการล็อกอินผ่าน 
Digest Authentication ด้วย class และ function ใน library ที่เราเพิ่งสร้างไปด้านบนนั่นเอง
 
จากนั้นกำหนดในส่วนของ $config['auth_library_class'] และ $config['auth_library_function']
เป็นค่าดังนี้
 
$config['auth_library_class'] = 'Api_auth';
$config['auth_library_function'] = 'login';
 
จะเห็นเรานำชื่อ class และ function ที่ได้ทำขึ้นมาใช้งานแล้ว
 
และส่วนสุดท้ายก็กำหนด username และ password ตามต้องการในส่วนของ $config['rest_valid_logins']
ในที่นี้ เราจะยังใช้จะลองเพิ่มอีกค่าเข้าไป เดิมมี u:admin p:1234 เราเพิ่ม u:demo p:test เข้าไปเป็นดังนี้
 
$config['rest_valid_logins'] = ['admin' => '1234','demo' => 'test'];
 
เป็นอันเสร็จเรียบร้อยในส่วนของ RESTFul services 
 
ต่อไปมาในส่วนของการเรียกใช้งาน API กัน และเรายังใช้ Requests PHP สำหรับเรียกดูข้อมูล 
ให้เราเปิดไฟล์ Testrequest.php ในโฟลเดอร์ apps > controllers แล้วปรับโค้ดเป็นดังนี้
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
 
class Testrequest extends CI_Controller {
 
    public function __construct()
    {
        parent::__construct();
        $this->load->library('PHPRequests');
    }
    public function index(){
		$hooks = new Requests_Hooks();		
		$hooks->register('curl.before_request', function(&$fp){
			$username = "admin";
			$password = "1234";			
			curl_setopt($fp, CURLOPT_HEADER , false); 		
			curl_setopt($fp, CURLOPT_VERBOSE , true); 
			curl_setopt($fp, CURLOPT_RETURNTRANSFER , true); 
			curl_setopt($fp, CURLOPT_FOLLOWLOCATION , true); 
			curl_setopt($fp, CURLOPT_SSL_VERIFYPEER , false); 
			curl_setopt($fp, CURLOPT_USERPWD , $username . ":" . $password); 
			curl_setopt($fp, CURLOPT_HTTPAUTH , CURLAUTH_DIGEST); 
		});
		$headers = array('Accept' => 'application/json');
		$options = array('hooks' => $hooks);
		$response = Requests::get('http://localhost/learnci/api/v1/provinces?fields=province_name', $headers , $options);		
        echo "<pre>";

//		var_dump($response);
		echo "<hr>";
        echo $response->status_code."<br>";
        var_dump($response->status_code);
// int(200)
 
        var_dump($response->headers['content-type']);
// string(31) "application/json; charset=utf-8"
 
        var_dump($response->body);
        echo "</pre>";
    }
}
 
เมื่อทดสอบรันไฟล์ หากไม่มีอะไรผิดพลาด ก็จะได้ผลลัพธ์ รายการข้อมูล API จากการใช้งาน Requests HTTP
 
หมายเหตุ: สำหรับเรียกใช้งาน API ด้วย Requests for PHP library ข้างต้น พบว่า บางเครื่องสามารถใช้งานได้ปกติ
แต่ในบางเครื่องกลับใช้งานไม่ได้ โดยยังไม่สามารถระบุแน่ชัดว่าเกิดจากเหตุผลใด ซึ่งเป็นไปได้ทั้งว่า สภาพแวดล้อม
ขององค์ประกอบต่างๆ อาจจะไม่สัมพันธ์กัน อย่างเวอร์ชั่น php หรือการเปิดใช้งานหรือปิดใช้งานฟังก์ชั่น cURL ใน php
เหล่านี้เป็นต้น อย่างไรก็ตาม หากไม่สามารถเรียกใช้งานผ่าน Digest Authentication ได้ ก็สามารถใช้งานในรูปแบบ
Basic Authentication แทนได้ สำหรับเนื้อหาส่วนของ Digest Authentication ก็ถือเป็นตัวเลือกเพิ่มเติม

 








เนื้อหาที่เกี่ยวข้อง



Tags:: restful codeigniter




เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   



อย่าลืมกด Like กด Share เป็นกำลังใจ ในการสร้างบทความใหม่ๆ น่ะครับ


URL สำหรับอ้างอิง