Ste se kdaj prijavili v spletno aplikacijo preko Google, Facebook ali GitHub računa? Če da, ste že uporabili OAuth. OAuth je odprti standard za pooblastitev, ki omogoča aplikacijam dostop do uporabniških podatkov na drugi storitvi — brez da bi uporabnik razkril svoje geslo.
Kaj je OAuth?
OAuth 2.0 je okvir za pooblastitev (authorization framework), ki omogoča aplikaciji tretje osebe, da pridobi omejen dostop do uporabniškega računa na drugi storitvi. Namesto da bi uporabnik vnesel svoje geslo v aplikacijo tretje osebe, OAuth uporabi žetone (tokens), ki določajo, do katerih podatkov ima aplikacija dostop in za kako dolgo.
Primer iz vsakdanjega življenja: Predstavljajte si, da greste v hotel. Namesto da bi recepcijskemu uslužbencu dali ključ od svojega doma, prejmete kartico za dostop do hotelske sobe. Kartica omogoča dostop samo do določenih prostorov in preneha veljati ob odjavi. OAuth deluje podobno — aplikacija dobi žeton za dostop do določenih podatkov, ne pa gesla.
Zakaj je OAuth nastal?
Pred OAuth-om je bila pogosta praksa, da so aplikacije tretjih oseb zahtevale uporabniško ime in geslo za dostop do storitev, kot so Gmail ali Twitter. To je pomenilo več resnih varnostnih težav:
- Izpostavljenost gesel: Aplikacija tretje osebe je videla in shranjevala uporabnikovo geslo v izvorni obliki
- Preširoka dovoljenja: Aplikacija je dobila poln dostop do računa, ne samo do podatkov, ki jih je potrebovala
- Težko preklicovanje: Edini način za preklic dostopa je bila sprememba gesla
- Kompromitacija: Če je bila aplikacija tretje osebe vdrla, so bila gesla uporabnikov ogrožena
OAuth 2.0 je bil objavljen leta 2012 in rešuje vse te težave z uvajanjem žetonov in omejenih dovoljenj (scopes).
Ključni pojmi
Za razumevanje OAuth-a je treba poznati štiri glavne vloge:
| Vloga | Opis | Primer |
|---|---|---|
| Lastnik vira (Resource Owner) | Uporabnik, ki je lastnik podatkov | Uporabnik Google računa |
| Odjemalec (Client) | Aplikacija, ki želi dostop do podatkov | Spletna aplikacija, ki želi uvoziti stike |
| Strežnik za pooblastitev (Authorization Server) | Strežnik, ki preveri identiteto in izda žetone | Google Authorization Server |
| Strežnik virov (Resource Server) | Strežnik, ki hrani zaščitene podatke | Google Contacts API |
Poleg vlog so pomembni še naslednji pojmi:
- Access Token: Žeton, ki aplikaciji omogoča dostop do določenih podatkov. Ima omejeno veljavnost
- Refresh Token: Žeton za obnovitev access token-a, ko ta poteče. Uporabnik se ne mora ponovno prijaviti
- Scope: Določa, do katerih podatkov ima aplikacija dostop (npr. samo branje profila, ne pa pošiljanje e-pošte)
- Authorization Code: Začasna koda, ki jo odjemalec prejme in jo zamenja za access token
- Redirect URI: URL, na katerega je uporabnik preusmerjen po uspešni prijavi
Potek OAuth 2.0 (Authorization Code Flow)
Najpogostejši tip OAuth poteka je Authorization Code Flow, ki se uporablja pri spletnih aplikacijah. Tukaj je korak za korakom:
| Korak | Opis |
|---|---|
| 1. Zahteva po pooblastitvi | Uporabnik klikne "Prijava z Google" v aplikaciji |
| 2. Preusmeritev | Odjemalec preusmeri uporabnika na strežnik za pooblastitev z navedbo potrebnih dovoljenj (scopes) |
| 3. Prijava in soglasje | Uporabnik se prijavi v svoj račun in potrdi, katera dovoljenja dovoljuje aplikaciji |
| 4. Vrnitev kode | Strežnik za pooblastitev preusmeri uporabnika nazaj na aplikacijo z authorization code |
| 5. Izmenjava za žeton | Odjemalec pošlje kodo na strežnik za pooblastitev in v zameno prejme access token |
| 6. Dostop do podatkov | Odjemalec uporabi access token za dostop do zaščitenih podatkov na strežniku virov |
Tipi potekov (Grant Types)
OAuth 2.0 podpira več različnih potekov, odvisno od tipa aplikacije:
| Tip poteka | Namen | Opis |
|---|---|---|
| Authorization Code | Spletne aplikacije (server-side) | Najbolj varen in najpogostejši. Koda se izmenja na strežniku, žeton ni izpostavljen brskalniku |
| Client Credentials | Stroj-na-stroj (machine-to-machine) | Aplikacija se avtenticira v svojem imenu, brez uporabnika. Uporablja se za API klice med storitvami |
| PKCE (Proof Key for Code Exchange) | Mobilne aplikacije in SPA | Razširitev Authorization Code flow-a, ki ščiti pred prisvzemanjem kode na napravah brez varnega shranjevanja |
| Implicit (opuščen) | Nekoč za SPA aplikacije | Žeton se vrne direktno v URL fragmentu. Ni več priporočen zaradi varnostnih tveganj |
| Password Credentials (opuščen) | Nekoč za zaupanja vredne aplikacije | Aplikacija neposredno zbira uporabniško ime in geslo. Odstranjeno iz priporočil OAuth 2.1 |
Primer registracije aplikacije
Da lahko aplikacija uporablja OAuth, se mora najprej registrirati pri ponudniku storitve (npr. Google, GitHub, Facebook). Pri registraciji dobi:
# Primer podatkov, ki jih aplikacija prejme pri registraciji Client ID: 123456789012-abcdefghijklmnopqrstuvwxyz.apps.googleusercontent.com Client Secret: GOCSPX-abCdEfGhIjKlMnOpQrStUvWxYz # Redirect URI (kam se vrne uporabnik po prijavi) Redirect URI: https://vadnica.org/auth/callback # Scopes (dovoljenja, ki jih aplikacija zahteva) Scopes: - openid # Za avtentikacijo (OpenID Connect) - profile # Branje osnovnih podatkov profila - email # Branje e-poštnega naslova
Client Secret je tajni ključ aplikacije in mora biti shranjen varno — nikoli ne sme biti izpostavljen v klientni strani kode (JavaScript v brskalniku).
OAuth 2.0 vs. OpenID Connect
To je pogosta zmeda, ki jo je treba razjasniti:
| Lastnost | OAuth 2.0 | OpenID Connect (OIDC) |
|---|---|---|
| Namen | Pooblastitev (kaj lahko aplikacija stori) | Avtentikacija (kdo je uporabnik) |
| Rezultat | Access Token | ID Token (vsebuje podatke o uporabniku) |
| Vprašanje | "Ali lahko dostopam do teh podatkov?" | "Kdo si ti?" |
| Razmerje | Samostojen okvir | Plast nad OAuth 2.0 |
Preprosto rečeno: OAuth 2.0 reši vprašanje pooblastitve (ali lahko aplikacija bere vaše stike), OpenID Connect pa reši vprašanje avtentikacije (ali ste res vi). Večina sodobnih prijav "Login with Google" uporablja obe skupaj.
Najpogostejše varnostne napake
- Nepravilna validacija redirect URI: Če strežnik ne preverja redirect URI-ja natančno, lahko napadalec preusmeri authorization code na svoj strežnik
- Izpostavljen Client Secret: Če se Client Secret nahaja v JavaScript kodi na strani odjemalca, ga lahko napadalec izkoristi
- Preširoki scopes: Zahtevanje več dovoljenj, kot jih aplikacija potrebuje, krši načelo najmanjših pravic
- Neuporaba PKCE: Pri mobilnih in SPA aplikacijah je PKCE obvezen — brez njega je potek ranljiv na prisvzemanje kode
- Nepravilno shranjevanje žetonov: Access token-i morajo biti shranjeni varno in nikoli v lokalni shrambi brskalnika (localStorage)
OAuth 2.1 — prihodnost
OAuth 2.1 je najnovejša različica, ki združuje najboljše prakse in odstranjuje zastarele metode. Glavne spremembe:
- PKCE je obvezen za vse poteke z avtorizacijsko kodo
- Implicit flow je popolnoma odstranjen
- Password Credentials flow je odstranjen
- Bearer token-i imajo striktna pravila za uporabo
Cilj OAuth 2.1 je poenostaviti implementacijo in odstraniti variante, ki so se izkazale za nevarne ali prekomerno zapletene.
Zakaj uporabljati OAuth?
OAuth je postal standard za varno pooblastitev v sodobnih spletnih in mobilnih aplikacijah. Njegove glavne prednosti so:
- Brez deljenja gesel: Uporabnik nikoli ne vnese gesla v aplikacijo tretje osebe
- Omejen dostop: Aplikacija dobi dostop samo do podatkov, ki jih potrebuje
- Enostavno preklicovanje: Uporabnik lahko kadar koli prekliče dovoljenje v nastavitvah svojega računa
- Boljša uporabniška izkušnja: Prijava z enim klikom brez ponovnega ustvarjanja računa
- Standardizacija: Enak protokol podpirajo Google, Microsoft, GitHub, Facebook in številni drugi
V svetu, kjer so podatkovne kršitve vsakdanji pojav, OAuth ponuja varen način za izmenjavo podatkov med aplikacijami — brez tveganja izpostavljenosti gesel. Vsak razvijalec, ki gradi aplikacijo z uporabniškimi prijavami, bi moral razumeti osnove OAuth 2.0.