GORAGOD.com

freelance, web developer, web designer, hosting, domain name

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

การเข้ารหัสและถอดรหัส 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);
0SHAREFacebookLINE it!
^