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 online.
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.
OpenID to otwarty, zdecentralizowany
system, umożliwiający zrealizowanie tzw. \”pojedynczej rejestracji\”
(ang. \”Single sign-on\”, SSO). W praktyce polega to
na tym, że 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. Co
więcej, jest to rozwiązanie szybsze, 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.
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.
W porównaniu z obecnie stosowanymi rozwiązaniami,
różnica jest 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 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 daje
olbrzymie ułatwienie końcowym użytkownikom,
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 inną forum dyskusyjnemu, na
którym pragniemy dodać własną wypowiedź, do
czego nie jest potrzebny żaden adres zamieszkania.
Znacznemu ułatwieniu ulega również zarządzanie
danymi, ponieważ można je edytować i zarządzać
nimi 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 wystarczy zmiana
kilku opcji w panelu administracyjnym na serwerze
naszego dostawcy tożsamości.
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. Te ostatnie
zmiany dotyczą przede wszystkim zastosowania
lepszych mechanizmów szyfrujących i 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 i twórcy serwisów
otrzymają jeszcze lepsze narzędzie, dzięki któremu
możliwe będzie uporządkowanie sytuacji na rynku
tożsamości cyfrowej, która każdego dnia zyskuje
na znaczeniu.
Rozwiązanie idealne?
Zalety OpenID sprawiają, że wydaje się to
być w tej chwili najlepsze rozwiązanie w swojej
kategorii, mające największe szanse na upowszechnienie
się w internecie. 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 uzyska olbrzymią ilość informacji, co
może wykorzystać na niezliczone sposoby. 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 zagrożenie stoi nie po stronie
używanej technologii, lecz po stronie użytkownika.
Skutecznym 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 coraz to nowe 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 antyphishingowe, które pozwalają
skutecznie 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ą są w internecie potrzebne i mogą jeszcze
bardziej przyczynić się do rozwoju sieci. Wiele
zależy od twórców serwisów.
Jeśli zaimplementują
oni w swoich serwisach możliwość logowania
przez OpenID, wówczas technologia ta ma szanse
na dalszy rozwój i zdobycie popularności, nie tylko
w świecie webmasterów i osób zajmujących się
siecią zawodowo.
Popularność OpenId
Według 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ę
duże portale, m.in. LiveJournal.com, ImageShack,
WikiTravel, Technorati, AOL.com, a także liczne
blogi i platformy 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 – powstałe w 2007
roku OpenID Europe. Jednym z działań fundacji
jest przyznawanie nagród pieniężnych OpenID
Bounty. Obecnie zgromadzono łączną pulę 50 tys.
dolarów dla 10 dużych projektów Open Source,
które w standardowym wydaniu zaimplementują
OpenID. Przyznano już pierwsze trzy nagrody:
5000 dolarów 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.
Pod adresem openid.pl działa także strona wiki,
zawierająca 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 połączeniem 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.
Specyfikacja OpenID jest otwarta, dzięki czemu
dostępne są już biblioteki dla wszystkich popularnych
języków stosowanych przy tworzeniu witryn
internetowych: C#, C++, Java, Perl, Python,
Ruby, PHP czy ColdFusion. Stale aktualizowaną ich
listę opublikowano na oficjalnej stronie OpenID.net
oraz w serwisie OpenIDEnabled.com, tworzonym
przez społeczność internautów.
W naszym przykładzie skupimy się na przykładowym
wdrożeniu OpenID w języku PHP. Istnieje
kilka gotowych klas napisanych w tej technologii,
spośród których warto zwrócić uwagę na \”Simple
OpenID PHP Class\” (http://www.phpclasses.org/browse/package/3290.html). Jest ona prosta,
ma niewielki rozmiar (10KB) i znakomicie nadaje
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:
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ą Simple OpenID,
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 {stala}SetIdentity(){/stala} ustawiamy login
użytkownika, z kolei {stala}SetTrustRoot(){/stala} służy do określenia
adresu URL serwisu, na którym użytkownik
będzie zalogowany. Funkcje {stala}SetRequiredFields(){/stala}
oraz {stala}SetOptionalFields(){/stala} 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 {stala}GetOpenIDServer(){/stala} 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 {stala}SetApprovedURL(){/stala} ustawiany jest adres
URL skryptu, na który przyjdzie odpowiedź serwera
dostawcy tożsamości. Po tym fakcie pozostaje
już tylko użycie funkcji {stala}Redirect(){/stala}, 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 {stala}ValidateWithServer(){/stala}, która zwraca true lub
false, w zależności od wyniku uwierzytelnienia.
Pozostały kod to obsługa i wyświetlenie ewentualnych
błędów.
Dzięki zastosowaniu klasy {stala}SimpleOpenID{/stala} 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 wdrażaniem OpenID.