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
Całość integracji można podzielić na dwa etapy:
- Rejestrację nowej aplikacji na Facebooku,
- Obsługę logowania po stronie witryny internetowej.
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.
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.
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.
Ostatnim elementem jest konfiguracja integracji serwisu z Facebookiem w zakładce „Integracja z Facebookiem”, gdzie należy określić:
- Stronę Ramki – link, pod którym będzie widoczna aplikacja na Facebooku,
- Adres Ramki – adres strony internetowej, pod którym znajduje się formularz logowania,
- Rodzaj ramki,
- Rozmiar Iframe.
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





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…
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.
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
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…
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).
Dzięki za informacje, poprawki w skrypcie zostały naniesione
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? ;)
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?
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.
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
Podany skrypt nie działa przy logowaniu z Conncect with facebook po zalogowaniu pojawia się błąd „Nieudana rejestracja nowego użytkownika”
Gdzie masz stopke że to syntax highlighter?
Wystarczy kliknąć znak zapytania nad listingiem kodu, obok przycisku „drukuj”.
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ć?