OAuth 2.0 – ką reikia žinoti apie autorizacijos tipus?

2019 07 19

Praėjusiame blog‘o įraše aptarėme, kas yra ir kaip veikia OAuth 2.0 sistema. Šiandien visa įrašą skirsime išsamiau panagrinėti galimus autorizacijos tipus.

Autorizacijos tipas – resurso savininko įgaliojimas, kurį naudoja aplikacija, prašant prieigos rakto (angl. access token). OAuth2 specifikacijoje yra aprašyti penki naudojami autorizacijos leidimo tipai (angl. authorization grant types) – authorization code/authorization code with PKCE, implicit, client_credentials, password ir refresh token. Kiekvieno tipo panaudojimas ir pritaikymas kiek skiriasi. Pasirenkant autorizacijos tipą reiktų atsižvelgti į tris faktorius: kas yra prieigos rakto savininkas, koks yra aplikacijos tipas ir koks yra resurso tipas (pirmos šalies (angl. first party), ar trečiosios šalies (angl. third party)).

Authorization code

Authorization code – vienas saugiausių iš pateiktų autorizacijos tipų, bet kartu ir sudėtingiausias. Čia svarbų vaidmenį atlieka autorizacijos kodas. Jo paskirtis yra išsikeisti prieigos raktą jį pateikiant ir veikia kaip tarpininkas tarp autorizacijos serverio ir aplikacijos, kuris leidžia autorizuoti resurso savininką.

Šio tipo veikimo principą galime išskirti į dvi atskiras dalis:

  • Autorizacijos kodo gavimas
  • Prieigos rakto gavimas, pateikiant autorizacijos kodą

Autorizacijos kodo gavimas

Aplikacija nukreipia vartotoją į autorizavimo serverį su šiais parametrais užklausos eilutėje:

  • response_type su reikšme code.
  • client_id su aplikacijos prisijungimo identifikatoriumi. Šis parametras gaunamas, kai aplikaciją užregistruojame prie autorizacijos serverio.
  • redirect_uri su kliento nukreipimo adresu. Redirect turi paskirtis – nukreipti atgal į pasirinktą adresą po autorizacijos patvirtinimo grįžtant iš autorizacijos serverio.
  • scope su sričių sąrašu. Pateikdami šį sąrašą aplikacija gauna informacija apie vartotoją, jo prieigos teises.
  • state su būsenos parametru. Šis parametras yra pasirinktinas, bet labai rekomenduojamas.

Vertėtų saugoti būsenos parametro reikšmę vartotojo sesijoje, kad jis būtų patvirtintas grįžtant iš autorizacijos serverio. Pagrindinė būsenos parametro naudojimo priežastis yra apsisaugoti nuo CSRF atakų. Būsenos parametras yra String tipo, todėl yra galimybė koduoti, bet kokią kitą informaciją.

Užklausos pvz:

       GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=
https://client.example.com/HTTP/1.1
Host: server.example.com

Visi šie parametrai bus patvirtinti autorizacijos serverio. Toliau vartotojo bus paprašyta prisijungti prie autorizacijos serverio ir patvirtinti aplikacijos leidimą gauti autorizacijos kodą. Vartotojui patvirtinus aplikacijos leidimą, autorizacijos serveris grąžins vartotoją į nurodytą nukreipimo adresą (angl. redirect_uri) su šiais parametrais užklausos eilutėje:

  • code su autorizacijos kodu. Autorizacijos kodas gali būti užkoduotas su nustatytu gyvavimo laiku ir vienkartiniu panaudojimu.
  • state su būsenos parametru. Autorizacijos serveris grąžins tą pačią būsenos parametro reikšmę, kuri turi būti sutikrinama su prieš tai pateiktą.

Grąžinamos užklausos pvz:

HTTP/1.1 302 Found Location:https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

Prieigos rakto gavimas, pateikiant autorizacijos kodą

Aplikacija gavusi autorizacijos kodą toliau vykdo POST užklausą į autorizacijos serverį su šiais parametrais:

  • grant_type su reikšme authorization_code.
  • client_id su aplikacijos prisijungimo identifikatoriumi. Parametras gaunamas, kai aplikaciją užregistruojame prie autorizacijos serverio.
  • client_secret su aplikacijos prisijungimo slaptažodžiu Parametras gaunamas, kai aplikaciją užregistruojame prie autorizacijos serverio.
  • redirect_uri su kliento nukreipimo adresu, kuris buvo pateiktas autorizacijos kodo gavimo užklausoje.
  • code su autorizacijos kodu, kuris buvo gautas iš autorizacijos serverio.