Přihlašování uživatelů na webu

Poslední změna: 18. listopad 2011

Přihlašování uživatelů potkáte téměř „na každém rohu“. E-shopy, diskuzní fóra, rozličné online aplikace, všichni potřebují rozlišit anonymního návštěvníka od registrovaného uživatele, který smí víc.

Jméno a heslo

Tradičním a jistě nejrozšířenějším způsobem přihlašování je zadání (uživatelského) jména a hesla. Tento způsob je z programátorského hlediska pohodlný a uživatele nepřekvapí.

Při programování přihlašování jménem a heslem vyvstane jako první otázka: Co má být (uživatelským) jménem? Aby systém dával smysl, musí být jméno každého návštěvníka unikátní. Z uživatelského pohledu by zase bylo výhodné a pohodlné, mít na všech „svých“ webech jednotné jméno. Protože se ale na každém webu registrují různí uživatelé s různými jmény, nemusí být vybrané jméno už k dispozici. Uživatelé takovou situaci řeší po svém, buď mají několik uživatelských jmen z kterých vybírají, nebo ke svému běžnému jménu připojují různé rozlišovací „ocásky“, ať už čísla, opakující se písmena, podtržítka a podobně. Že takové lovení uživatelských jmen na pohodlí práce s webem nepřidá, je asi každému jasné. Po čase se typicky dostanete do situace, kdy budete na webech, na kterých jste se kdysi registrovali, marně zkoušet další a další uživatelská jména, než natrefíte na to správné a přihlásíte se.

Možným řešením problému je použití e-mailu jako jména. Schválně si zkuste odpovědět na otázku: Jak si uživatel obnoví svůj přístup, pokud zapomněl heslo? Pokud vycházíte ze zkušenosti na naprosté většině webů, odpovíte že obnova přístupu typicky probíhá zadáním registrovaného e-mailu, na který je zasláno nové vygenerované heslo. Systém tedy e-mail uživatele tak jako tak má a většinou ho i přímo vyžaduje. Není tedy důvod nutit uživatele vymýšlet si další identifikátor, pomocí kterého se budou přihlašovat. E-mail je navíc zcela unikátní, dva různí lidé nemohou sdílet jednu e-mailovou adresu, takže není problém mít na všech webech jednotné uživatelské jméno.

Pohodlní uživatelé samozřejmě nebudou chtít jen jednotné uživatelské jméno, ale ideálně i jednotné heslo. To samozřejmě přináší riziko, že odhalení hesla na jednom špatně zabezpečeném místě způsobí prolomení přihlašování dotčeného uživatele téměř všude. Do databáze bychom proto nikdy neměli ukládat čistá hesla, ale pouze jejich otisky (hashe). Nicméně i v případě použití hashů může útočník heslo odhalit, jelikož stejným způsobem vyrobené hashe stejného hesla jsou pochopitelně stejné. Pro omezení možnosti takového druhu odhalení je vhodné hash vyrábět z hesla rozšířeného o takzvanou sůl (salẗ́), což je nějaký, nejlépe náhodný text, který způsobí, že otisk stejného hesla nikdy nebude stejný. V případech, kdy je zapotřebí obzvlášť chránit bezpečí uživatele, by pak mělo být samozřejmostí použití protokolu HTTPS, který brání možnosti odposlechnout heslo přímo z komunikace prohlížeče se serverem.

OpenID

Pokusem o řešení zvětšujícího se moře uživatelských jmen a hesel na webu je OpenID. Jedná se o standardizovaný systém správy uživatelských identit, který dovoluje uživatelům na různých webech používat k přihlášení jednotné přihlašovací údaje. Základním identifikátorem uživatele v systému OpenID je URL (webová adresa). Tuto URL uživatel zadává při přihlašování namísto jména a hesla.

OpenID je decentralizovaný systém, kdokoliv se může stát poskytovatelem OpenID identity. Princip je jednoduchý. Web, který nabízí možnost přihlásit se přes OpenID, položí dotaz na uvedené URL, zda je uživatel přihlášený. Pokud není, přesměruje uživatele na stránku, na které se může u svého poskytovatele přihlásit (typicky jménem a heslem), a odtud zase zpátky na původní web. Pokud přihlášený je, rovnou jej přihlásí i u sebe, aniž by uživatel musel cokoliv vyplňovat.

Velkou výhodou systému OpenID je zjednodušení přihlašování pro uživatele, kteří mohou být přihlášeni pouze u svého poskytovatele OpenID a jeho prostřednictvím se přihlašovat na ostatní weby. Jako vše ale i OpenID má své nevýhody a zádrhely. Nejvážnějším problémem je nízká podpora pro OpenID ze strany samotných autorů webových stránek. Jen velmi malé procento webů umožňuje přihlášení pomocí OpenID a tak jej téměř nikdo ani nepoužívá. Důvodem je především implementační složitost na straně webu, a pak samozřejmě také malá poptávka po této možnosti, čímž se dostáváme do začarované­ho kruhu.

Dalším vážným problémem OpenID je nespolehlivost poskytovatelů identit. „Velcí“ poskytovatelé jako je Google (každý registrovaný uživatel Google má k dispozici OpenID identitu) nebo v Česku Seznam.cz (i zde má každý uživatel k dispozici OpenID identitu) problémy nemívají, ale malí poskytovatelé mívají výpadky či zanikají a tak se může stát, že se uživatelé s těmito identitami najednou nebudou moci přihlásit.

Implementace samotného procesu autentizace pomocí OpenID je pro většinu běžných (nejen) webových platforem vyřešena, náš tým přispěl svou troškou do mlýna komponentou pro PHP framework Nette.

Zajímavá a implementačně ne úplně triviální je pak samotná správa uživatelů a jejich identit na straně webu, který přihlašování přes OpenID používá. První problém je samozřejmě poznat uživatele který již na našem webu byl od uživatele, který se pomocí dané URL přihlásil poprvé. Poskytovatel nám totiž o uživateli prozradí pouze to, že byl úspěšně přihlášen, nikoliv jeho profilová data specifická pro náš web. Tato data si musíme ukládat sami u sebe. Nevyhneme se tedy databázovému zpracování uživatelů a vytváření jejich účtů na straně našeho webu. Musíme se pouze naučit přiřazovat identity z OpenID reálným uživatelům na našem systému. Komplikací je fakt, že jeden uživatel může mít a používat více OpenID identit najednou. Uživateli bychom tedy měli umožnit nastavit ke svému účtu více identit najednou a dovolit mu přihlášení pomocí kterékoliv z nich.

Facebook

Alternativou k OpenID je přihlašování uživatelů pomocí účtu na Facebooku. Protože zde je dopředu jasné, kdo je poskytovatelem identity, není nutné zadávat žádnou URL. Na webech s podporou přihlašování přes Facebooku typicky stačí kliknout na ikonku „Přihlásit pomocí Facebooku“. V databázi našeho systému pak musíme uložit UID uživatelského účtu Facebooku, pomocí kterého se uživatel přihlašuje. Stejně jako v případě OpenID i zde může být k jednomu uživatelskému účtu připojeno více identit a je tedy nutné řešit možnost správy jednotlivých Facebookových profilů, pomocí kterých se lze k účtu přihlásit.

Aby bylo možné tento způsob přihlašování využívat, musí být váš web na Facebooku zaregistrovaný jako aplikace. Implementace samotného procesu autentizace je již rovněž dobře vyřešena. Pro PHP je to kupříkladu knihovna Facebook PHP SDK.

Vzhledem k oblibě této sociální sítě se dá čekat, že se podpora pro přihlašování pomocí účtu na Facebooku bude rozšiřovat. Podrobnější informace o implementaci najdete v dokumentaci Facebooku. Dobrým zdrojem je také článek Quick start on new Facebook PHP SDK.

Čím víc možností, tím lépe

Vanillaweb blog - Přihlašování uživatelů na webu
Login screen našeho projektu burzaucebnic.net

Někdo má rád holky, jiný zase vdolky, takže pokud budete na svém webu preferovat pouze jeden z uvedených způsobů přihlašování, nikdy neuspokojíte všechny. Málokdo má a aktivně používá OpenID, málokdo se bude na Facebooku registrovat jen kvůli vašemu webu, leckdo bude bručet: Zase další heslo, proč kruci nepodporují OpenID?

Ideální je tedy všechny možné přistupy zkombinovat a dát uživateli na výběr. Tým Vanillawebu poprvé nabídl možnost všech těchto způsobů přihlašování na svém projektu online burzy učebnic. Uživatel se zde může registrovat jak pomocí klasické kombinace jméno (e-mail) a heslo, tak pomocí OpenID či účtu na Facebooku. Ve svém profilu pak může přidávat a odebírat další identity a účty, nebo si nastavovat přístupové heslo, pokud ho do té doby nepoužíval. Systém se stará pouze o to, aby uživateli vždy zbyla alespoň jedna cesta, jak se do systému přihlásit.

Pokud uživatel náhodou zapomene, jak se do systému přihlašoval, stačí mu zadat svůj e-mail do příslušného formuláře a systém mu automaticky aktivuje přihlašování heslem a zašle mu nové vygenerované heslo. Ostatní způsoby přihlašování tím samozřejmě zůstanou nedotčené a uživatel si po přihlášení může ve svém profilu osvěžit paměť a přihlašování heslem případně zase zrušit, pokud ho nechce používat.

Možných způsobů přihlašování na webu přibývá. Můžete nad nimi mávnout rukou a vystačit si se starým dobrým jménem a heslem, ale pokud chcete vycházet vstříc svým uživatelům a usnadnit jim život, alternativy rozhodně stojí za vyzkoušení. Pohodlí uživatelů totiž je, nebo by přinejmenším mělo být, při tvorbě webu vždy tím nejvyšším kritériem.

Autor: Stanislav Kocanda


Napište nám svůj názor na článek