Internet Maker

OpenID

Internetowa tożsamość

Możliwość założenia własnego konta w serwisie internetowym stała się już standardem, zwłaszcza w witrynach tworzonych na fali fascynacji trendem Web 2.0. Doczekaliśmy się sytuacji, w której poszczególny użytkownik utrzymuje kilkanaście czy nawet kilkadziesiąt różnych profili – na forach internetowych, w serwisach społecznościowych, blogach czy wszelkiego rodzaju usługach on-line. Rodzi to szereg problemów związanych z aktualnością danych, koniecznością ich każdorazowego wprowadzania, a przede wszystkim – z zapamiętaniem szeregu loginów i haseł. Z pomocą przychodzi technologia OpenID.

Wojciech Kocjan

OpenId OpenID to otwarty, zdecentralizowany system, umożliwiający zrealizowanie tzw. „Pojedynczej rejestracji” (ang. „Single sign-on”, SSO). W praktyce polega to na tym, iż użytkownik, za pomocą jednego loginu i hasła ma możliwość zalogowania się do wielu różnych serwisów internetowych – bez konieczności rejestracji na każdym z nich.

Technologia OpenID została opracowana przez firmę Six Apart, właściciela m.in. popularnej platformy blogowej LiveJournal.com. Podczas prac nad OpenID wykorzystano doświadczenia z innych projektów zajmujących się tożsamością sieciową, takich jak Yadis, LID („Light-Weight Identity”) czy Sxip („Simple Extensible Identity Protocol”), z którymi OpenID jest w stanie współpracować.

Zasada działania

Rosnąca popularność OpenID jest pozytywnym trendem zarówno dla twórców, jak i odwiedzających witryny internetowe. Wdrożenie tej technologii we własnym serwisie nie powinno przysporzyć trudności nawet początkującemu programiście, dochodzi wręcz do oszczędności czasowych, gdyż możliwe jest zupełne zrezygnowanie z tworzenia opcji rejestracji nowych kont. Jak więc w praktyce wygląda logowanie na stronie z użyciem OpenID?

Pierwszym krokiem, jaki musi poczynić użytkownik, jest założenie konta na serwerze tzw. „dostawcy tożsamości”. Jest to nic innego, jak witryna internetowa, oferująca odwiedzającym możliwość rejestracji i otrzymania własnego konta OpenID. Dostawcą tożsamości może zostać tak naprawdę każdy - wystarczy wykupić domenę i zainstalować odpowiednie oprogramowanie, dostępne bezpłatnie i napisane m.in. w takich językach jak PHP, Python czy Java. Na świecie działa obecnie kilkadziesiąt serwerów OpenID, a ich liczba stale rośnie.

Formularz logowania za pomocą OpenID
Przykładowy formularz logowania za pomocą OpenId

Podczas rejestracji konta, użytkownik otrzymuje swój unikalny URL, składający się z wybranej nazwy użytkownika i domeny dostawcy tożsamości. Adres ten staje się jednocześnie loginem, który możemy wykorzystywać we wszystkich serwisach obsługujących uwierzytelnianie oparte na OpenID. Po podaniu naszego loginu na tego typu stronach, zostaniemy przekierowani na stronę naszego dostawcy tożsamości, gdzie będziemy poproszeni o podanie hasła. Po poprawnym zalogowaniu, nasz serwer OpenID zapyta się nas o rodzaj danych, jakie zgadzamy się przekazać witrynie internetowej (może to być np. imię, nazwisko, miejsce zamieszkania czy adres e-mail), po czym przekierowuje nas na witrynę, na której zapoczątkowany został proces logowania.

Różnica pomiędzy obecną sytuacją, w której na każdej stronie mamy osobny profil, jest więc diametralna. W przypadku OpenID utrzymujemy naszą tożsamość na wybranym przez nas serwerze, którą następnie możemy w wybranym przez nas zakresie przekazywać poszczególnym aplikacjom internetowym.

Zalety OpenID

OpenID, jako stosunkowo nowa technologia, notuje intensywny rozwój, stale udoskonalając się i zwiększając oferowane możliwości. Największą zaletą OpenID jest otwartość platformy oraz fakt jej zdecentralizowania - nie mamy do czynienia z jednym globalnym serwerem, utrzymującym wirtualne tożsamości użytkowników, lecz z szeregiem rozproszonych dostawców usług, którym może zostać właściwie każdy. Niezaprzeczalnym plusem OpenID jest również fakt jego obsługi przez dowolną technologię - istnieje otwarta specyfikacja wykorzystywanych protokołów, dzięki czemu implementacji można dokonać w każdym języku, który używany jest do budowy aplikacji internetowych.

Nie ulega wątpliwości, że OpenID przynosi olbrzymie ułatwienie dla końcowych użytkowników - uwalniając ich od konieczności pamiętania niezliczonych loginów i haseł. W ramach jednego dostawcy tożsamości jest możliwość tworzenia kilku własnych wizytówek - różniących się np. ilością wprowadzonych danych - inną wizytówkę chcemy bowiem przekazywać np. sklepowi internetowemu, a inne - forum dyskusyjnemu, na którym pragniemy dodać własną wypowiedź, do czego nie jest potrzebny nasz adres zamieszkania. Znacznemu ułatwieniu ulega również zarządzanie danymi - jeśli chcemy część z nich zmienić, wystarczy, że zrobimy to w jednym miejscu. W każdej chwili istnieje też możliwość zablokowania udostępniania naszych danych konkretnej usłudze - nie musimy więc np. pisać do właściciela serwisu z prośbą o usunięcie naszego konta, zamiast tego dokonujemy tego w panelu administracyjnym na serwerze naszego dostawcy tożsamości.

Przyszłość OpenID

Aktualnie obowiązującą specyfikacją OpenID jest wersja 1.1, która wkrótce zostanie zastąpioną przez OpenID 2.0. Wśród licznych nowości, warto zwrócić uwagę m.in. na możliwość anonimowego logowania (wówczas w serwisie internetowym podajemy jedynie adres naszego dostawcy tożsamości) czy poprawione bezpieczeństwo, poprzez zastosowanie lepszych mechanizmów szyfrujących i mechanizmów ochronnych przed popularnymi atakami (np. Denial of Service, Man-in-the-Middle).

Nowa wersja specyfikacji OpenID nakazuje także wsparcie dla obsługi protokołu Yadis - inicjatywy powstałej w 2005 roku, będącej systemem rozpoznawania usług, pozwalającym na automatyczny wybór protokołu do identyfikacji tożsamości. Brzmi skomplikowanie, jednak w istocie Yadis to plik XML - nazwany XRI („Extensible Resource Descriptor”) - w którym definiujemy, kto jest naszym dostawcą tożsamości. Możemy w pliku podać kilku takich dostawców i przypisać im odpowiednie priorytety. W praktyce, dzięki Yadis naszym loginem OpenID może być własna strona internetowa czy blog - wystarczy, że umieścimy na nim odpowiednio przygotowany plik Yadis, w którym wskażemy, z usług którego dostawcy tożsamości korzystamy. Uniezależniamy się wówczas od konkretnego serwera, możemy także zabezpieczyć się przed awarią jednego z dostawców tożsamości - wówczas jego rolę przejmuje inny, z niższym priorytetem.

Z chwilą oficjalnego wejścia w życie wersji 2.0, z pewnością użytkownicy jak i twórcy serwisów otrzymają jeszcze lepsze narzędzie, dzięki czemu możliwe jest znaczne uporządkowanie sytuacji na rynku tożsamości cyfrowej, która każdego dnia zyskuje na znaczeniu.

Rozwiązanie idealne?

Zalety OpenID sprawiają, iż wydaje się to być w tej chwili najlepsze rozwiązanie w swojej kategorii, zdolne to upowszechnienia się w globalnej sieci. Niestety, nie jest to technologia idealna - problem leży w bezpieczeństwie danych.

O ile włamanie na konto użytkownika na forum czy w serwisie społecznościowym nie jest aż tak groźne, o tyle zdobycie hasła do konta na serwerze OpenID może spowodować poważne problemy - napastnik zdobywa bowiem praktycznie całą tożsamość cyfrową użytkownika (przy założeniu, że ten z niej intensywnie korzystał). Gdy niepowołana osoba zdobędzie dostęp do naszego konta OpenID, wówczas zdobędzie ona olbrzymią ilość informacji o nas, co może wykorzystać na niezliczone sposoby, niekoniecznie dla nas korzystne. Jako, że login OpenID daje dostęp do wielu serwisów sieciowych, automatycznie wzrasta jego „wartość” w oczach agresora - konieczne jest więc zastosowanie wysokiego poziomu bezpieczeństwa.

Największe niebezpieczeństwo stoi nie po stronie używanej technologii (takich jak mechanizmy szyfrujące czy bezpieczeństwo serwerów), lecz po stronie użytkownika - „świetnym” pomysłem na wyłudzenie danych dostępowych do kont OpenID wydaje się bowiem phishing. Wyobraźmy sobie, że sprytny oszust tworzy witrynę internetową, na której oferuje możliwość logowania się za pomocą OpenID. Następnie użytkownik, po podaniu swojego identyfikatora URL (loginu) przekierowywany jest na stronę łudząco podobną do tej, którą posiada jego dostawca tożsamości - wpisuje na niej swoje hasło... które automatycznie wędruje do agresora. Cały proces phishingu (włącznie ze stworzeniem „kopii” stron dostawców tożsamości na podobnych domenach internetowych) można tak zaprojektować, że użytkownik nie będzie sobie zdawał sprawy z faktu, iż właśnie padł ofiarą ataku - wszak pomyślnie zalogował się za pomocą swojego OpenID w normalnym serwisie internetowym.

To właśnie phishing wydaje się być najgroźniejszym niebezpieczeństwem, związanym z użyciem OpenID, a mogącym wpłynąć na jego popularność. Trzeba jednak twórcom oddać, iż zauważają oni ten problem, wymyślając co raz to nowsze sposoby na jego wyeliminowanie i zminimalizowanie. Co z tego wyniknie - zobaczymy. Warto jednak dodać, iż nowoczesne przeglądarki (m.in. Firefox czy Internet Explorer 7.0) posiadają wbudowane zabezpieczenia anty-phishingowe, które skutecznie mogą wykrywać tego typu ataki.

Czy warto?

OpenID to rozwiązanie nowe, dopiero zdobywające popularność. Usługi tego typu, ułatwiające zarządzanie cyfrową tożsamością użytkowników, z pewnością na rynku są potrzebne i mogą jeszcze bardziej przyczynić się do rozwoju internetu. Czy rynek - przede wszystkim konsumentów - jest przygotowany na rewolucję w zarządzaniu swoim wirtualnym wizerunkiem? Jeśli tak - OpenID z pewnością jest w stanie temu wyzwaniu sprostać. Pałeczka stoi teraz po stronie twórców serwisów - jeśli zaimplementują oni możliwość logowania przez OpenID, wówczas technologia ta ma szanse na dalszy intensywny rozwój i zdobycie popularności, nie tylko w świecie webmasterów i osób zajmujących się siecią zawodowo.

Popularność OpenID

Głównym czynnikiem, który jest w stanie przekonać webmasterów do wdrożenia w swoich serwisach OpenID jest popularność tego rozwiązania. Wg angielskiej Wikipedii (dane z lipca 2007), liczba kont OpenID na świecie wyniosła około 120 milionów, przy 4,5 tysiącach serwisów, które zaimplementowały tą technologię. Wśród nich znajdują się m.in. LiveJournal.com, ImageShack, WikiTravel, Technorati, AOL.com, a także liczne blogi i systemy blogowe (np. Wordpress.com). Dalszy wzrost liczby osób i serwisów korzystających z OpenID przyniesie zapewne wydanie oficjalnej wersji 2.0 specyfikacji.

Powołane zostały również niedochodowe organizacje, mające wspierać rozwój OpenID: w Stanach Zjednoczonych jest to OpenID Foundation, z kolei w Europie - OpenID Europe, powstałe w 2007 roku. Jednym z działań fundacji jest przyznawanie nagród pieniężnych OpenID Bounty - zgromadzono łączną pulę 50 tys. dolarów, która czeka na 10 dużych projektów Open Source, które w standardowym wydaniu zaimplementują OpenID. Przyznano już pierwsze trzy nagrody: 5000$ trafiło do autorów Drupala, Plone i dotnetnuke.

OpenID rozwija się także w Polsce, gdzie działają dwa serwery: openid.pl oraz myid.pl. Na pierwszym z nich dostępny jest również system wiki, na którym - poza informacjami o samej technologii - znajdziemy listę polskich blogów, które wdrożyły OpenID (m.in. platforma Jogger.pl). Na uwagę zasługuje również blog.identity20.pl prowadzony przez Marcina Jagodzińskiego, który porusza liczne aspekty cyfrowej tożsamości.

Milowym krokiem dla rozwoju OpenID może okazać się wsparcie, jakie dla tej technologii zapowiadają Mozilla i Microsoft. W planach na wydanie Firefoksa 3.0 uwzględniono bowiem wbudowaną obsługę OpenID, z kolei gigant z Redmond pracuje nad współpracą tego rozwiązania z własną technologią - Windows CardSpace. Jeśli plany te zostaną zrealizowane, z pewnością przełoży się to na znaczny wzrost popularności OpenID.

Windows CardSpace

Działania Microsoftu zmierzające do ułatwienia zarządzania tożsamością cyfrową sięgają jeszcze usługi „MS Passport Network”, nazwanej później „Windows Live ID”. Usługa ta charakteryzowała się - podobnie jak OpenID - posiadaniem jednego loginu/hasła, za pomocą których możliwe było korzystanie z wielu serwisów. O braku sukcesu paszportu Microsoftu przesądził przede wszystkim fakt centralizacji - wszak nie każdy ufa na tyle Microsoftowi, aby powierzać mu utrzymywanie własnej, cyfrowej tożsamości. Fakt istnienia jednego serwera powoduje również większą podatność na ataki, zmniejszając w tym sposób bezpieczeństwo tego rozwiązania. Nie bez znaczenia dla niskiej popularności usługi była również trudność z jej implementacją we własnym serwisie - tak naprawdę „Windows Live ID” stosowane było jedynie w rozmaitych serwisach Microsoftu (np. Hotmail, MSN) , nie przebijając się do zewnętrznych stron internetowych.

Microsoft wyciągnął jednak dobre wnioski z dotychczasowej działalności, tworząc nową, zdecentralizowaną technologię - Windows CardSpace. Opiera się ona o tzw. karty informacyjne („information cards”), które użytkownik wybiera z osobnego okienka, podczas procesu logowania w serwisach internetowych. Karty tego typu można tworzyć samodzielne, bądź też mogą być one dostarczone np. przez zakład pracy, bank czy instytucję rządową. Rozwiązanie CardSpace dostępne jest w systemie Vista, a wraz z pojawieniem się .NET Framework - także w Windows XP i Server 2003. Microsoft bardzo poważnie potraktował kwestie bezpieczeństwa CardSpace, dlatego istnieje duża szansa, że już wkrótce usługa ta zdobędzie sporą popularność.

Co ważne, CardSpace nie stanowi bezpośrednio konkurencji dla OpenID. Istnieje wręcz spora możliwość współpracy między tymi rozwiązaniami, stąd zapowiedzi Microsoftu co do wsparcia OpenID 2.0 w Windows Vista. Nic nie stoi bowiem na przeszkodzie, aby użytkownicy Windowsa mogli wygodnie logować się do serwera OpenID za pomocą wybranej karty informacyjnej. Microsoft, dzięki olbrzymiemu udziałowi na rynku systemów operacyjnych komputerów osobistych, może z pewnością sprawić, że wkrótce znacznie zmieni się podejście do zarządzania tożsamością cyfrową, właśnie dzięki takim usługom jak CardSpace i OpenID.

Informacje o CardSpace:

Wdrażanie OpenID

Specyfikacja OpenID jest otwarta, dzięki czemu implementacja tego standardu może nastąpić praktycznie w dowolnej technologii. Istnieją już biblioteki dla wszystkich popularnych języków, stosowanych przy budowie witryn internetowych: C#, C++, Java, Perl, Python, Ruby, PHP czy ColdFusion. Stale aktualizowaną ich listę znajdziemy na oficjalnej stronie OpenID.net oraz w serwisie OpenIDEnabled.com, tworzonym przez społeczność internautów.

My skupimy się na przykładowym wdrożeniu OpenID w języku PHP. Istnieje kilka gotowych klas napisanych w tej technologii, spośród nich warto zwrócić uwagę na „Simple OpenID PHP Class” - prostą, niewielką (10KB) i łatwą w użyciu, znakomicie nadającą się do szybkiego wprowadzenia obsługi logowania przez OpenID.

Wdrażanie należy rozpocząć od stworzenia formularza logowania, który zawierać będzie jedno pole dla użytkownika, przeznaczone na identyfikator OpenID:

<fieldset> 
<legend>Logowanie przez OpenID</legend> 
<form action="" method="post"> 
<input type="hidden" name="openid_action" value="login" /> 
<label>Login: <input type="text" name="openid_url"
class="openid_login" /></label> <input type="submit" name="login" value="Zaloguj" /> </form> </fieldset>

Dodane jest również pole ukryte, określające akcję (openid_action = „login”), co zostanie wykorzystane do wykrycia akcji wysłania formularza. Na uwagę zasługuje również selektor CSS pola tekstowego przeznaczonego na login. Wygląda on następująco:

input.openid_login {
   background: url('http://openid.net/login-bg.gif') no-repeat;
   background-color: #fff;
   background-position: 0 50%;
   color: #000;
   padding-left: 18px;
}

Powyższy kod CSS doda do pola tekstowego tło, którym jest niewielkie logo OpenID - jest to swego rodzaju standard, dodatkowo informujący użytkownika, iż logowanie następuje z wykorzystaniem OpenID.

Po stworzeniu i ostylowaniu formularza, czas na kod PHP:

require('class.openid.php');

if ($_POST['openid_action'] == "login"){
 // ...
} 

Na początek ładujemy plik z klasą SimpleOpenID, po czym sprawdzamy, czy został wypełniony formularz logowania. Jeśli tak, wówczas tworzymy instancję klasy i ustalamy kilka niezbędnych parametrów:

$openid = new SimpleOpenID;
$openid->SetIdentity($_POST['openid_url']);
$openid->SetTrustRoot('http://' . $_SERVER["HTTP_HOST"]);
$openid->SetRequiredFields(array('email','fullname'));
$openid->SetOptionalFields(array('gender','postcode','country','language'));

Za pomocą metody SetIdentity() ustawiamy login użytkownika, z kolei SetTrustRoot() służy do określenia adresu URL serwisu, na którym użytkownik będzie zalogowany. Funkcje SetRequiredFields() oraz SetOptionalFields() określają jakie pola z wizytówki użytkownika są naszemu serwisowi potrzebne (z podziałem na wymagane i opcjonalne). Czas teraz na połączenie się z dostawcą tożsamości użytkownika i przekierowanie na stronę logowania, gdzie odwiedzający będzie mógł podać swoje hasło:

if ($openid->GetOpenIDServer()){
	$openid->SetApprovedURL('http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PATH_INFO"]);
	$openid->Redirect(); Server
}
else
{
	$error = $openid->GetError();
	echo 'ERROR CODE: ' . $error['code'] . '
'; echo 'ERROR DESCRIPTION: ' . $error['description'] . '
'; }

Metoda GetOpenIDServer() zwraca false jeśli połączenie z dostawcą tożsamości nie doszło do skutku - w takim wypadku pobierany i wyświetlany jest komunikat błędu (tablica $error). Jeśli powiązanie zostało nawiązane pomyślnie, wówczas za pomocą metody SetApprovedURL() ustawiany jest adres URL skryptu, na który przyjdzie odpowiedź serwera dostawcy tożsamości. Po tym fakcie pozostaje już tylko użycie funkcji Redirect(), która przekieruje użytkownika na stronę logowania.

Pierwsza część skryptu już gotowa, czas teraz na obsłużenie danych, które przyśle nam serwer OpenID. W tym celu rozbudowujemy naszą pierwszą instrukcję warunkową:

else if ($_GET['openid_mode'] == 'id_res')
{   
	// ...
}
else if ($_GET['openid_mode'] == 'cancel')
{
	echo 'USER CANCELED REQUEST';
} 

Serwer OpenID poprzez zmienną GET przekaże nam informację, czy użytkownik rozmyślił się i nie zalogował, czy też konieczna jest weryfikacja naszego żądania, dotyczącego uwierzytelnienia odwiedzającego:

$openid = new SimpleOpenID;
$openid->SetIdentity($_GET['openid_identity']);
$openid_validation_result = $openid->ValidateWithServer();

if ($openid_validation_result == true)
{
	// użytkownik zalogowany
}
else if ($openid->IsError() == true)
{
	$error = $openid->GetError();
	echo "ERROR CODE: " . $error['code'] . "
"; echo "ERROR DESCRIPTION: " . $error['description'] . "
"; } else { echo "INVALID AUTHORIZATION"; }

Najważniejsza część powyższego kodu to użycie metody ValidateWithServer(), która zwraca true lub false, w zależności od wyniku uwierzytelnienia. Pozostały kod to obsługa i wyświetlenie ew. błędów.

Dzięki zastosowaniu klasy SimpleOpenID możemy więc w szybki i łatwy sposób umożliwić logowanie do naszego serwisu za pomocą OpenID. W przypadku większych serwisów, zwłaszcza tych posiadających już własny system uwierzytelniania i autoryzacji użytkowników, można wykorzystać OpenID we współpracy z już istniejącą bazą danych. Pomocny w tym zakresie może okazać się poradnik (dostępny w języku angielskim), przygotowany przez serwis plaxo.com i dostępny pod adresem: http://www.plaxo.com/api/openid_recipe - opisuje on krok po kroku doświadczenia twórców tej witryny z zaawansowanym wdrożeniem OpenID.

Publikacje