การเขียนโปรแกรมภาษา php ให้เรียกใช้งาน jwt อย่างง่าย

วันที่: 15 เม.ย. 2565 13:39 น.

การเขียนโปรแกรมภาษา php ให้เรียกใช้งาน jwt อย่างง่าย

ในบทความนี้จะพูดถึงเรื่อง JWT (Json Web Token) และนำมาใช้งานร่วมกับ PHP ซึ่ง JWT เป็น Standard Token หนึ่ง ที่ใช้ json data ในการเก็บข้อมูลของ user แล้วนำมาเข้ารหัสอีกที ซึ่งจะได้หน้าตาประมาณนี้

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

จะสังเกตได้ว่า token ที่ว่านี้จะขั้นด้วย . เป็นรูปแบบนี้ xxx.yyy.zzz

  • xxx คือ Header จะถูกเข้ารหัสด้วย base64 แบบนี้ base64_encode(header)
  • yyy คือ Payload ก็คือข้อมูลของเรานั่นแหละ จะถูกเข้ารหัสด้วย base64 แบบนี้ base64_encode(payload)
  • zzz คือ Signature เป็นการเอา Payload มาเข้ารหัสด้วยรูปแบบที่กำหนดใน Header บวกกับ Secert Key ของเราที่เรากำหนดได้เอง

อ่านมาถึงตรงนี้หลายคนอาจสงสัยว่า ถ้าเข้ารหัสเป็น base64 ก็สามารถถอดรหัส (decode) กลับได้ ก็เห็นข้อมูลหมดสิ? ใช่แล้วครับ ข้อมูล payload ในที่นี้ก็ไม่ได้เก็บเป็นความลับอะไร ก็เป็นข้อมูลผู้ใช้ทั่วไป เช่น ชื่อ - สกุล, อีเมล, ระดับผู้ใช้, รหัสผู้ใช้ เป็นต้น แต่การจะเช็คว่า token นี้น่าเชื่อถือหรือไม่ ก็สามารถเช็คได้จากส่วน zzz เลยครับ

 

โค้ด PHP ที่ใช้งาน JWT

ก่อนอื่น สร้าง project ใน localhost ของเราก่อนเลย ในที่นี้ผมจะสร้างชื่อ php-jwt จากนั้นติดตั้ง jwt ใน folder ที่สร้างไว้ โดยใช้ composer

composer require firebase/php-jwt

สร้างไฟล์ index.php เพื่อเรียกใช้งาน โดยมีโค้ดดังนี้

<?php
include_once('./vendor/autoload.php');

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
?>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <style>
        .container {
            width: 100%;
            max-width: 700px;
        }
    </style>
</head>

<body>
    <div class="container">
        <?php
        $key = 'my secert key';
        $data = array(
            'id' => 1,
            'name' => 'Puwanai Sangphon',
            'email' => 'puwanai.sangphon@gmail.com'
        );
        $payload = array(
            'iss' => 'https://puwanai.com',
            'aud' => 'https://puwanai.com',
            'iat' => time(),
            'exp' => time() + 3600, // 1 ชม.
            'data' => $data
        );

        $jwt = JWT::encode($payload, $key, 'HS256');
        echo '
        <h2 class="mt-4">Token</h2>
        <code>', $jwt, '</code>';

        $decoded = JWT::decode($jwt, new Key($key, 'HS256'));
        echo '
        <h2 class="mt-4">Decode</h2>';
        echo '<pre>';
        print_r($decoded);
        echo '</pre>';
        ?>
    </div>
</body>

</html>

 

ทดลองใช้งานผ่าน http://localhost/php-jwt/ ถ้าทุกอย่างถูกต้องจะมีผลดังนี้

 

 แหล่งข้อมูลอ้างอิง

เรื่องอื่น ๆ ที่เกี่ยวข้อง