Logowanie na stronie za pomocą Facebook Connect

Wykorzystanie Facebook Connect do logowania na własnej stronie internetowej

04 Marzec 2011

Autor: Mikołaj Gnaciński / Weeby.pl

Nie od dziś wiadomo, że Facebook posiada ogromną rzeszę użytkowników korzystających z niego regularnie. Ostatnie wyniki pokazują, ze przebił on ilością wejść nawet Google. Od końca 2008 roku udostępniony został „Facebook Connect”, który pozwala zintegrować z Facebookiem zewnętrzne serwisy internetowe. Za granicą to rozwiązanie jest dość powszechnie wykorzystywane, także w Polsce coraz częściej można spotkać się z witrynami internetowymi oferującymi logowanie poprzez Facebooka. Integracja własnej strony z „FC” nie jest zadaniem trudnym i może zostać przeprowadzona stosunkowo niedużym nakładem sił.

Całość integracji można podzielić na dwa etapy:

Pierwszym krokiem jaki należy wykonać, jest stworzenie nowej aplikacji na Facebooku. W tym celu, po zalogowaniu, należy kliknąć na przycisk „+ Utwórz Nową Aplikację” na stronie www.facebook.com/developers. W formularzy należy określić nazwę aplikacji.

Rejestracja nowej aplikacji

Po stworzeniu aplikacji, można edytować jej parametry – między innymi: nazwę, opis, ikonę, logo, język. Istnieje również możliwość określenia użytkowników oraz ich ról.

Edycja aplikacji

W zakładce „Strona aplikacji” znajdują się ID oraz ukryty kod aplikacji, które będą wykorzystane do autoryzacji kodu znajdującego się na stronie internetowej, gdzie będzie wykorzystywane logowanie za pomocą Facebook Connect. Należy także w tym miejscu określić adres url, pod którym znajduje się strona internetowa. Uzupełnienie pola „Domena strony” pozwoli na wykorzystanie logowania na dowolnej subdomenie serwisu.

Zakładka "Strona aplikacji"

Ostatnim elementem jest konfiguracja integracji serwisu z Facebookiem w zakładce „Integracja z Facebookiem”, gdzie należy określić:

Zakładka "Integracja z Facebookiem"

Po skonfigurowaniu aplikacji należy pobrać i rozpakować pliki biblioteki facebook.php oraz certyfikatu fb_ca_chain_bundle.crt ze strony github.com/facebook/php-sdk/tarball/master.

Integracja z serwisem mogłaby polegać na sprawdzaniu, czy użytkownik logujący się wykorzystując Facebook Connect jest już zarejestrowany w bazie. W przypadku braku takiego użytkownika jest on niejawnie rejestrowany, po czym dokonywane jest takie samo logowanie, jak w standardowym przypadku. Aby rozróżnić użytkowników logujących się za pomocą Facebook Connect warto dodać do tabeli z użytkownikami atrybut zawierający id użytkownika z Facebooka i po nim sprawdzać, czy taki użytkownik już istnieje.

W miejscu, gdzie będzie znajdował się skrypt przetwarzający logowanie należy załączyć ściągniętą bibliotekę, utworzyć nowy obiekt $facebook ustawiając ID oraz ukryty kod aplikacji, a także sprawdzić, czy użytkownik jest już zalogowany na Facebooku pobierając sesję.

// weryfikacja danych formularza w serwisie podczas zwykłego logowania
if (trim($_POST['email']) != '' && trim($_POST['haslo']) != '')
{
	// sprawdzanie w bazie, czy użytkownik istnieje,
	// dodawanie zmiennych do sesji,
	// obsługa błędów, itp...
}

// logowanie poprzez Facebook connect
require '../src/facebook.php';

$facebook = new Facebook(array(
	'appId'  => '111111111111111',
	'secret' => '11111111111111111111111111111111',
 	'cookie' => true,
));

$session = $facebook->getSession();

W przypadku ustawionej sesji pobrać należy dane użytkownika:

$me = null;

if ($session) {
	try {
		// jeżeli użytkownik jest zalogowany na Facebooku
		// do zmiennej $uid zostanie zapisany identyfikator użytkownika
		// do zmiennej $me zostaną zapisane dane użytkownika
		$uid = $facebook->getUser();
		$me = $facebook->api('/me');
	} catch (FacebookApiException $e) {
		error_log($e);
	}
}

Zmienna $me zawierać będzie takie dane jak:

$me[id]		// id użytkownika na Facebooku
$me[name]		// imię i nazwisko
$me[first_name]	// imię
$me[last_name]	// nazwisko
$me[link]		// link do profilu użytkownika
$me[birthday]	// data urodzenia w formacie MM/DD/YYYY
$me[hometown]	// tablica zawierająca id oraz nazwę miasta rodzinnego
$me[location]	// tablica zawierająca id oraz nazwę miejsca zamieszkania
$me[work]		// tablica zawierająca informacje o przebiegu zatrudnienia
$me[education]	// tablica zawierająca informacje o przebiegu edukacji
$me[grender]	// płeć
$me[timezone]	// strefa czasowa
$me[locale]		// język (np. pl_PL)
$me[verified]	// czy użytkownik potwierdził swoje konto po rejestracji

Możliwe jest pobranie praktycznie wszystkich danych dotyczących użytkownika, takich jak między innymi: znajomi, zdjęcia, grupy. Więcej informacji na ten temat znajduje się pod adresem: developers.facebook.com/docs/api.
Przykładowo, aby wyświetlić zdjęcie profilowe użytkownika wystarczy napisać:

Ostatnim etapem jest sprawdzenie, czy użytkownik jest już zarejestrowany w bazie oraz jego zalogowanie:

if ($me)
{
	// sprawdzenie, czy użytkownik jest już zarejestrowany
	// przykładowo:
	$select = 'SELECT * FROM users WHERE fb_id = "' . $me['id'] . '"';
	$result = $conn->query($select);
	$count = $result->num_rows; 

	if ($count == 0)
	{
		// kod rejestrujący nowego użytkownika
	}

	// dalsze procedury logujące, takie jak dodawanie zmiennych do sesji, przekierowanie na inną stronę, itp...
}

Przykład działającej aplikacji do ściągnięcia tutaj. Wersja demo do sprawdzenia pod tym adresem.
Więcej informacji pod adresem developers.facebook.com/docs

14 komentarzy do wpisu:

  1. Wrona pisze:

    Niestety przykład działającej aplikacji – nie działa… A wersja demo – obsługuje „e-mail”? Bo nie pyta użytkownika o zezwolenie na używanie go…

  2. W którym miejscu zaistniał błąd? Biblioteka Facebooka wymaga cURL, to może być w tym przypadku problemem. Innymi istotnymi elementami jest uzupełnienie klucza appId oraz secret (plik facebook_connect.php), czy też konfiguracja przykładowej bazy danych. Opis struktury tej bazy znajduje się w pliku readme.txt dołączonym do paczki.

    Wersja demo została okrojona i służy jedynie do prezentacji możliwości logowania się poprzez Facebook Connect.

  3. Wrona pisze:

    Przynajmniej szybka odpowiedź :) Może na GG/mail dałoby się pogadać?

    Ale wracając do problemu: Po pierwsze, w skrypcie który daliście „wyskakuje” na stronie logowanie.php formularz (na dodatek action=”/zaloguj.php” – a powinno być moim zdaniem bez „/”), a w demie, które jest na Waszej stronie tego formularza nie ma. Baza jest jak trzeba, db_conn uzupełniony, ale do bazy nic nie wskakuje. Możliwe, że popełniłem jakiś błąd jeszcze przy „tworzeniu” aplikacji – co ma być dokładnie w polu „Adres ramki”, w polu „Adres (URL) strony” (do dokładnego folderu czy sama domena?).

    Nie mówię, ze to nie mój błąd, tylko chciałbym wiedzieć gdzie jest popełniony :)

    PS: GG:4505760

  4. Wrona pisze:

    Ok, udało mi się poprawić te kilka błędów (zapytanie do MYSQL’a i 2 razy nie potrzebny „/” przed adresem pliku php), ale nie mogę dobrać się do pola $me[email] – w sensie, nie wiem, gdzie trzeba dodać ten parametr, aby użytkownik mógł przy klikaniu i dodawaniu „pozwoleń” na facebooku mógł także pozwolić na udostępnianie adresu email…

  5. Wrona pisze:

    To już ostatni raz ja :)

    Rozwiązanie problemu z emailem – w pliku biblioteka/facebook.php trzeba dodać linijkę ‘req_perms’ => ‘email’, w funkcji getLoginUrl, to jest dokładnie 432 linijka, zaraz po ‘v’ => ’1.0′, . W ten sposób, można pytać także użytkownika o inne pozwolenia (publikowanie na tablicy etc etc).

  6. Dzięki za informacje, poprawki w skrypcie zostały naniesione

  7. este pisze:

    Witaj, może mi pomożesz, ;)
    loguje się przez facebook do serwisu, jeśli użytkownika nie ma w mojej w bazie to go tworzę i automatycznie loguje, i teraz się wylogowuję – do tego momentu fajnie działa. Teraz gdy spróbuje się ponownie zalogować to dialog otwiera się i od razu przekierowuje mnie do php z logowaniem, to chyba normalne, tylko, że teraz metoda Kohana_Facebook::instance()->logged_in() zwraca null. Ta metoda to nic innego jak:

    >> return $this->_me != NULL;

    Tymczasem reszta kluczowa część tej klasy to:

    protected function __construct()
    {
    include Kohana::find_file(‘vendor’, ‘facebook/src/facebook’);

    // Do class setup
    $this->_facebook = new Facebook(
    array(
    ‘appId’ => Kohana::config(‘facebook’)->app_id,
    ‘secret’ => Kohana::config(‘facebook’)->secret,
    ‘cookie’ => true, // enable optional cookie support
    )
    );

    $this->_session = $this->_facebook->getSession();

    try
    {
    $this->_me = $this->_facebook->api(‘/me’);
    }
    catch (FacebookApiException $e)
    {
    // Do nothing.
    }
    }

    public static function instance()
    {
    if ( ! isset(self::$_instance))
    Kohana_Facebook::$_instance = new Kohana_Facebook;

    return Kohana_Facebook::$_instance;
    }

    Przypominam, że za pierwszym razem $this->_me nie jest puste. Wiesz może dlaczego tak się dzieje? ;)

  8. krzysiek pisze:

    Chce stworzyc taki formularz rejestracji jak na http://aktywni.pl/, uzytkownik loguje sie na swoje konto na facebooku i przechodzi autoamtycznie do formularza rejestracji z wypelnionymi danymi pobranymi z facebooka. Wszystkie dane mam pobrane, ale w jaki sposób pobrac hasło?

  9. misio pisze:

    Haslo… chyba bylaby to niezla wtopa dostawac przy okazji kogos haslo, mail (a moze byc takie samo haslo), pomysl – nie bede czytal jakis dokumentajci bo facebook uwazan za miesjce dla durn***oof i nie bede integrowal nigdy z tym cudem. Ale nikt normalny nie rozdaje hasel obcym witrynom badz trzyma ich w postaci jawnej a nie hasha. Myslec.

  10. lukas pisze:

    witaj, mógłby ktoś wyjaśnić mi dokładniej jak wykonać takie coś pod cms webspell 4.2.2? Nie za bardzo rozumiem to pobieranie i sprawdzanie danych… Byłb bym wdzięczny za każdą pomoc. Mail: nanus@my-nomercy.pl

  11. mp3jazda pisze:

    Podany skrypt nie działa przy logowaniu z Conncect with facebook po zalogowaniu pojawia się błąd „Nieudana rejestracja nowego użytkownika”

  12. szmerak pisze:

    Gdzie masz stopke że to syntax highlighter?

  13. Prastary pisze:

    Witam,

    Problem jest taki:
    Baza podłączona, wszystko gra klikam „Połącz z facebookiem” i wyświetla mi logowanie na FB po czym po zalogowaniu i podaniu uprawnień otrzymuję komunikat: „Nieudana rejestracja nowego użytkownika!”, wylogowuje mnie z automatu z FB, a w logach „[data] OAuthException: Error validating access token: The session is invalid because the user logged out.” Czy ktoś może wie co an to poradzić?

Dodaj komentarz