OAuth – nový protokol pro autentizaci k vašemu API

Proč často u webových aplikací musí uživatelé poskytovat své přihlašovací údaje třetím stranám? V dnešním článku si vysvětlíme, proč je zapotřebí standard pro autentizaci uživatelů. Představíme protokol OAuth, který by mohl zvýšit bezpečnost uživatelských účtů nejen ve Web 2.0 službách a mashupech.
Jaký je problém dnešních webových aplikací?
Dnešní článek začneme připomenutím nedávných událostí. Před několika dny, když se Martin Hassman ptal, zda jsou čeští internetoví odborníci odolní vůči sociálnímu inženýrství, popsal jeden zajímavý problém, který přišel spolu s moderními webovými trendy. S nástupem mashupů (tedy jakýchsi nadstaveb nad webovými službami) se objevila potřeba zajistit mashupu přístup k uživatelským datům na cílové službě. Řada služeb se s tím vyrovnává jednoduše tak, že si od uživatele vyžádá jeho hesla. Popišme si situaci na diskutovaném příkladu.
Jaká je realita?
Nedávno se objevila služba Twitterank, která nabízí jakousi nadstavbu známé služby Twitter. Konkrétní funkce není teď podstatná, důležité je, že k tomu Twitterank potřebuje přístup k vašemu Twitter účtu. Po uživatelích proto požaduje zadání jejich uživatelského jména a hesla na Twitter. To vzbudilo, trochu paradoxně, značnou nevoli u odborné veřejnosti.
Proč paradoxně? Protože to vypadá, že se v tomhle případě projevilo staré přísloví, které říká, že co je dovoleno Jovovi, není dovoleno volovi. Přihlašovací data k lecjakým účtům po nás totiž dnes požaduje kdekdo – od Google přes Facebook až po naprosto obskurní služby, které vám tvrdí, že potřebují vaše jméno a heslo na GMail, např. aby vám umožnily lepší prožitek z používání. Ve srovnání s tím, co po vás chtějí jiné služby, je přístup k Twitter účtu nedůležitá banalita. Jinde chtějí přímo údaje k e-mailu nebo FTP přístup k serveru (svého času to požadoval Blogger při generování blogů via FTP). A jaké možnosti má dnes uživatel? Buď své údaje předá a bude věřit, že je prostředník nezneužije, nebo službu nebude používat.
Každopádně i sebedůvěryhodnější služba znamená určité riziko kompromitace vašeho účtu. Smutnou realitou je, že to zatím většina služeb, snad v euforii z netušených Web 2.0 možností, moc neřeší a minimálně do doby prvního velkého průšvihu ani řešit nebude. Zatím se účty neztrácejí a uživatelé sdělují třetím stranám své údaje jako by se nechumelilo… Krom toho jde tento přístup proti všem bezpečnostním poučkám a pravidlům a staví tak na hlavu všechny rady pro bezpečné užívání internetu.
Jak bychom mohli problém obejít?
Metod, jak obejít nutnost svěřit prostředníkovi (mashupu, službě apod.) své přihlašovací údaje k jiné službě, je víc. Na jedné straně jsou tradiční, defenzivní metody, jako je například možnost zvolit si u služby jakési sekundární heslo pouze pro přístup k některým datům či API (takže případné zneužití údajů nemá tak fatální následky) či generování API klíčů, které jsou pak posílány místo plných hesel.
Na druhé straně pak existují více či méně sofistikované postupy, které prostředníka odstíní od hesla rafinovaněji. Třeba pomocí nějakých „kejklů a fíglů“, např. jak nedávno popsal David Grudl:
K prostředníkovi se odešlou všechna potřebná data vyjma hesla. To neopustí klientův počítač, ale bude zapsáno ve fragmentu URI (tedy za znakem #, tato část adresy se totiž při HTTP komunikaci na server neposílá). Server udělá potřebné operace a pro závěrečnou komunikaci se serverem služby vygeneruje JavaScript. Ten postaví přes DOM formulář, heslo si vezme z
window.location.hash
a odešle jej. Poté zpracuje výsledek a předá uživateli (nebo znovu prostředníkovu serveru pro finální zpracování). Podstatné je, jak jsem psal, že heslo neopustí klientův počítač.
Můžeme také použít nezávislého správce identit po vzoru OpenID.
Jaké je správné řešení?
Představte si nyní univerzální způsob, jak povolit Twitteranku přístup k údajům na Twitteru, aniž by mu uživatel musel prozradit svoje heslo do Twitteru. Fungovalo by to takto: Uživatel přijde na stránky Twitteranku. Nezadává přístupové údaje k účtu, ale pouze klikne na tlačítko „Přihlásit k Twitter účtu“. Je přesměrován na stránky Twitteru, kde se normálně přihlásí svým jménem a heslem. V nějakém formuláři pak potvrdí, že Twitterank smí přistupovat k jeho Twitter účtu, zadá např. k jakým datům smí Twitterank přistupovat a jak dlouho, a po potvrzení je přesměrován zpět na Twitterank. Zároveň je předán klíč, s nímž se Twitterank může připojit na Twitter API a vyžádat si potřebné údaje. Klíč je vystaven pro konkrétní službu a konkrétní použití na určitou dobu; riziko jeho zneužití je tak minimalizováno a (co je nejdůležitější) citlivé přihlašovací údaje tak putují jen mezi uživatelem a cílovou službou.
Na pozadí probíhají snadno představitelné operace: Twitterank požádá nejprve Twitter o jednorázový token. Pak přesměruje HTTP redirektem uživatele na Twitterovskou přihlašovací bránu a v požadavku předá tento token. Twitter udělá, co je potřeba, a po potvrzení přesměruje uživatele opět redirektem zpět na Twitterank. Ten požádá Twitter o přístupový klíč k danému tokenu a s tímto klíčem pak přistupuje k API.
Protokol OAuth
Představili jste si to? Pokud ano, tak v tuhle chvíli už víte, jak funguje OAuth autentizace.

Obrázek pochází ze specifikace OAuth.
OAuth je protokol, navržený pro, cituji: bezpečnou API autentizaci jednoduchým a jednotným způsobem pro webové i desktopové aplikace
. Jeho specifikace popisuje podrobně fungování oné výše popsané výměny tokenů a klíčů; nijak nedefinuje vlastní komunikaci s webovou aplikací ani není vázané na konkrétní typ API (pouze je omezeno na HTTP protokol). OAuth lze tedy použít jako metodu ověření uživatele k jakémukoli typu API (SOAP, XML-RPC, REST atd.), a to nejen na webových aplikacích.
Závěr
OAuth je poměrně nový protokol, který se začíná zvolna šířit – ze služeb známých v České republice ho nabízí třeba Pownce či Google. OAuth funkce přitom není nijak složitá a k dispozici jsou knihovny pro hlavní programovací jazyky, takže nasazení nevyžaduje žádné obrovské investice ani studium tlustých knih – stačí, když použijete hotovou knihovnu.
Do běžícího systému lze OAuth implementovat během několika hodin. Pokud provozujete nějakou službu a nabízíte k ní API, zkuste se zamyslet, zda by OAuth nebyla vhodná autentizační metoda a zda by se vám (a vašim uživatelům) její zavedení nevyplatilo.
Nie je mi celkom jasne naco to vlastne je.
Je to preto, aby v databaze na serveri nejakej sluzby neboli moje prihlasovacie mena?
Bude tam "len" nejaky kluc ktorym sa bude sluzba autorizovat?
Ked niekto hackne ten server tak nemoze ten kluc pouzit?
Ked ta sluzba bude chciet zneuzit moj account, nestaci jej na to ten kluc?
Bude tam "len" nejaky kluc ktorym sa bude sluzba autorizovat?
Ne tak zcela přesně. Ten klíč tam bude jen po dobu nezbytně nutnou na provedení požadovaných operací. Nemá smysl ho kamkoli do databáze ukládat, protože jeho doba platnosti je omezená.
Ked niekto hackne ten server tak nemoze ten kluc pouzit?
Pokud někdo hackne server, tak může použít celý mechanismus "transparentně" – tj. nechat oběti, aby se autorizovaly na té cizí službě, a pak získá API klíč. Ale, a to je princip celého OAuth, nezíská jméno a heslo, se kterým by dostala plnou kontrolu nad účtem (včetně zrušení účtu, změny hesel, platebních operací apod.)
Ked ta sluzba bude chciet zneuzit moj account, nestaci jej na to ten kluc?
Operace s účtem jsou různě "závažné". Služba může použít (nebo zneužít) ty operace, které jí cílový server umožní použít přes API, a u kterých uživatel souhlasí s tím, že je služba může použít. API většinou poskytuje jen omezenou množinu operací, ty nejzávážnější to nebývají. U popisovaného příkladu by např. mohla poslat vaším jménem příspěvek na Twitter (pokud by měla váš souhlas s posíláním článků). Nemůže ale účet "unést", nemůže ho smazat, nezjistí vaše heslo, takže škody jsou, v porovnání s "předáním hesla", relativně malé.
A to je celý důvod: Minimalizovat případné škody tím, že uživatel nemusí prozradit své heslo.
Samotnému OAuth je věnován asi jeden odstavec se stručným co to je a ještě stručnějším jak to funguje. Podrobnější popis by nebyl? Proč používat tohle a ne něco vlastního? Jde snad o první z mnoha článků o OAuth?
Proč používat tohle a ne něco vlastního?
V tom je význam standardů. Pokud všichni podporují jeden mechanismus, tak spolu můžou všichni snadno komunikovat. Vlastní řešení je určitě možné, ale pak musíte přesvědčit druhou stranu, aby je také implementovala. Oč je pak snazší použít hotovou knihovnu pro OAuth navíc, když druhá strana možná už dávno udělala totéž.
Při přednášce na WebExpu mi lidé říkali, že o technologiích, o nichž jsem mluvil (OAuth, OpenID, LiveID apod.) slyšeli, ale že jim nebylo jasné k čemu jsou a na co to je, a že to je tedy určitě zbytečné a zase jen nějaká komplikace a klacek pod nohy poctivým vývojářům. Proto jsem tedy s dovolením začal vysvětlením, proč je pro určité specifické případy potřeba nová autentifikační metoda a na příkladu ukazuju, jak by měla fungovat. Berte to tedy prosím jako seznámení se zajímavostí, o níž mnozí slyšeli, ale nechápali, k čemu by jim byla. Proč používat tohle a ne něco vlastního? No asi ze stejného důvodu, proč (například) použít SSL a nevymýšlet vlastní šifrovací metody: V 95% případů lze použít standardní řešení. OAuth je nabízený standard. Podrobnější popis by jistě byl, pokud bude zájem.
Jop, zájem by byl.
Jěště takto, nejlepší by bylo to ukázat na konkrétním případě implementace.
Dobrá… Bude stačit ukázka implementace v PHP? :)
Vážným zájemcům zatím mohu doporučit Google OAuth playground a některé techničtější principy by mohl osvětlit třeba článek Using OAuth with the Google Data APIs.
Takhle funguje napr overeni nove aplikace pro flickr (kFlickr) a mam dojem, ze takto se autorizuji i externi aplikace na facebooku.
Dve veci. Jenak mashup je uz fakt trosicka moc.Az tak by ste jazyk prznit nemuseli,aj ked je to Vasa cestina.
A druha vec, cim dalej tym je mi viac zle z celeho web developmentu a smeru ktorym sa to ubera.Prestavam pomalicky chapat,a sam mam chut sa otocit celemu tomuto smeru chrbtom, preco sa jednoduche veci stale robia zlozitejsie a zlozitejsie.Preco sa silou mocou snazime znasilnovat protokol a vobec cely web k tomu aby fungoval ako bezne desktopove aplikacie ked tie tu uz davno su.Ked si zratam vsetky aktualne technologie a postupy ktore sa pouzivaju pri webe tak uz zdaleka to neni nejaky rapid development, a zacinaju nevyhody prevazovat nad vyhodami.Bohuzial ani na desktope to neni o moc lepsie (.NET a java urobili svoje).
Ad slovo "mashup": Je běžné, že jazyk přebírá slova z jiných jazyků, pokud sám pojmenování nemá. Zde pojmenování není, a pokud jsou navrhované české ekvivalenty ("míchanice"), tak jsou zase pro lidi z oboru často nesrozumitelné (viz výrazy z 80. let: Stykové rozhraní, režim výměny). Slovo "mashup" se navíc nebrání české flexi ani odvozování (mashupy, mashupem, mashupový), takže bych se proti výrazu "prznění" docela ohradil, použití slova "mashup" tu je zcela na místě. Jen tak pro zajímavost: Jaký výraz používá pro tento jev slovenština?
Ad zbytek: Věřte nebo ne, souhlasím s vámi. Opravdu si myslím, že "ohýbání" webu do podoby desktopové aplikace a např. stavění uživatelského rozhraní nad HTML je zhůvěřilost a slepá ulička, kudy rozhodně cesta vést možná může, ale nesmí! Na druhou stranu mám intenzivní pocit, že jste si spletl článek, protože zrovna OAuth nemá s tím, co píšete, nic moc společného. Žádná "snaha ohýbat protokol", nic o rapid developmentu, žádná samoúčelná technologická exhibice, pouze dohoda "jak autentifikovat uživatele u cizí služby a neprozradit přitom heslo". Mám dojem, že jste dočetl ke slovu "mashup", v tu chvíli jste si OAuth hodil do škatulky s nápisem "Web 2.0 nesmysly" a přišel jste si do komentářů ulevit. Mýlím se moc?
ale vubec, v tomto pripade (stejne tak jako ku prikladu v pripade REST) se nejedna o zadne "ohybani protokolu"
naopak (a jde to pekne videt treba prave na RESTu), protokol se vyuziva plne (nejenom metody GET a POST), a tak, jak byl puvodne zamyslen. V pripade OAuth jde jen o to, ze autentikaci (authentication) provede sam uzivatel, jehoz si sluzby mezi sebou presmerovavaji (header('Location: …'), a prenasen je pouze jednoduchy 'token', jehoz 'schopnosti' jsou navic omezeny jak v case, tak co se funkcnosti tyce. Tedy pokud jsem to pochopil spravne
Kdo to chce delat poradne, pouzije SAML :).
http://shibboleth.internet2.edu/
Jak se to liší od OpenID? Proč místo OAuth nepoužít OpenID? Zajímavá autentizace je přes dongl Yubico.