OpenID vs OAuth: bitva, která se nekoná

V souvislosti s blížícím se spuštěním služby MojeID od CZ.NIC se opět hovoří o protokolu OpenID. Diskuse jsou bouřlivé a argumenty vášnivé. Na Zdrojáku jsme o OpenID a dalších metodách měli před časem celý seriál; dnes se k němu vrátíme, a to článkem o velmi časté chybě, která se v těchto diskusích objevuje.

Na úvod je nezbytné uvést jednu věc: V článku nebude řeč o tom, jestli OpenID „umírá“, jestli „se nikdy neprosadil“ apod. – takové dohady nechme na Lupu či Roota, kde už, minimálně v komentářích, probíhají. A padají tam argumenty od zasvěcených a minimálně zváženíhodných až po naprosto liché. Čas od času se objeví i komentář od „odborníka“, který píše: „OpenID je mrtvý, měli by použít OAuth, ten jede!

A protože tenhle komentář se opakuje častěji než by bylo zdrávo, podíváme se na obě technologie, srovnáme si jejich schopnosti, funkci a (především) koncepci, zaměření a určení. Řekneme si, pro co je která technologie použitelná a jakým způsobem. Po přečtení článku si už dokážete sami odpovědět, jestli „by měli místo OpenID použít OAuth“…

OpenID

OpenID (viz články na Zdrojáku a seriál o autentizačních metodách) je technologie, jejímž cílem je vytvořit univerzální otevřený decentralizovaný systém ověřování identity. Co to znamená?

Univerzální

OpenID je teoreticky možno použít kdekoli, v jakékoli službě, v jakémkoli webu, kde potřebujete „přihlásit uživatele“. Všude tam, kde dnes existuje „přihlášení jménem a heslem“, může být nasazeno OpenID. Uživatel se může přihlásit pomocí svojí OpenID identity; OpenID protokol definuje, jaké kroky má klient, tedy stránka, kam se přihlašuje, udělat, jak má předat požadavek identifikační autoritě (v terminologii OpenID je to poskytovatel), co má poskytovatel s požadavkem udělat a jakým způsobem má dát vědět zpět klientovi, že daný uživatel je opravdu tím, za koho se přihlašuje.

Aby celá věc byla opravdu univerzální, zahrnuje OpenID protokol několik úrovní zabezpečení, takže citlivé operace lze např. podmínit tím, že klient bude po poskytovateli vyžadovat, aby uživatele ověřil pomocí více metod (např. pomocí hesla a pomocí PIN kódu zaslaného mailem). Klient může dokonce požadovat, aby alespoň jedna z použitých metod byla „ne-online“, tedy např. autorizační SMS nebo pomocí HW modulu s klíčem.

OpenID protokol je proto velmi komplexní. Definuje vše, od toho, jak má vypadat požadavek a jak má být předán, přes položky, které může uživatel vyplnit a klient požadovat, až po podmínky, za jakých poskytovatel tyto informace předá a kdy si má vyžádat svolení od uživatele.

„Nechci, aby MojeID posílalo všechny moje údaje při každém přihlášení komukoliv.“ Tak tomu není, uživatel při povolování přístupu vidí, jaké informace stránka požaduje, které z nich považuje za nezbytné, a může se rozhodnout, které chce dát a které ne. Pokud nechce dát žádné, tak se nic nepošle. Klienti mohou mít tendenci vyžadovat víc, než opravdu potřebují – pak se ale nesmí divit, když jim uživatelé nebudou chtít tyto informace poskytnout.

Otevřený

Protokol OpenID je od začátku koncipovaný jako otevřený – tedy za jeho použití nemusíte platit, jeho specifikace je plně k dispozici a není zatížená licenčně ani nepatří nějaké firmě. Což je na druhou stranu problémem ve chvíli, kdy si někteří začnou při implementace specifikaci přiohýbat, vytvoří pak „něco na téma OpenID“, ovšem kompatibilita s ostatními je pak docela problematická (analogie lze v IT nalézt skoro na každém kroku), což nepřispívá pověsti celé technologie.

Decentralizovaný

Tento rys OpenID je naplněn možností zvolit si poskytovatele OpenID identity dle vlastního přání – tedy vybrat si takového, který je mi sympatický, který nabízí funkce, jež mě zajímají (např. možnost více sad „personálních informací“ u jednoho účtu) či který je důvěryhodný (banky, certifikační autority, …) Ostatně je možné být i poskytovatelem identity sám sobě.

Ověření identity

Ověření identity je základní funkce OpenID. Znamená to, že OpenID nabízí mechanismus, jakým lze zjistit, že uživatel s identifikací A je tentýž, který se přihlásil minulý týden s identifikací A. Že to není někdo jiný. To, co bude ve skutečnosti o uživateli A vědět, záleží jen na uživateli samotném a na providerovi.

Princip fungování OpenID je tedy takový, že uživatel si vytvoří u poskytovatele identit svůj záznam. Tento záznam má přiřazen nějaký identifikátor, kterým se uživatel hlásí ke stránkám, jež OpenID podporují. Aby celý systém fungoval tak, jak má, je zapotřebí mít širokou škálu poskytovatelů, kteří implementují OpenID protokol opravdu dle specifikace.

OAuth

Protokol OAuth (viz článek o OAuth na Zdrojáku) nabízí jednotnou metodu autentizace uživatelů, přistupujících k API webové služby, a to pro webové i desktopové aplikace. OAuth je jednoduchá specifikace, která popisuje způsob, jakým má aplikace, která chce přistupovat k API, požádat o autentizační informace.

API

Nejrůznější webové služby, především sociální sítě, nabízejí API pro přístup ke svým funkcím, takže vývojáři mohou tvořit aplikace, které jsou na těchto funkcích založeny nebo je mohou využít. Lze tak vytvářet aplikace, které mohou publikovat přes Twitter, přes Facebook, přistupovat k fotografiím v albu apod. Je tedy logické, že přístup k podobným funkcím musí být ověřen uživatelským souhlasem.

Ověření uživatelů

OAuth má jediný úkol: Zajistit, že aplikace třetí strany může přistupovat k důvěrným funkcím přes API určité služby, aniž by musel uživatel dávat svoje přístupové údaje aplikaci třetí strany – v takovém případě hrozí vždy riziko zneužití. OAuth toto riziko obchází tím, že přihlášení probíhá pouze na stránce dané služby a aplikace třetí strany obdrží pouze unikátní klíč, pomocí něhož může podepsat své API požadavky.

Proces ověření

Ověření uživatele – protokol OAuth

V praxi to probíhá tak, že aplikace třetí strany chce použít u konkrétní služby (uvedeme si jako příklad Twitter) některou funkci, která vyžaduje autentizaci. Požádá tedy nejprve Twitter o token. Dostane jej a spolu s ním přesměruje uživatele na stránky Twitteru. Na té stránce se uživatel přihlásí svým twitterovým účtem a povolí dané aplikaci třetí strany přístup k funkcím. Pak je vrácen zpět na stránky dané aplikace spolu s dalším kódem. Nakonec aplikace pomocí tohoto kódu požádá o přístupový klíč. S tímto klíčem už může přistupovat k důvěrným funkcím API.

Shrnutí

Mezi OpenID a OAuth jsou, jak jste viděli, zásadní rozdíly. Shrňme si je v tabulce:

OpenID vs OAuth
Rys OpenID OAuth
Rozsah Definuje komunikační protokol, výměnu informací, rozsah informací, obsahuje i několik úrovní autentizace Definuje jen komunikační protokol pro autentizaci; veškeré další zjišťování údajů musí proběhnout přes proprietární API té které služby
Architektura Distribuovaný autentizační systém, kde jsou uživatelské účty nezávislé na službách, které je využívají Zajištění autentizace uživatelů konkrétní služby
Problém, který řeší Obecné ověření uživatele; poskytnutí některých informací o něm; zabezpečení přihlašování Ověření uživatele kvůli přístupu k důvěrným funkcím API webových služeb.
Topologie „Uživatelsko-centrická“ (důraz je kladen na identitu uživatele) „Službo-centrická“ (důraz je kladen na samotný fakt ověření)
Uživatelský účet Může být u libovolného poskytovatele; lze jej použít v různých službách Uživatel musí být nejprve zaregistrován u dané služby

Samosebou existují způsoby, jak oba přístupy zkombinovat. Důležité je si uvědomit, že každá technologie řeší naprosto odlišný problém, jiným způsobem a v jiném rozsahu, tudíž nejsou ani vzdáleně zaměnitelné. OAuth je malá specifikace, jejímž cílem je zajistit „podepsání“ požadavků při volání citlivých funkcí API. OpenID je komplexní technologie distribuované správy uživatelských účtů; kromě samotného přihlášení řeší i výměnu informací o uživateli a další věci, spojené se zabezpečením.

OAuth je malý a jednoduchý, za dvě hodiny jsem ho měl rozběhaný, ale OpenID mi trval celý den.

A pokud to chcete ještě názorněji, tak: Pomocí OAuth řešíme „přihlášení k Twitteru jako uživatel XYZ“, pomocí OpenID řešíme „přihlášení uživatelů k naší službě s jejich vlastním ID“. Ano, za jistých podmínek lze vytvořit službu, k níž bude možné se přihlásit „pomocí twitterového účtu“ a získat informace (pomocí volání nějakých dalších funkcí via API), aniž by ta služba nějak s Twitterem souvisela (dtto s Facebookem), ale zkuste se zamyslet: Jaký by to mělo smysl? Jaký by mělo smysl omezit přihlašování uživatelů k vaší službě pouze na množinu těch, kteří u toho serveru mají účet, pokud by vaše služba nebyla nadstavbou nad daným serverem?

Závěr

V diskusích o OpenID (a MojeID) není vyřčena spousta věcí, např. to, že korektní implementace na straně klienta není omezena na použití MojeID – stačí, když klient bude s protokolem OpenID pracovat tak, jak má, a nebude vymýšlet proprietární hacky typu vyhodíme vše, co nebude mojeid. Správné použití je „požádat o ověřenou identitu“, a je jedno, jestli má uživatel účet u mojeID nebo u Verisign nebo jestli mu jeho OpenID identitu ověří jeho banka.

Ale tento článek nebyl věnován neznalostem diskutujících o podstatě věci, byl věnován jednomu mýtu, který by se dal vyjádřit výše zmíněným komentářem: „Proč implementovali mrtvé OpenID, proč nepoužili OAuth?!“ No proto, že by pak nevzniklo „ověření identity“, ale „nástroj pro přihlášení k API CZ.NIC“.

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď by rád neprogramoval a radši se věnoval starým počítačům.

Komentáře: 24

Přehled komentářů

Bernos Probuzeni
ondra.novacisko.cz Ne vše lze u OpenID vypnout
Mordae Re: Ne vše lze u OpenID vypnout
ondra.novacisko.cz Re: Ne vše lze u OpenID vypnout
Martin Malý Re: Ne vše lze u OpenID vypnout
ondra.novacisko.cz Re: Ne vše lze u OpenID vypnout
Martin Malý Re: Ne vše lze u OpenID vypnout
ondra.novacisko.cz Re: Ne vše lze u OpenID vypnout
Martin Malý Re: Ne vše lze u OpenID vypnout
ondra.novacisko.cz Re: Ne vše lze u OpenID vypnout
Martin Malý Re: Ne vše lze u OpenID vypnout
ondra.novacisko.cz Re: Ne vše lze u OpenID vypnout
František Kučera Re: Ne vše lze u OpenID vypnout
ondra.novacisko.cz Re: Ne vše lze u OpenID vypnout
heptau Re: Ne vše lze u OpenID vypnout
heptau Re: Ne vše lze u OpenID vypnout
benzin 2x vetsi rizoko
lopata na ksichtoknize jede většina
Martin Malý Re: na ksichtoknize jede většina
peep Re: na ksichtoknize jede většina
lopata Re: na ksichtoknize jede většina
hm Re: na ksichtoknize jede většina
hm Re: na ksichtoknize jede většina
dfasdf Re: na ksichtoknize jede většina
Zdroj: https://www.zdrojak.cz/?p=3344