What is OAuth2?

kyaw swar aung
4 min readAug 14, 2019

--

protocol တစ်ခုပါ. Authorization process ကိုဘယ်လို implementation လုပ်ရမလဲဆိုတဲ့ နည်းလမ်းတစ်ခုပါ။ မည်သည် language နဲ့မဆို implementation လုပ်လို့ရပါတယ်။

အကျဉ်းချုံးပြောရရင် User တစ်ယောက်က တခြား Application မှာရှိတဲ့ သူ့ရဲ့ information တွေကို Third party Application က အချိန်အတိုင်အတာ နဲ့ limit permission တွေနဲ့ သူ့ကိုယ်စား ယူသုံးလို့ရနိင်အောင် လုပ်ပေးထားခြင်းလို့ လွယ်ကူအောင်ပြောလို့ရပါတယ်။ သူရဲ့ရည်ရွယ်ချက်က user တစ်ယောက်ကသူ့ရဲ့ password ကိုပေးစရာမလိုပဲ သူ့ရဲ့ information တွေကို behalf of user အနေနဲ့ယူသုံးလို့ရအောင်ရေးတာပါ။

အထက်ပါ Definition က နားရှုပ်စရာရှိပါတယ်။ အဲဒါတွေအားလုံးကို လွယ်လွယ်လေး တခွန်းတည်းပြောလိုက်ရင် ရပါတယ်။ အဲဒါကတော့ SSO ပါ။

What is SSO?

Single Sign-On(SSO) ဆိုတာ ကျွန်တော်တို့နေစဉ် သုံးနေတာ သတိထားမိကြလားမသိဘူး။ ဥပမာ ဆိုပါတော့ google account တစ်ခုဖွင့်လိုက်ရုံနဲ့ တနည်းအားဖြင့် login ဝင်လိုက်ရုံနဲ့ youtube မှာရော google နဲ့သက်ဆိုင်ရာ product တွေမှာ account ဆောက်စရာမလိုပဲ/login ဝင်စရာမလိုပဲ တန်းဝင်ပြီးသား ဆောက်ပြီးသား ဖြစ်နေတာ သတိထားမိကြမှာပါ။

တနည်းအားဖြင့် application တစ်ခုမှာရှိတဲ့ User credential or information တွေကို နောင် app တွေမှာ share ပြီးသုံးနိင်အောင် လုပ်ထားတာပါ။ User က Login ခဏ ခဏ ဝင်စရာမလိုပဲ/User credentail တွေကို ခဏခဏရိုက်စရာမလိုပဲ single login/singin လုပ်လိုက်ရုံနဲ့ သူ့နဲ့သက်ဆိုင်ရာ app တွေမှာပါ သူသုံးလို့ရနေအောင် လုပ်ပေးခြင်းကို ဆိုလိုတာပါ။

သေချာအောင် နောက်ထပ်ဥပမာ တစ်ခုနဲ့ ထပ်ရှင်းပြပါမယ်။

ကျွန်တော် က app1 တစ်ခုရေးထားတယ်ဆိုပါစို့။ အဲဒီ app ကို User တွေကလဲ အသုံးများတယ်ပေါ့။ အချိန်ကြာလာတော့ ကျွန်တော်က နောက်ထပ် တခြား domain နဲ့ပတ်သက်ပြီး App2 တစ်ခု ထပ်ရေးဖို့ရှိတယ်ဆိုပါစို့။ တကယ်လို့ အခု app2 အသစ်ကို လာသုံးမယ့် User က app1 ထဲကလူပဲဖြစ်မယ်ဆိုရင် အကောင့်မဆောက်ခိုင်းတော့ပဲ ရှိပြီးသား app1 ထဲက user information ကို ပဲယူသုံးချင်တယ်။ ဘာလို့လဲဆိုတော့ ရှိပြီးသား user history ကို app2 ထဲမှာပြန်သုံးချင်တယ်။ အကယ်လို့ App2 က shopping app ဆိုပါစို့။ အဲဒါဆိုရင် အဲဒီ user history က အရမ်းကိုအသုံးဝင်ပြီလေ။

App1 ထဲက user data တွေကို app2ထဲမှာ user registration လုပ်စရာမလိုပဲ ယူသုံးလို့ရအောင်လုပ်တာကို SSO လိုခေါ်ပါတယ်။

SSO က အဲဒီလိုအခြေအနေတွေနဲ့သင့်တော်ပါတယ်။

အဲဒါဆိုရင် SSO နဲ့ Oauth ကဘယ်လိုပတ်သတ်နေတာလဲပေါ့။အဲဒီလို SSO ရအောင်လို့ Oauth နည်းလမ်းသုံးပြီးရေးလို့ရပါတယ်။

အဲဒီတော့ သူ့ flow ကိုအရင်မပြောခင် သူ့မှာပါတဲ့ term တွေကိုအရင်ဆုံး သိထားသင့်ပါတယ်။

  • Resource Owner
  • Client
  • Authorization Server
  • Resource Server
  • Authorization Grant
  • Redirect URI
  • Access Token

Resource Owner ဆိုတာက User/actor ကိုပြောတာပါ။

Client ဆိုတာက ဥပမာထဲက App2 ကိုပြောတာပါ။ တနည်းအားဖြင့် resource ကို consume လုပ်မယ့် thrid party ပါ။

Authorization Server က App1 ထဲမှာရှိတဲ့ User Authorization server ကိုပြောတာပါ။

Resource Server ကတော့ User data တွေသိမ်းထာတဲ့ နေရာ။ တနည်းအားဖြင့် thirdparty တွေအတွက် လိုအပ်တဲ့ resource တွေကို သိမ်းထာတဲ့နေရာ။

Authorization Grant ကတော့ ဘယ်လို resource server and authorization server တွေ့နဲ့ integration လုပ်ရမယ့် flow ကိုပြောတာပါ။ Oauth မှာ Flow တွေရှိပါတယ်။ နောက်မှရှင်းပါ့မယ်။

Redirect URI ကတော့ authorization server ကနေ thirdparty app ကိုပြန်ခေါ်ပေးဖို့အတွက် Link ပါ။ အဲဒီ link ထဲကနေ thirdparty အတွက်လိုအပ်တဲ့ access token ကိုထည့်ပြီး authorization server ကနေ URIကို ခေါ်ပေးပါတယ်။

Access Token ကကျတော့ resource server ကို ဒါနဲ့လှမ်းပြီး user တယောက်ကိုယ်စား access လုပ်မှပါ။ သူ့ထဲမှာ ဘယ်အချိန် expired ဖြစ်မယ်။ ဘာတွေပဲ လုပ်လို့ရမယ် ဆိုတဲ့ permission တွေပါပါတယ်။ အဲဒါကို scope ကို့ခေါ်ပါတယ်။

ကျွန်တော်တို့ ကြုံဖူးကြမှာပါ။ App တစ်ခုကို facebook နဲ့login ဝင်မယ်ပြောရင် facebook ကနေ screen ကျလာပြီးတော့ မေးတာတွေလေ ကြုံဖူးမြလား မသိဘူး။ အဲဒီမှာ This app will access the following your email or something ဆိုပြီးတော့ မေးတာလေ။ အဲဒါကို Scope လိုခေါ်တာပါ။ User ကိုယ်စား user က အဲဒီ app ကို facebook က user data ကို ယူသုံးဖို့ခွင့်ပေးလိုက်တာပါ။

ကဲ အဲဒီတော့ Oauth ရဲ့ Flow တွေအကြောင်းပြောကြရအောင်… ဘယ် Flow ကဘာဆိုတာကို grant type နဲ့ ခွဲတယ်ပေါ့။ အဲဒီတော့ grant type ကအသက်ပဲ။

Authorization Code Flow

သူကတော့အသုံးများတယ်။ ကျွန်တော် web app ကgmail account နဲ့ register လုပ်ဖို့ Login with Google ကို login page မှာပါတယ် လို့ထားပါတော့။ အဲဒီ login with google button နိမ့်တာနဲ့ ကျွန်တော့ app က gmail server ကို အောက်ပါက parameter တွေပါပြီးတော့ redirect လုပ်ပေးပါ့မယ်။

https://accounts.google.com/o/oauth2/v2/auth?client_id=my_client_id&redirect_uri=https://myserver.com/callback&scope=profile&response_type=code&...

ဒီမှာ scope က profile ကိုaccess လုပ်မယ်ဆိုပြီး google ကိုကြေငြာထားပါတယ်။ ပြီးတော့ response_type က code flow ကိုသုံးမယ်ဆိုပြီးပြောထားရပါတယ်။

အဲဒီလို redirect လုပ်လိုက်တဲ့အချိန်မှာ google က login page တတ်လာပြီး user ကို login ဝင်ခိုင်းပါမယ်။ အဲဒီမှာ user awaress ရှိအောင် ဘာ scope ကိုသုံးမယ်ဆိုတာကိုပါ ဖော်ပြပေးထားပါတယ်။

User login ဝင်ပြီးလို့ success ဖြစ်သွားရင် Google က ကျွန်တော့ app ကို redirect_uri အတိုင်း အောက်ပါ parameter တွေပါထည့်ပြီးတော့ လာခေါ်ပါမယ်။

https://myserver.com/callback?code=...&state=....

အဲဒီလိုနဲ့ ကျွန်တော် app က google ရဲ့ authorization server ကိုလှမ်းခေါ်ပြီး access_token ရဖို့ အဲဒီ code နဲ့ exchange လုပ်မှ ရပါမယ်။

ရလာတဲ့ access token နဲ့ google ရဲ့ resource server ကိုလှမ်း access လုပ်ပြီး လိုချင်တဲ့ user profile ရလာပါပြီ။ အဲဒီ ပထမ login with google step ကလွဲရင် step တွေအားလုံးက ကျွန်တော့ app ရဲ့ server side ဘက်ခြမ်းမှာပဲ လုပ်နေတာပါ။

ss from youtube

Implicit Flow

သူက code flow နဲ့ လုပ်ဆောင်ပုံခြင်တူပါတယ်။ မတူတာဆိုလို့ access_token တောင်းတာပဲရှိပါတယ်။ code flow တုန်းကလို့ code နဲ့ access_token exhange လုပ်တဲ့ step မပါတော့ပါဘူး။ သူ့က တိုက်ရိုက် access_token ကိုရပါတယ်။ အဲဒီ token နဲ့ google resource server ကိုတန်းခေါ်တာပါ။ သူကတော့ front end app တွေမှာ အသုံးများပါတယ်။

ss from youtube

OpenId Connect

OpenId Connect က တကယ်တော့ သူလဲ Oauth ပေါ်မှာ ထပ်ပေါင်းထားတဲ့ authentication ဘယ်လိုလုပ်ရမလဲဆိုတဲ့ နည်းလမ်း တစ်ခုပါ။ Oauth အပေါ်ကနေ layer တစ်ခုခံလိုက်တဲ့ သဘောပါ။ တကယ်လို့ Oauth က authorization အတွက် ရည်ရွယ်ထားတဲ့အတွက် သူပြန်ပေးလိုက်တဲ့ response parameters တွေမှာ user နဲ့ပတ်သတ်တဲ့ information တွေမပါပါဘူး။ google ကနေ call back url ရလာချိန်မှာ ဘယ်သူက login/permission ပေး ဝင်လိုက်လို့ စတာတွေမပါဝင်ပါဘူး။ အဲဒီလိုတွေသိဖို့လိုလာပြီဆိုရင် OpenId connect ကိုခံသုံးပါတယ်။ သူက တခြားတော့မဟုတ်ပါဘူး.. scope အမျိုးအစားတစ်ခုပါပဲ။

အောက်ပါပုံကိုကြည့်လိုက်ရင်ရှင်းပါတယ်။ scope မှာ openid ထည့်ပေးလိုက်တာပါ။ ပြန်လာတဲ့ exchange code နဲ့ id_token and access_token ကိုရပါတယ်။ id_token ကတော့ current user ရဲ့ information ရယ် သူ့နဲ့သက်ဆိုင်တဲ့ data တွေပါ ပါတယ်။

copy from youtube.

အဲဒီတော့ သူတို့ကြားထဲမှာရှိတဲ့ id_token ကို JWT နဲ့သုံးလို့ရပါတယ်။ဒီနေရာမှ နောက်ဆုံးပြောချင်တာက SSO application တစ်ခုကို resource server, authorization server ကိုယ့်ဘာသာ တည်ဆောက်ပြီး implementation လုပ်လို့ရပါတယ်။ အထက်မှာ google resource server, authorization server တွေနဲ့ ဥပမာပေးထားတာကလဲ ထင်သာမြင်သာရှိလို့ပါ။

ref: https://www.youtube.com/watch?v=996OiexHze0&list=LLaRtWkiFAcRYqDVBCfOixgQ ကို မှီးညမ်းထားပါသည်။

https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth

--

--