Přejít k navigační liště

Zdroják » PHP » OpenID: Identity, aliasy a vlastní poskytovatel

OpenID: Identity, aliasy a vlastní poskytovatel

Články PHP, Různé

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.

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:

Zdrojový kód OpenID HTML stránky
Zdrojový kód OpenID HTML stránky

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://clai­mid.com/ejr/) je OpenID identita a že klient má komunikovat s adresou https://openid­.claimid.com/ser­ver. 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/ej­r“. 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.mi­santrop.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.my­openid.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.

Seznam OpenID alias

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:hes­lo. 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.

Komentáře

Subscribe
Upozornit na
guest
16 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
ondra.novacisko.cz

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á…

burlog

jj

ondra.novacisko.cz

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

burlog

"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.

drsnacek

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…

Jan Tvrdík

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é.

drsnacek

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?

petr_p

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.

drsnacek

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?

drsnacek

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…

xzajox

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

Magnesium2

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 …

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.