JWT ကို သိတာကတော့ ကြာလှပါပြီ။ သို့ပေမယ့် သေသေချာချာ မသိဘူး။ Laravel မှာပါသည့် library ကိုပဲ သုံးလိုက်တာပဲ။ အခုမှ JWT ဆိုတာ ဘာလဲ ဆိုတာကို သေချာ ပြန်ဖတ်ကြည့်မိတယ်။
ကျွန်တော်တို့တွေ api authentication တွေကို သုံးသည့် Method တွေကတော့
-
- HTTP Basic Authentication
- API Key or Token
- OAuth
စတာတွေ အသုံးပြုကြပါတယ်။ JSON Web Token (JWT) ဟာ နောက်ပိုင်း လူ အသုံးများလာပြီး လက်ရှိ API အသုံးပြုထားသည့် project တိုင်းနီးပါး JWT ကို သုံးထားတယ်။ သို့ပေမယ့် အများစု က token ထွက်လာတာပဲ သိပါတယ်။
JWT Token တစ်ခုပါ ၃ ပိုင်းပါပါတယ်။ Header , Payload , Signature ဆိုပြီး အပိုင်း ၃ ခု ရှိပါတယ်။ တစ်ပိုင်းဆီဟာ base64 url encode လုပ်ထားပြီး dot (.) နဲ့ string ကို ပေါင်းထားပါတယ်။ JWT token တစ်ခု ဟာ အောက်ကလို တွေ့နိုင်ပါတယ်။
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vd3d3LmNvbXF1YXMuY29tL3NhbXBsZS9sb2dpbiIsImlhdCI6MTU2MTk2Mjc3NCwiZXhwIjoxNTY0NTU0Nzc0LCJuYmYiOjE1NjE5NjI3NzQsImp0aSI6InUyelprMW1kOFlIbXR3MlUiLCJzdWIiOjE2NSwicHJ2IjoiODdlMGFmMWVmOWZkMTU4MTJmZGVjOTcxNTNhMTRlMGIwNDc1NDZhYSJ9.wgVdbCYEFgcs5F-cEHLmBkaiygFgHkbJ1WGjeP3R54Y
အဲဒီ code မှာ
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJpc3MiOiJodHRwOi8vd3d3LmNvbXF1YXMuY29tL3NhbXBsZS9sb2dpbiIsImlhdCI6MTU2MTk2Mjc3NCwiZXhwIjoxNTY0NTU0Nzc0LCJuYmYiOjE1NjE5NjI3NzQsImp0aSI6InUyelprMW1kOFlIbXR3MlUiLCJzdWIiOjE2NSwicHJ2IjoiODdlMGFmMWVmOWZkMTU4MTJmZGVjOTcxNTNhMTRlMGIwNDc1NDZhYSJ9
wgVdbCYEFgcs5F-cEHLmBkaiygFgHkbJ1WGjeP3R54Y
ဆိုပြီး dot(.) နဲ့ ခွဲ ထုတ်လိုက်နိုင်ပါတယ်။ ရှေ့ ၂ ပိုင်းက Header နဲ့ payload ပါ။ နောက်ဆုံး အပိုင်းကတော့ signature ပါ။ base64 decode လုပ်ကြည့်လိုက်ရင် အောက်ကလို မြင်ရပါမယ်။
Header
{
"typ": "JWT",
"alg": "HS256"
}
Header အပိုင်းမှာတော့ signature ကို ဘယ် method နဲ့ hashing လုပ်မယ်ဆိုတာကို ဖော်ပြထားပါတယ်။ HS256 ဆိုတာကတော့ SHA 256 နဲ့ signuare ကို hash လုပ်မယ်လို့ ဆိုပါတယ်။
Payload
{
"iss": "http://comquas.com/sample/login",
"iat": 1561962774,
"exp": 1564554774,
"nbf": 1561962774,
"jti": "u2zZk1md8YHmtw2U",
"sub": 165,
"prv": "87e0af1ef9fd15812fdec97153a14e0b047546aa"
}
Body မှာတော့ Payload data တွေပါပါတယ်။ စိတ်ကြိုက် JSON data တွေ ထည့်သွင်းနိုင်ပါတယ်။ သို့ပေမယ့် JWT အနေနဲ့ registered လုပ်ထားသည့် Key တွေရှိပါတယ်။ ဒီမှာ ဖတ်ကြည့်နိုင်ပါတယ်။
– “iss” (Issuer) Claim
– “iat” (Issued At) Claim
– “exp” (Expiration Time) Claim
– “nbf” (Not Before) Claim
– “jti” (JWT ID) Claim
– “sub” (Subject) Claim
Signature
HMAC-SHA256( base64urlEncoding(header) + ‘.’ + base64urlEncoding(payload), secret )
Singuare ကတော့ hashing ပါ။ Header မှာ ရေးထားသည့် algorithm နဲ့ hash လုပ်ပါမယ်။ base64urlEncoding က သီးသန့် method ရှိပါတယ်။ base64 encoding နဲ့ မတူပါဘူး။ Hashing လုပ်သည့်အခါမှာ သီးသန့် secrect key နဲ့ hash လုပ်ဖို့ လိုပါတယ်။
Server ဘက်က token ရလာသည့် အခါမှာ အရင် ဆုံး singuare ကို ပြန်စစ်ပါတယ်။ server မှာ ရှိထားသည့် secrect key နဲ့ singuare ကို verify လုပ်ပြီး token ဟာ expire valid လား ဆုံးဖြတ်ပါတယ်။ payload ကနေ တဆင့် token ဟာာ expire ဖြစ်မဖြစ် စစ်ပါတယ်။
JWT ဟာ ရိုးရှင်း ပြီးတော့ လွယ်ကူပါတယ်။ Laravel မှာ JWT သုံးချင်ရင်တော့ Build authentication into your Laravel API with JSON Web Tokens (JWT) ကို ဖတ်ရှုနိုင်ပါတယ်။
Leave a Reply