json web token คืออะไร

JSON Web Token (JWT) มาตรฐาน (RFC 7519) ใช้ทำ API รับส่งข้อมูลที่ secure ระหว่าง Third parties ด้วย JSON object. ข้อมูลจะถูก verified เข้ารหัสด้วยลายมือชื่อดิจิตอล(digitally signed). โดยทำได้ 2 วิธี 1.HMAC algorithm 2. public/private key pair using RSA. โดยในตัวอย่างนี้จะใช้วิธีที่ 2.

1. openssl

openssl genrsa -out key.rsa
openssl rsa -in key.rsa -pubout > key.rsa.pub

android jose4j lib หากพบ error InvalidKeyException: An RSA key of size 2048 bits or larger MUST be used with the all JOSE RSA algorithms (given key was only 512 bits.
ให้แก้ปัญหาตามนี้

https://stackoverflow.com/questions/31779585/verification-key-for-jose4j-jwtconsumer

2. ssh

ssh-keygen

2 วิธีนี้ไม่ต่างกัน https://security.stackexchange.com/questions/29876/what-are-the-differences-between-ssh-generated-keysssh-keygen-and-openssl-keys

ลักษณะโดยทั่วไปของ JWT

  • Compact: ลดขนาดการรับส่งข้อมูล ทำให้รับส่งไวขึ้น
  • Self-contained: เก็บข้อมูล user ไว้ใน payload โดย verified ด้วยลายมือชื่อที่ client ไม่ต้องเรียก server เพื่อ query database ทำให้ลด load จำนวนมหาศาล

เมื่อไรถึงจะควรใช้ JWT

  • Authentication: ระบบที่ใช้ Login แบบ SSO , Oauth
  • Information Exchange: ข้อมูลที่มีการแลกเปลี่ยนกันบ่อย เช่น API get profile , get info

SERVER จังหวะ Signing return id_token ด้วย public/private pair key

$header = array(
'algor' => 'RS256',
'jku' => 'https://www.googleapis.com/oauth2/v2/certs'  // example google public jwk uri
);

$payload = array(
'sub' => '134567899', //subject identify unique id
'name' => 'kongarn',
'aud' => '29' // client_id
);

$signature_input = base64_encode($header) . base64_encode($payload);

$signature = RSA_ENCRYPIT($signature_input) //signing signature_input with private_key (private_key จะอยู่ที่ server เท่านั้น client ถือเฉพาะ public key jwk uri

//Json web signature(JWS)
$id_token = signature_input . $signature;

CLIENT จังหวะ verify id_token หลักการจะยืนยันตัวตนด้วย public key นำลูกกุญแจนี้ ไปไข id_token ที่ถูกเข้ารหัสเป็นแม่กุญแจด้วย public/private pair key ตัวอย่างใช้ php lib จะมีฟังก์ชั่น jwt_verify โดยจะนำ public jwk uri เลือก kid(key id) และ n ไปทำ public certificate key และนำมา verify กับ id_token

ปัจจุบันมี Client libraries แทบจะทุกภาษา
1. json web token for php library
2. json web token for java library
3. json web token for jquery

if(jwt_verify($id_token)){//verify jwt_token with json web token public key (jwk)
echo 'correct';
}else{
echo 'wrong';
}

Test decode/verify signature id_token ได้ที่ https://jwt.io/

โดย signature จะ verify ด้วย public certificate สามารถ debug เอา public certificate ได้ใน local lib ของเราเอง ถ้าใน php นั้น เข้าไปใน method jwt_verify จะมีจุดให้ debug หา public certificate

Related posts:

This entry was posted in json web token (jwt), ไม่มีหมวดหมู่. Bookmark the permalink.