W dobie Facebook’a warto zainteresować się ułatwieniem dostępu – logowanie i rejestracja – do zasobów naszej strony z wykorzystaniem Facebook’a. Sama integracja od strony PHP jest banalnie prosta, ponieważ Facebook dostarcza nam gotową klasę z funkcjami i czytelną dokumentacją. W pierwszej kolejności należy stworzyć nową aplikację klikając w ten link. Ważne jest aby wpisać poprawny adres domeny, bo tylko z niego będą akceptowane odwołania. Warto od razu zapisać App ID/API Key oraz App Secret – te 2 wartości posłużą nam do uwierzytelnienia. Dodatkowo potrzebna nam będzie klasa, którą można pobrać z https://github.com/facebook/php-sdk .
Rejestracja
Facebook daje nam możliwość pobrania danych kontaktowych do przeciętnej rejestracji, tj. imię i nazwisko, adres mailowy czy miejsce zamieszkania. Utwórzmy plik fbreg.html w którym zamieśmy poniższy kod:
<iframe src="https://www.facebook.com/plugins/registration.php?
client_id=112884128818286& // nasz App ID
redirect_uri=http://example.pl/fbregister.php& // adres do przekierowania formularza
fields=name,birthday,gender,location,email" // pola które mają się znaleźć w formularzu
scrolling="auto"
frameborder="no"
style="border:none"
allowTransparency="true"
width="100%"
height="330">
</iframe>
Ramka, którą zamieściliśmy ma za zadanie wyświetlenie formularza rejestracyjnego – nic więcej. Wartość redirect_uri powinna być adresem przekierowania przeglądarki do naszego docelowego pliku – fbregister.php, zawartość pliku:
<?php
define('FACEBOOK_APP_ID', 'uzupelniami swoimi danymi');
define('FACEBOOK_SECRET', 'uzupelniamy swoimi danymi');
session_start();
function parse_signed_request($signed_request, $secret) {
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$sig = base64_url_decode($encoded_sig);
$data = json_decode(base64_url_decode($payload), true);
if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
error_log('Unknown algorithm. Expected HMAC-SHA256');
return null;
}
$expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
if ($sig !== $expected_sig) {
error_log('Bad Signed JSON signature!');
return null;
}
return $data;
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '-_', '+/'));
}
if ($_REQUEST) {
$response = parse_signed_request($_REQUEST['signed_request'], FACEBOOK_SECRET);
$_SESSION['form']['email'] = $uLogin['registration']['email'];
$uName = explode(" ", $uLogin['registration']['name']);
$_SESSION['form']['name'] = $uName[0];
$_SESSION['form']['fbid'] = $uLogin[user_id];
$_SESSION['form']['surname'] = $uName[count($uName)-1];
$uTown = explode(",", $uLogin['registration']['location']['name']);
$_SESSION['form']['town'] = $uTown[0];
header('Location: formularz.html');
}
} else {
die('Brak danych');
}
?>
Jak widać skrypt ma za zadanie zapisać dane potencjalnego użytkownika Facebooka do sesji, a po zakończeniu przekierować użytkownika do pliku formularz.html. Można się domyśleć, że formularz można automatycznie uzupełnić – na przykład imię – wstawiając w element value wartość <?php echo($_SESSION['form']['name']); ?> po uprzednim aktywowaniu sesji poprzez session_start(); . W sesji znajduje się także zmienna $fbid, której zadaniem jest przekazanie ID użytkownika. Warto zapisać tą wartość do bazy danych w tabeli z użytkownikowi.
Logowanie
Funkcjonuje podobnie jak rejestracja, z tym że pobieramy dane za pomocą metod Facebookowej klasy. Pełny kod zamieszczam poniżej.
<?php
require 'facebook.php'; // sciezka do facebookowej klasy
$facebook = new Facebook(array(
'appId' => 'nasz app id',
'secret' => 'nasz app secret',
));
$user = $facebook->getUser();
// user zwraca numer id aktualnie zalogowanego uzytkownika
if ($user)
{
// weryfikacja logowania, sprawdzanie czy w bazie znajduje sie taki facebookowy id
if($uResult)
header('Location: gotowe.html');
else
header('Location: facebook.html');
}
else
{
echo('<html><head><meta http-equiv="refresh" content="0; url='.$facebook->getLoginUrl().'"></head></html>'); // jesli nie ma zezwolenia na pobranie danych przekieruj na Facebook
}
?>
Do prawidłowego funkcjonowania skryptu fblogin.php wymagana jest specjalna kolumna w bazie danych – fbid. Do zmiennej $user zapisywany jest numer ID użytkownika Facebook. Jeśli Facebook nie zwróci tej wartości skrypt przekieruje go na stronę potwierdzenia. Tak więc logowanie odbywa się nie na podstawie hasła, a numeru ID użytkownika. W pliku fblogin.php nie zawarłem funkcji porównywania numeru ID z tym co mamy w bazie z powodu rozbieżności w strukturach.