OpenID: Identity, aliasy a vlastní poskytovatel

OpenID identifikátory mají tvar URL adresy, která odkazuje na stránku OpenID identity u providera. V tomto článku si ukážeme, jak lze vytvořit alias a používat jako identifikátor např. adresu vlastní stránky. Taky si ukážeme, jak lze jednoduše nainstalovat a provozovat vlastní OpenID server pro jednoho uživatele a být tak třeba svým vlastním poskytovatelem.
Seriál: Moderní internetové autentizační metody (7 dílů)
- Moderní internetové autentizační metody 19. 12. 2008
- Porovnání moderních autentizačních metod 23. 12. 2008
- OpenID: Historie, terminologie a mechanismus autentizace 30. 12. 2008
- Implementace přihlašování pomocí OpenID 6. 1. 2009
- OpenID: Identity, aliasy a vlastní poskytovatel 13. 1. 2009
- Implementace přihlašování pomocí Live ID 20. 1. 2009
- Webové autentizační metody: Kuriozity a novinky 27. 1. 2009
Nálepky:
Jak vybrat poskytovatele?
V diskusích k minulým článkům zaznívalo často téma spolehlivosti OpenID poskytovatelů. Je pravda, že technologie OpenID je poměrně citlivá na tuto problematiku a že vybrat si špatného poskytovatele znamená mít zaděláno na možný problém. Naštěstí je OpenID providerů mnoho, takže si lze vybrat takového, u něhož je riziko problémů co možná nejmenší.
Při výběru mohou pomoci různé seznamy providerů (OpenID Providers Directory nebo Where to get an OpenID) či srovnání poskytovatelů. Osobně používám MyOpenID a nezaznamenal jsem žádné problémy. Co se týče českých poskytovatelů, zde je situace o něco horší. Donedávna jediný český OpenID provider OpenID.cz měl od počátku nejrůznější problémy s dostupností, spolehlivostí či kvalitou služeb, někteří uživatelé si stěžovali, že server delší dobu nefungoval a provozovatel nereagoval na dotazy apod. Dnes stránky sice fungují, ale provozovatel nabízí celou doménu ke koupi, takže bych si případné založení účtu na openid.cz rozmyslel, minimálně do doby, než bude jasné, jak se situace vyvine. Naštěstí je situace už o něco lepší a uživatelé, kteří nevládnou cizím jazykem, mohou využít Seznam jako OpenID poskytovatele.
Alias pro OpenID identitu
Vybrali jsme si důvěryhodného poskytovatele, založili jsme si u něj účet, ale chtěli bychom mít nějaký hezčí identifikátor. Pokud máme i nějaké vlastní webové stránky, tak je vytvoření vlastního identifikátoru otázka několika minut. Slouží k tomu technika, nazývaná OpenID alias či OpenID delegát. Ukážeme si, jak takový alias vytvořit, ale nejprve si řekneme, jak funguje.
V předchozích dílech seriálu jsme si řekli o procesu ověřování identity. Jeden z prvních kroků (po normalizaci identifikátoru) je takzvaný proces zjišťování, neboli Discovery. Teď je pravá chvíle říct si, co se vlastně zjišťuje, kde a jak…
Více o procesu Discovery
OpenID identifikátor je vlastně URL nějaké stránky. Někteří jste si jistě zkusili tu adresu zadat přímo do prohlížeče a podívat se, co to udělá. Výsledek je (možná překvapivě) prostý: Je tam nějaká stránka a na ní nějaké informace. Někdy může být informací víc (např. u ClaimID), někdy míň (třeba u MyOpenID), někdy tam může být třeba jen prosté oznámení, že „toto je OpenID identita“ – ale na první pohled tam není nic zvláštního. Stačí se ale podívat do zdrojového kódu, a je jasno:


OpenID stránka obsahuje v hlavičce informace o tom, kde je „server endpoint“ pro danou identitu, tedy na jaké adrese má klient komunikovat se serverem. Krom toho může volitelně obsahovat i samotný OpenID identifikátor. Příklad:
<link rel="openid.server" href="https://openid.claimid.com/server" />
znamená, že tato stránka (konkrétně šlo o http://claimid.com/ejr/) je OpenID identita a že klient má komunikovat s adresou https://openid.claimid.com/server. openid.server označuje tedy endpoint OpenID poskytovatele – konkrétně pro protokol verze 1.
Protokol OpenID 2 přidal druhý odkaz s názvem „openid2.provider“, ale význam zůstal stejný:
<link rel="openid.server" href="http://www.myopenid.com/server" />
<link rel="openid2.provider" href="http://www.myopenid.com/server" />
informuje klienta, že jde o OpenID identitu, která funguje jak s protokolem 1.1, tak s protokolem 2.
Link na openid.server, resp. openid2.provider, je na stránce OpenID identity povinný. Pokud se v hlavičce stránky tyto odkazy nevyskytují, je takové URL odmítnuto jako neplatná OpenID identita. Jako volitelnou informaci lze doplnit upřesnění identifikátoru pro server, pokud např. používá vnitřně jiný tvar než je dané URL. Např. už zmiňovaný ClaimID uvádí toto:
<link rel="openid.server" href="https://openid.claimid.com/server" />
<link rel="openid.delegate" href="https://openid.claimid.com/ejr" />
tedy identita s URL „http://claimid.com/ejr“ je interně ověřována jako „https://openid.claimid.com/ejr“. Pro OpenID 1 se používá openid.delegate, pro OpenID 2 openid2.local_id.
Alias
Pokud vás teď napadlo, že by šlo vložit tyto odkazy do libovolné stránky a „nasměrovat“ ji tak vlastně na libovolného poskytovatele OpenID, tak jste právě pochopili princip OpenID aliasů. Opravdu lze vložit tyto odkazy do libovolné stránky, a udělat z ní tak platný OpenID identifikátor. Nejlepší bude uvést rovnou příklad, a s dovolením použiji svůj identifikátor.
Mám stránky na adrese http://www.misantrop.info a chtěl jsem tuto adresu použít jako OpenID identifikátor. Vybral jsem si poskytovatele MyOpenID a založil jsem si u něj účet http://adent.myopenid.com. MyOpenID má v nápovědě přímo sekci Jak použít vlastní URL, a podle ní lze postupovat:
Moje uživatelské jméno na myopenid.com je adent, takže jsem ho dopsal na patřičná místa a do HTML kódu své stránky jsem vložil následující:
<link rel="openid.server" href="http://www.myopenid.com/server" />
<link rel="openid.delegate" href="http://adent.myopenid.com/" />
<link rel="openid2.provider" href="http://www.myopenid.com/server" />
<link rel="openid2.local_id" href="http://adent.myopenid.com" />
<meta http-equiv="X-XRDS-Location" content="http://www.myopenid.com/xrds?username=adent.myopenid.com" />
(Poslední řádek obsahuje informace pro služby, které používají autentizační protokol Yadis – tím se ale nebudeme zabývat. XRDS location můžeme vynechat bez vlivu na funkčnost identity.)
Libovolná stránka, do níž tyto řádky vložím, se tak stane OpenID identitou. Pokud takovou identitu někde použiji, bude vyhodnocena jako správná a já budu vyzván, abych potvrdil, že disponuji právy k „adent.myopenid.com“. Pomocí aliasu mohu tedy použít adresu svých stránek jako OpenID identitu kdekoli. Alias má navíc jednu pozitivní vlastnost: Pokud se někdy v budoucnu rozhodnete změnit poskytovatele, stačí pouze přepsat tyto informace a budete moct dál používat původní alias, tedy adresu své stránky.
Alias u dalších providerů
Stejný alias lze vytvořit pro jakéhokoli providera – jde o vlastnost protokolu, nikoli o službu OpenID poskytovatele. Poskytovatelé většinou nabízí návod, jak si alias vytvořit. Pokud ne, tak potřebné informace pro openid.server resp. openid2.provider vyčtete ze zdrojového kódu svého OpenID identifikátoru, a jako delegate a local_id můžete zkusit identifikátor, co vám přidělil poskytovatel. Tyto informace vložíte jako tagy LINK do hlavičky své stránky. Pro OpenID verze 1 to jsou odkazy openid.server a openid.delegate, pro OpenID 2 pak openid2.provider a openid2.local_id.
Při psaní tohoto článku jsem chtěl zkusit popsaný postup pro identitu na Seznamu. Nápověda je velmi skoupá a o této možnosti se nezmiňuje, což je škoda. Navíc stránka OpenID identity na Seznamu obsahuje META tag refresh, takže nelze do jejího zdrojového kódu kouknout běžným způsobem. Proto jsem udělal jednoduchou pomůcku, která zjistí všechny potřebné údaje: Seznam OpenID alias discovery. Stačí zadat váš identifikátor. Skript si načte veřejně dostupnou stránku vaší identity a vypíše vám údaje, které můžete rovnou vložit do své stránky. Např. pro identitu oidtest vypadají údaje takto. Pokud skript vypíše chybu při spojení, je pravděpodobně vytížen. Zkuste to za chvíli znovu.

Z tohoto obrázku je hezky vidět, že Seznam používá nějaké „lidsky nečitelné“ interní identifikátory, a jejich xyz.id.seznam.cz je rovněž vlastně OpenID alias.
Vlastní OpenID provider
Lidem, kterým vadí skutečnost, že OpenID provider má k dispozici informace o tom, jaké stránky navštěvují, nabízí OpenID vcelku neobvyklou možnost: Stát se svým vlastním providerem. Stačí k tomu pouze vlastní veřejně dostupný server a na něm spuštěný nějaký skriptovací jazyk (PHP, Python, …). Připravené OpenID servery pro různá prostředí naleznete například v seznamu na OpenID Wiki. V tomto seznamu naleznete nejrůznější instalace, od předpřipravených víceuživatelských providerských skriptů až po lehké jednouživatelské instalace.
Pro nás jsou v tuto chvíli zajímavé především malé „jednouživatelské“ servery – alespoň nepředpokládám, že mezi čtenáři je někdo, kdo plánuje spouštět vlastní službu OpenID providera. Z těchto jednoduchých serverů je pravděpodobně nejpoužívanější phpMyID. phpMyID podporuje protokol verze 1.1 a několik hodnot u rozšíření Simple Registration.
Instalace phpMyID spočívá v prostém nakopírování souborů na server a v upravení hodnot v souboru MyID.config.php. Zde je třeba zadat jméno a heslo, ovšem to nikoli v plaintextu, ale jako MD5 hash řetězce jméno:oblast:heslo. Oblast (realm) je defaultně „phpMyID“, i tento řetězec je možno v nastavení změnit. Podrobnosti k instalaci jsou popsány v souboru README.
phpMyID si standardně ověřuje uživatele pomocí HTTP autentizace Digest (tj. neposílá se heslo v otevřeném textu). Samo sebou si můžete instalaci upravit tak, aby vám bezpečnostně vyhovovala – můžete si doplnit autentizaci nějakou fyzikální metodou, můžete si dopsat např. mechanismus „challenge – response“, můžete vše provozovat na https, ostatně fantazii se meze nekladou a zabezpečení takového jednouživatelského serveru je plně ve vašich rukou.
Samo sebou není phpMyID jediným jednouživatelským serverem. Za pozornost jistě stojí i další projekty (SimpleID, Prairie, …) Věřím, že si ze široké škály každý může vybrat takový software, který je blízký jeho potřebám a upravit si do perfektní podoby. Ostatně vždy máme možnost napsat si vlastní implementaci – technologie je otevřená a dokumentovaná.
Jednouživatelské servery jsou zajímavou alternativou k veřejným OpenID poskytovatelům, např. pro uživatele, co z principu nedůvěřují cizím službám nebo pro uživatele, kteří vyžadují nestandardní služby; stejně tak mohou být základem pro malé několikauživatelské OpenID servery či pro vaše vlastní pokusy s touto technologií (např. na tomto základu postavené anonymní identity atd).
Závěr
Technologie OpenID je, jak jsme si ukázali, navržena velmi flexibilně a pokrývá celou škálu oblastí autentizace, od obecného mechanismu „pro každého“ až po opravdu speciální případy použití. Věřím, že tento článek vás alespoň trochu přesvědčil o tom, že možnosti OpenID jsou opravdu široké, že uživatelé nejsou omezeni jen na jednoho poskytovatele a „nějakou“ identitu, ale že mají poměrně velkou míru svobody.
Bývá to obecná vlastnost všech dobrých nápadů, že časem začne být přeplácaný. Zkuste si přečíst specifikaci poslední verze a zjistíte, že to je úplně jiný systém než verze 1.1. Tohle bohužel může tak pěkný projekt zahubit.
Snad neprozradím nic tajného když řeknu, že při implementaci serveru v Seznamu s tím měli docela problémy, aby implementovali většinu featur. A bohužel to není konečná…
Souhlasím… Jakmile se do OpenID nacpaly věci okolo XRDS a Yadis, tak nakynula knihovna i dokumentace, a přínos, nakolik mohu posoudit, je (zatím?) poměrně malý…
jj
OpenId seznamu může také obsahovat doménu .id.email.cz
Jinak kdo by chtěl stáhnout stránku s identitou tak v linuxu jednoduše přes wget
wget /openid/ -O soubor
"Link na openid.server, resp. openid2.provider, je na stránce OpenID identity povinný."
Ahoj,
jen pro uplnost(v OpenID 2.0), pokud je ve hlavickach odpovedi(Discovery se vlastne sklada, ze tri casti – HEAD na hlavicky, GET na content a pak podle XRDS a nebo nakonec podle meta tagu.), pripadne ve strance odkaz na XRDS dokument, tak tam meta tagy s relation openid.server nebo openid2.provider. RP si pak stahne XRDS dokument, kde by mela najit vse vcetne lokalni identity a podporovanych extension.
Děkuji za doplnění, já nechtěl zabíhat až do takových podrobností a motat do toho ještě XRDS. Někdy na něj možná přijde doba, v tuhle chvíli mi připadalo potřebnější, vzhledem k úrovni povědomí o OpenID, ukázat aspoň možnost vytvoření "vlastní identity".
Omlouvam se za lamersky dotaz… Pro prihlaseni na ruzne zabezpecene servery (banky apod.) pouzivam digitalni certifikat(-y), lze s nim i podepisovat, sifrovat apod. Proc neni vytvoren jakysi digitalni certifikat, ktery by identifikoval cloveka (on vlastne je – zaruceny digitalni "podpis") a pomoci nehoz bych se mohl kamkoliv prihlasit (jako do te banky)? Je to z duvodu slozitosti zpracovani na strane serveru pozadovane sluzby?
OpenID jsem pochopil jako univerzalni autorizacni server, na ktery se prihlasim a on me autorizuje u sluzby, kterou pozaduji…
Pokud vím, tak specifikace OpenID nedefinuje způsob autorizace, takže v budoucnu by mělo být něco podobného možné.
Aha, takze bych se pomoci certifikatu prihlasil na server poskytovatele OpenID. Ale slo by udelat system, ktery by poskytovatele OpenID vynechal? Ze bych se prihlasoval certifikatem rovnou do jednotlivych sluzeb? Co by potom spravce sluzby musel mit k dispozici?
Ano, šlo by to, ale správce každé služby, do níž byste se chtěl přihlásit, by musel podporovat NĚJAK autentizaci a implementovat mechanismus pro přihlašování via certifikát.
Specifikace OpenID 2 přišla s rozšířením PAPE, které umožňuje klientovi požadovat, aby OpenID poskytovatel ověřil člověka více způsoby – např. jménem a heslem + algoritmem challenge/response. Navíc umožňuje požadovat, aby jeden z těchto způsobů ověření byl "fyzikální", tedy pomocí nějaké hmotné věci, co uživatel musí mít (USB dongle, čtečka otisků prstů, "kalkulačka" na kódy, …)
Výhoda podobného postupu je ta, že vy si můžete vybrat poskytovatele, který vás ověří pomocí certifikátu, a takto ověřen se můžete přihlásit na LIBOVOLNOU službu, která podporuje OpenID – odpadá tedy nutnost implementace konkrétní metody ze strany služby. A pravděpodobnější je, že naleznete takového OpenID poskytovatele, než že všechny služby implementují všechny možné způsoby ověřování. :)
Drobný problém s českým zaručeným certifikátem je, že s ním můžete pouze podepisovat. Takže autentizaci tímto certifikátem lze udělat pouze krkolomným způsobem, kdy server pošle text, uživatel si jej přečte, podepíše, a podpis odešle zpět.
Toje zajimave, to jsem nevedel… ale jak tedy bude narocne provozovat sluzbu (dejme tomu webove rozhrani pro mailovy server nebo webove forum), do ktere by se uzivatele prihlasovali certifikatem? Jak probehne vyhodnoceni autentizace z pohledu serveru, co vsechno budu muset na serveru mit a co pozadovat odjinud?
Nasel jsem zpusob pouziti certifikatu SSH pro autentizaci – prijde mi to na strane serveru neprilis slozite (kdyztak me vyvedte z omylu…):
In brief, certificate authentication works in the following way:
* The client sends the user certificate (which inludes the user's public key) to the server.
* The server uses the CA certificate to check that the user's certificate is valid.
* The server uses the user certificate to check from its mapping file(s) whether login is allowed or not.
* Finally, if connection is allowed, the server makes sure that the user has a valid private key by using a challenge.
Porad mi prijde, ze kdyby se zavedlo pouzivani jednotneho overeneho certifikatu pro prihlasovani k ruznym sluzbam, tak je to jednoduzsi, nez OpenID a spol. ?? Neco ve stylu certifikatu overeneho digit. podpisu, ktery by ale umoznoval vice funkci, nez jen podepisovat maily…
Technologicky to je podobné. I zde server ověřuje u někoho třetího (u CA), zda certifikát platí. Jinak ohledně výhodnosti viz výše – než implementovat přihlašování via digitální podpis (jste si jist, že US server bude znát naše CA?) na všech službách, je jednodušší implementovat OpenID a implementaci přihlašování certifikátem (a třeba čtečkou otisků, USB donglem, čtečkou sítnice, …) požadovat od OpenID poskytovatelů.
aj podla mňa by namiesto rozširovania certifikátu bolo lepšie opačný postup –
pridať ku OpenID certifikaciu.
Najlepšie by bolo asi takto –
1. Relying party by komunikovala s Providerom že či je to moje OpenID,
2. potom, ak by chcela aj certifikát, skontaktovala by Certifikačnú autoritu v mojej krajine a overila či moj OpenID je aj certifikovaný (tam by som musel ist raz realne s občiankou)
3. uznala a použila by moje certifikované OpenID napr. na digitálny podpis
:) ak som úplne mimo, pls ignorujte
Chtěl bych se zeptat čím to, že když zadám svůj vlastní alias, tak se to přepíše na http://mojeID.myopenid.com/xrds.
Chtěl jsem tohle řešení používat kvůli případné změně providera, ale když bych chtěl změnit providera, tak bych stejně potom musel všude měnit svůj identifikátor místo aby tam zůstal alias mého webu a jenom se přihlašoval přes někoho jiného a smysl mého aliasu by se vytratil …