การเข้ารหัสและถอดรหัส JWT ด้วย PHP และมีการ Verify Signature ด้วย
การเข้ารหัส ด้วย 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);