การใช้งาน JWT ( JSON Web Token ) กับ PHP
การเก็บสถานะของผู้ใช้ว่าเป็นใครในสำหรับระบบที่พัฒนาด้วย PHP ผู้พัฒนาอาจใช้ตัวแปร SESSION ในการเก็บ แต่ยังมีอีกวิธีในการเก็บสถานะของผู้ใช้ว่าเป็นใครเรียกว่าการใช้ JSON Web Token หรือ JWT โดยมีตัวอย่างการใช้งานดังนี้
รับเขียนโปรแกรม PHP JSON Web Token (JWT)
รับเขียนโปรแกรม REST API
1. Download Library จาก https://github.com/firebase/php-jwt
2. สร้าง Folder jwt และแตก Zip ไฟล์ code ที่ Download มาไว้ใน Folder src
3. เขียน Code ฝั่ง server ด้วย PHP สำหรับรับส่ง Token ( JWT )
โดยตั้งชื่อไฟล์ว่า token.php
<?php
//เรียกใช้ Library สำหรับ JWT include("src/JWT.php");
use \Firebase\JWT\JWT;
//สร้าง function สำหรับ สร้าง Json Web Token โดยรับ String user function encode_jwt($user)
{
//กำหนด key สำหรับ encode jwt $key = "my_JWT_key";
//สร้าง object ข้อมูลสำหรับทำ jwt $payload = array(
"user" => $user,
"date_time" => date("Y-m-d H:i:s")
//กำหนดวันเวลาที่สร้าง );
//สร้าง JWT สำหรับ object ข้อมูล $jwt = JWT::encode($payload, $key);
//เพื่อความปลาดภัยยิ่งขึ้นเมื่อได้ JWT แล้วควรเข้ารหัสอีกชั้นหนึ่ง $jwt=encrypt_decrypt($jwt,"encrypt");
// return token ที่สร้าง return $jwt;
}
//สร้าง function สำหรับอ่านข้อมูล User จาก JWT ( Token ) function decode_jwt($jwt)
{
//กำหนด key สำหรับ decode jwt โดย $key = "my_JWT_key";
try{
//ถอดรหัส token $jwt= encrypt_decrypt($jwt,"decrypt");
//decode token ให้เป็นข้อมูล user $payload = JWT::decode($jwt, $key, array('HS256'));
}catch(Exception $e)
{
//กรณี Token ไม่ถูกต้องจะ return false return false;
}
//return ข้อมูล user กลับไป return (array)$payload;
}
// function สำหรับเข้ารหัส และถอดรหัส token เพื่อความปลอดภัย function encrypt_decrypt($str,$action)
{
$key = 'my_openssl_KEY';
$iv_key = 'my_iv_KEY';
$method="AES-256-CBC";
$iv=substr(md5($iv_key),0,16);
$output="";
if($action=="encrypt")
{
$output=openssl_encrypt($str, $method,$key,0,$iv);
}
else if($action=="decrypt")
{
$output=openssl_decrypt($str, $method,$key,0,$iv);
}
return $output;
}
//รับ action จาก client ว่าต้องการรับ token หรือ $action=$_POST["action"];
// client ต้องการรับ token if($action=="get_token")
{
$user=$_POST["user"];
//รับข้อมูล User จาก client echo encode_jwt($user);
//ส่ง token ไปให้ client }
// client ต้องการ decode token ( อ่านข้อมูล user จาก token ) if($action=="get_user")
{
$token=$_POST["token"];
//รับ token จาก client $jwt=decode_jwt($token);
//decode ข้อมูล user จาก toekn ที่ client ส่งมา if(!$jwt)
//แสดงว่า token ไม่ถูกต้อง {
$err=array();
$err["msg"]="Wrong Token !!!";
echo json_encode($err);
}
else
{
//ส่งข้อมูล user จาก token ที่ client ส่งมากลับไปในรูปแบบ json echo json_encode($jwt);
}
}
?>
4. เขียน Code ฝั่ง Client ทดลองรับส่ง encode และ decode token
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<button onclick="get_token()">Get Token</button>
<!-- ปุ่มกดรับ token --> <button onclick="get_user_data_from_token()">Get User Data From Token</button>
<!-- ปุ่มกดแปลง token เป็นข้อมูลผู้ใช้ --> <div id="server_response"></div>
<script>
var token="";
var server="http://localhost/jwt/token.php";
//server URL สำหรับรับ token และ decode token function get_token()
//function สำหรับรับ token {
$.ajax({
url:server,
type:"post",
data:{action:"get_token",user:"MR.robot"},
//ส่งข้อมูล user และกำหนด action เป็น get_token success:function(response)
{
//เก็บ token ไว้ในตัวแปร token token=response.trim();
//แสดง token <div id="server_response"></div> $("#server_response").html("<b>Token:</b>"+token);
}
});
}
function get_user_data_from_token()
//function สำหรับดูข้อมูล User จาก token {
$.ajax({
url:server,
type:"post",
data:{action:"get_user",token:token},
//ส่งข้อมูล toekn และกำหนด action เป็น get_user success:function(response)
{
//แสดงข้อมูล User จาก Token $("#server_response").html("<b>User Data:</b>"+response);
}
})
}
</script>
เมื่อรันผลลัพธ์ที่ได้คือ