OpenID Stanislav Basovník, Martin Koníček, MFF UK, 6. 9. 2009 OpenID je otevřený standard sloužící k přihlašování uživatelů. Nejspíš znáte klasický způsob přihlašování ke službám pomocí jména a hesla, před prvním přihlášením je často nutná registrace. OpenID celý tento přístup nahrazuje. OpenID řeší klasický problém většiny dnešních uživatelů: Jste registrováni na desítkách webů – pod různými přihlašovacími jmény, máte několik různých hesel, takže když se chcete na některý web přihlásit po delší době, často je potřeba sáhnout po možnosti „Zapomenuté heslo“ a čekat na email. Navíc registrace na další a další weby obtěžuje. Hned na začátek uvedeme několik výhod OpenID: · Jedno přihlašovací jméno na všechny weby · Žádná registrace na další weby · Přihlašovací jméno je na všech existujících i budoucích webech dopředu rezervováno – už nikdy neuvidíte „Toto jméno již existuje, vyberte si jiné“ Pokud se chcete přihlašovat pomocí OpenID, budete potřebovat OpenID identifikátor (zkráceně OpenID) – tedy obdobu klasického přihlašovacího jména. OpenID identifikátor vypadá jako URL, tedy např. martinkonicek.id.seznam.cz. OpenID identifikátor je možné získat u některého z poskytovatelů OpenID. Překvapením může být, že už pravděpodobně OpenID identifikátor máte. Pokud používáte některou z těchto služeb, získali jste k ní automaticky vaše vlastní OpenID: · · · · · ·
Seznam email Gmail (Google účet) Blogger Yahoo Microsoft Live a další…
Existují i další poskytovatelé OpenID, jako myopenid.com, myid.net, claimid.com a další. Pomocí OpenID se můžete přihlásit na všechny webové stránky, které OpenID přihlášení podporují, což zatím nejsou zdaleka všechny, ale stále jich přibývá:
Přihlášení pomocí OpenID Nyní si popíšeme, jak probíhá proces přihlášení na webovou stránku pomocí OpenID. Web, kam se přihlašujete pomocí OpenID se nazývá konzument OpenID. 1. Na webové stránce konzumenta, kam se chcete přihlásit, zadáte pouze své OpenID 2. Váš prohlížeč je přesměrován na webovou stránku vašeho poskytovatele OpenID, kde zadáte heslo k vašemu OpenID účtu - toto je jediné heslo, které musíte zadávat 3. Stránka poskytovatele se vás dotáže, zda se chcete přihlásit k webu konzumenta. Potvrdíte a můžete ještě potvrdit možnost "K tomuto webu se již příště přihlašovat bez ptaní" 4. Jste přesměrováni zpět na stránku konzumenta, tentokrát již jako přihlášený uživatel Uvědomme si, že celý proces funguje, i když jsme na stránku konzumenta narazili úplně poprvé. Odpadla tedy registrace. Zajímavější je, jak vypadá přihlášení na stejný web podruhé: 1. Na webové stránce konzumenta, kam se chcete přihlásit, zadáte pouze své OpenID 2. Váš prohlížeč je přesměrován na webovou stránku vašeho poskytovatele OpenID, kde zadáte heslo k vašemu OpenID účtu 3. Po přesměrování zpět jste přihlášeni Protože jste minule zvolili, že se k webu konzumenta chcete přihlašovat vždy, odpadá jeden krok. Ještě zajímavější je ale situace, kdy jste už zadali heslo u OpenID providera, máte tam tedy platnou session, a chcete jít na jiný web: 1. Na webové stránce konzumenta, kam se chcete přihlásit, zadáte pouze své OpenID To je vše. Webový prohlížeč je sice přesměrován na adresu poskytovatele a hned zpět na stánku konzumenta, ale celý proces proběhne automaticky.
Uživatelský profil Další výhoda OpenID oproti klasické registraci a přihlašování je, že s registrací často souvisí vyplňování údajů, jako blog, zájmy apod. Tyto údaje je možno vyplnit jen jednou u poskytovatele OpenID a při přihlášení určit, které údaje zpřístupníte konzumentovi. Na webu konzumenta mohou být pak všechny tyto informace zobrazeny u vašeho profilu, aniž byste je museli zadávat znova.
Delegace Velmi zajímavou vlastností OpenID je, že jako váš OpenID identifikátor může sloužit libovolné URL, které vlastníte (osobní web, blog). Stačí mít přístup k editaci zdrojového kódu html stránky, která se na URL nachází a do její hlavičky uvést např.:
Toto je zápis pro protokol OpenID verze 2. Existuje i starší zápis pro verzi 1. První URL je adresa OpenID serveru vašeho poskytovatele. Druhé URL je váš základní OpenID identifikátor u tohoto poskytovatele. Pokud je tedy tento kus html kódu uveden ve stránce na adrese "doe.com", úspěšně jsme delegovali OpenID identifikátor "doe.com" na identifikátor "doe.myid.net". Nyní se běžně můžeme přihlašovat na všechny webové stránky identifikátorem "doe.com". Delegace má výhodu i v tom, že můžeme takto měnit poskytovatele, zatímco OpenID identifikátor nám zůstává.
OpenID protokol Nyní si ukážeme, jak celý protokol OpenID včetně delegace vypadá. OpenID protokol je otevřený (tj. přesný popis potřebný pro jeho implementaci je volně dostupný). Kdokoliv se tedy může stát OpenID poskytovatelem.
Většinu tohoto procesu už jsme popsali v sekci "Přihlášení pomocí OpenID". Kroky 1 a 2 představují stáhnutí stránky ze serveru a vyplnění a odeslání OpenID identifikátoru. Delegaci představují kroky 3,4, kdy si konzument, ke kterému se chceme přihlásit, vyžádá od "identity serveru" (v našem případě "doe.com" s upravenými hlavičkami) adresu a identifikátor OpenID serveru. Krok 5 představuje přesměrování vašeho prohlížeče na stránku poskytovatele OpenID. Kroky 6 až 9 odpovídají zadání hesla k vašemu OpenID účtu a povolení přihlášení na stánku konzumenta. Poté je v kroku 10 váš prohlížeč přesměrován zpět na stránku konzumenta, a v kroku 11 už si prohlížíte web jako přihlášený uživatel.
Asociace Možná jste si ve výše popsaném protokolu všimli jedné závažné bezpečnostní mezery. Prohlížeči totiž nic nebrání v tom, aby z kroku 5 přeskočil rovnou na krok 10 a odpověděl "ano, jsem autentikován". Uživatel by se tedy mohl přihlásit libovolným OpenID bez jakéhokoliv potvrzení od OpenID serveru. Tomu lze zabránit krokem "4.5" (který se provede mezi kroky 4 a 5). Tento krok se nazývá asociace a jeho princip je jednoduchý: Konzument se s OpenID serverem domluví na tajném řetězci. Prohlášení "ano, jsem přihlášen" v kroku 10 musí být tímto řetězcem podepsáno. Tento řetězec může pocházet jedině od OpenID serveru, je tedy zajištěno, že musela proběhnout autentikace u poskytovatele OpenID. Stejně jako většina jiných protokolů zanedbáváme velmi nepravděpodobnou možnost, že by útočník mohl řetězec uhodnout.
Nevýhody OpenID Stejně jako u jiných služeb na webu, musí si uživatel dát pozor na phishing. Pokud by někdo vytvořil falešnou stránku poskytovatele, mohli bychom mu omylem zadat své OpenID heslo, které tím, že je globální, má velkou hodnotu. Pokud se stránkou poskytovatele komunikujeme pomocí protokolu https (a neignorujeme bezpečnostní výstrahy prohlížece při neplatnosti certifikátu), pak je možnost phishingu úplně eliminována. Jedno možné nebezpečí je následující: pokud budeme u OpenID poskytovatele přihlášeni prakticky pořád, stává se náš poskytovatel dobrým cílem pro útok cross site request forgery. Pokud navštívíme stránku, která např. javascriptem pošle GET dotaz na url poskytovatele OpenID, mohl by tímto dotazem náš prohlížeč napáchat škody na našem OpenID účtu, nebo vydat osobní informace. Proti tomuto útoku se však lze bránit tím, že se v každém GET dotazu předává autentizační token. Stránka poskytovatele tedy může (a měla by) být proti tomu útoku být chráněna.
Implementace OpenID V této části si popíšeme implementaci způsobu přihlašování pomocí OpenID. Při jeho nasazení není nutné implementovat žádný protokol. Existuje mnoho knihoven pro různé platformy, které celou implementaci výrazně zjednodušují. Budeme se zde tedy zabývat jen hlavními kroky implementace při použití knihovny a nebudeme rozebírat technické detaily protokolu.
Příprava na implementaci Nejdříve si musíme vybrat knihovnu, kterou budeme v aplikaci používat. Na oficiálních stránkách OpenID (http://wiki.openid.net/Libraries) můžeme najít seznam volně dostupných knihoven. Mezi nimi jmenujme aspoň některé: DotNetOpenId (C#) libopkele (C++) OpenId4Java (Java) JanRain (Python, Ruby, PHP) EasyOpenId (PHP) Z uvedeného seznamu je vidět, že výběr knihoven je opravdu široký. Knihovny podporují různé verze protokolu. OpenID knihovna typicky potřebuje prostor pro ukládání klíčů, informací o uživatelích atd. Podle zvolené knihovny je nutné mít k tomuto databázi nebo soubor na disku.
Formulář OpenID Na samotné přihlášení nám stačí jediné textové pole, do kterého uživatel zadá svůj OpenID identifikátor. Pokud bychom chtěli zjistit o uživateli nějaké další informace, můžeme při prvním přihlášení spustit registrační skript, kterým si přímo od uživatele vyžádáme tyto informace a uložíme si je i s daným identifikátorem. Druhou možností je vyžádat si tyto informace od providera a provést tak registraci na pozadí. Tento způsob většinou stačí, pokud chceme znát jen běžné údaje jako je e-mail
nebo jméno. Díky tomuto způsobu si můžeme informace navíc automaticky aktualizovat při každém přihlášení.
Přihlášení Po zadání identifikátoru přihlašovací skript provede zjišťovací proces adresy providera (discovery). Klient a poskytovatel provedou vzájemnou asociaci výměnou klíčů, aby se nemusel znova ověřovat podpis při dalších dotazech. Toto zařídí knihovna automaticky pomocí identifikátoru uživatele. Klient poté přesměruje uživatele na stránku poskytovatele s autentizačním požadavkem. Tento požadavek obsahuje adresu pro přesměrování zpět (po úspěšné autentizaci) a volitelně požadované informace o uživateli. Na závěr už zbývá jen ověřit, zda přihlášení bylo úspěšné.
Závěr Díky hotovým knihovnám je implementace přihlašování velmi jednoduchá a rychlá. Jediné, na co si musíme dát pozor, je výběr důvěryhodné knihovny. Důležité jsou i pravidelné aktualizace knihovny pro zajištění maximální bezpečnosti. Pokud necheme spoléhat na cizí knihovny, můžeme si napsat vlastního klienta, protože OpendID je otevřená a dobře zdokumentovaná technologie. [1] http://zdrojak.root.cz/clanky/implementace-prihlasovani-pomoci-openid/