การใช้งาน JWT ( JSON Web Token ) กับ PHP

การเก็บสถานะของผู้ใช้ว่าเป็นใครในสำหรับระบบที่พัฒนาด้วย PHP ผู้พัฒนาอาจใช้ตัวแปร SESSION ในการเก็บ แต่ยังมีอีกวิธีในการเก็บสถานะของผู้ใช้ว่าเป็นใครเรียกว่าการใช้  JSON Web Token หรือ JWT โดยมีตัวอย่างการใช้งานดังนี้

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>&nbsp;<!-- ปุ่มกดรับ 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>

เมื่อรันผลลัพธ์ที่ได้คือ