การเข้ารหัสและถอดรหัส JWT ด้วย PHP และมีการ Verify Signature ด้วย

สำหรับการเข้ารหัสและถอดรหัส JWT และมีการ Verify Signature ด้วย สามารถทำได้ด้วยการใช้ฟังก์ชันของภาษา PHP ดังนี้

การเข้ารหัส ด้วย HS256 และ Secret Key
/**
 * เข้ารหัส JWT โดยใช้ secret key
 * รองรับ HS256 เท่านั้น
 *
 * @param string $secretKey
 * @param array $payload
 *
 * @return string
 */

function jwt_encode($secretKey, $payload)
{
    // กำหนด header และ payload ของ JWT ในรูปแบบของ array
    $header = array(
        'alg' => 'HS256',
        'typ' => 'JWT'
    );
    // encode header และ payload เป็น base64
    $encodedHeader = base64_encode(json_encode($header));
    $encodedPayload = base64_encode(json_encode($payload));
    // คำนวณ HMAC-SHA256 signature ของ header และ payload โดยใช้ secret key
    $signature = hash_hmac('sha256', $encodedHeader.'.'.$encodedPayload, $secretKey, true);
    // encode signature เป็น base64
    $encodedSignature = base64_encode($signature);
    // สร้าง JWT จาก header, payload, และ signature ที่ถูก encode แล้ว
    $jwt = $encodedHeader.'.'.$encodedPayload.'.'.$encodedSignature;
    // ส่งคืน JWT
    return $jwt;
}

การถอดรหัส JWT ที่ได้จากฟังก์ชั่นด้านบน
/**
 * ถอดรหัส JWT และตรวจสอบ Signature ด้วย
 * รองรับ HS256 เท่านั้น
 * ไม่สำเร็จคืนค่า false, สำเร็จคืนค่า Payload
 *
 * @param string $secretKey
 * @param string $jwt
 *
 * @return mixed
 */

function jwt_decode($secretKey, $jwt)
{
    // แยก JWT ออกเป็น Header, Payload และ Signature
    list($header, $payload, $signature) = explode('.', $jwt);
    // decode header และ payload จาก base64
    $decodedHeader = base64_decode($header);
    $decodedPayload = base64_decode($payload);
    // คำนวณ HMAC-SHA256 Signature ของ Header และ Payload จาก secret key
    $expectedSignature = hash_hmac('sha256', $header.'.'.$payload, $secretKey, true);
    // decode Signature จาก base64
    $decodedSignature = base64_decode($signature);
    // เปรียบเทียบ Signature ที่คำนวณได้กับ Signature ที่อยู่ใน JWT
    if (hash_equals($decodedSignature, $expectedSignature)) {
        // Signature ถูกต้อง แปลง payload ให้อยู่ในรูปแบบ array
        $decodedPayload = json_decode($decodedPayload, true);
        // คืนค่า payload
        return $decodedPayload;
    } else {
        // Signature ไม่ถูกต้อง
        return false;
    }
}

ตัวอย่างการนำไปใช้งาน
// กำหนด secret key ของ JWT
$secretKey = 'my_secret_key';
// payload
$payload = array(
    'email' => 'admin@localhost.com',
    'name' => 'ทดสอบ ภาษาไทย',
    'id' => 1234567890
);
// เข้ารหัส payload ด้วย secret key
$jwt = jwt_encode($secretKey, $payload);
// แสดงข้อมูล JWT
echo $jwt;
echo '<br>';
// ถอดรหัส JWT
$payload = jwt_decode($secretKey, $jwt);
// แสดงผล payload
print_r($payload);
ผู้เขียน goragod โพสต์เมื่อ 12 มี.ค. 2566 เปิดดู 1,262 ป้ายกำกับ JWT
^