sobota, 18 czerwca 2011

Jak przebiega autoryzacja aplikacji na Facebooku? Krok po kroku.

Aby uzyskać autoryzację dla aplikacji Facebookowej developerzy zalecają korzystanie z protokołu OAuth 2.0 Dialog (jest to standard pozwalający dzielić się swoimi prywatnymi materiałami z innymi). Do wykorzystania są także popularne biblioteki JS SDK lub PHP SDK ułatwiające pracę. Tu jednak poruszone zostanie klasyczne rozwiązanie.

Autoryzację OAuth w Facebooku wykonujemy przekierowując użytkownika na adres URL, stworzony według schematu: 
  
https://www.facebook.com/dialog/oauth?
client_id=YOUR_APP_ID
&redirect_uri=YOUR_CANVAS_PAGE


Gdzie YOUR_APP_ID jest identyfikatorem aplikacji , a YOUR_CANVAS_PAGE ścieżką URL do naszego  serwera który ją przechowuje. Domyślnie adres ten uzyskuje dostęp do podstawowych informacji o użytkowniku. Aby pobrać więcej danych, musimy wymienić żądane informacje, po parametrze scope. Poniższy przykład pokazuje jak uzyskać dostęp do adresu e-mail oraz pola news feed (czyli informacji o aktywności znajomych) 

https://www.facebook.com/dialog/oauth?
client_id=YOUR_APP_ID  
&redirect_uri=YOUR_CANVAS_PAGE 
&scope=email,user_status,user_location 

Pełna lista informacji jakie możemy pobrać dostępna jest na tej stronie. Istnieje pewna zależność pomiędzy ilością zbieranych danych, a liczbą użytkowników zezwalających na ich udostępnianie. Mianowicie, im więcej danych żądamy, mniej użytkowników będzie korzystało z naszej aplikacji.

W przypadku gdy użytkownik odmówi udostępnienia informacji, przeglądarka przekieruje go na adres wygenerowany na podstawie podanego wcześniej redirect_uri, zwracając błędy:

http://YOUR_CANVAS_PAGE?
error_reason=user_denied
&error=access_denied
&error_description=The+user+denied+your+request.

 
W przypadku, gdy użytkownik zezwala na udostępnianie informacji o które został poproszony, aplikacja przekierowuje go na adres podany w redirect_uri ustawiając parametr signed_request. Parametr ten jest połączeniem funkcji hashującej HMAC SHA-256, znaku ‘.’ oraz obiektu JSON zakodowanego algorytmem base64url. Może wyglądać np. tak (bez znaków nowej linii)
vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.
eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0 
Sygnatura HMAC zapewnia, że przesyłane dane pochodzą z serwisu Facebook (dzięki kodowaniu przez tajny kod App Secret znany tylko twórcy aplikacji).

Dalej zakodowany jest obiekt JSON. Jest to format tekstowy używany przy wymianie danych przez skrypty. Często używa się go przy okazji wykorzystania technologii AJAX. Obsługa odebranego ciągu znaków ogranicza się do zastosowania na nim funkcji eval() (JS). Zamienia ona dane JSON na dane w formacie tablicy. Dostęp do nich uzyskujemy poprzez nazwę i indeksy pól. Na przykład odebranaDana.tytul lub odebranaDana.tresc.

W przypadku języka PHP, wystarczy na tablicy danych zastosować funkcję json_encode(), aby zamienić je na format JSON. Dekodowanie wykonujemy analogicznie wykorzystując funkcję json_decode().

Obiekt signed_request zawiera następujące pola:

·         user
Tablica JSON zawierająca takie informacje jak kraj z którego pochodzi użytkownik, zakres wieku w jakim się plasuje, locale (czyli ustawienia zmiennych środowiskowych).
·         algorithm
Ciąg znaków JSON zawierający nazwę algorytmu użytego do zakodowania żądania.
·         issued_at
Liczba JSON w formacie POSIX, informująca kiedy żądanie zostało zrealizowane.
·         user_id
Ciąg znaków JSON zawierający identyfikator bieżącego użytkownika (UID).
·         oauth_token
Ciąg znaków JSON wykorzystywany przy korzystaniu z Graph API.
·         expires
Liczba JSON zawierająca czas w formacie POSIX, którego data wyznacza okres wygaśnięcia oauth_token.

Poniższy kod PHP demonstruje zasadę działania procesu autoryzacji oraz wyświetla zawartość zmiennej signed_request w formacie przyjaznym użytkownikowi.
<?php
 # Nr ID aplikacji
 $app_id = '179524192103712';
 # Adres canvas aplikacji
 $canvas_page = 'http://apps.facebook.com/khozzyaps/';
 # Tworzenie adresu url zgodnego ze standardem OAuth
 # Pobieramy dodatkowo takie informacje jak email, status oraz lokalizacje uzytkownika
 $auth_url = 'http://facebook.com/dialog/oauth?client_id=' . $app_id . '&redirect_uri=' . urlencode($canvas_page) 
 . '&scope=email,user_status,user_location';
 # Odebranie danych i zapisanie jej do zmiennej
 $signed_request = $_REQUEST["signed_request"];
 # Dzielimy odebrane dane wzgledem kropki na dwie czesci
 list($encoded_sig,$payload) = explode('.',$signed_request,2);
 # Dekodujemy druga czecs odebranych danych i zapisujemy je do zmiennej
 $data = json_decode(base64_decode(strtr($payload,'_-',' /')), true);
 
 # Jezeli nie zautoryzowano uzytkownika, przenies go z powrotem na strone autoryzacji
 if (empty($data["user_id"])) {
  echo("<script> top.location.href='" . $auth_url . "'</script>");
 }
 # Jezli wszystko odbylo sie poprawnie wyswietl zawartosc zmiennej $data w formie przyjaznej uzytkownikowi
 else {
  echo "<pre>";
  echo print_r($data); 
  echo "</pre>";
 }
 
?>

Oraz zrzut ekranu prezentujący działanie aplikacji:


Brak komentarzy:

Prześlij komentarz