Integracja serwisu z Facebookiem po raz kolejny

O integracji z Facebookiem pisałem już nie raz. Od mojego ostatniego wpisu na ten temat (maj 2014) trochę się pozmieniało. Ze względu na sporą popularność poprzedniego wpisu (według GA) postanowiłem odświeżyć temat.

No to zaczynamy

Na wstępie utwórz aplikację na Facebooku. Żeby to zrobić twoje konto musi być zweryfikowane. Jak już potwierdzisz, ze ty to naprawdę ty ;) przejdź na stronę deweloperską i kliknij Create new App. Wyskoczy standardowe okienko, gdzie wpisuje się nazwę aplikacji. Następnie przechodzimy do bardziej szczegółowej edycji.

facebook-developers

Identyfikator aplikacji oraz App Secret będą potrzebne przy konfigurowaniu biblioteki, dane te nie powinny wpaść w niepowołane ręce – aplikacja będzie gromadziła w końcu dane osobowe.

Z zakładek znajdujących się z lewej strony wybierz Ustawienia i kliknij + Dodaj platformę. Z okienka wybierz „Strona internetowa”. Następnie wpisz adres URL do skryptu, w którym znajdzie się logowanie z Facebookiem. Istnieje możliwość logowania się z różnych podstron serwisu. W tym celu należy podać listę domen w polu App domains.

facebook-developers-ustawienia

Integrowanie z naszym serwisem

Dla potrzeb stron www Facebook udostępnia JavaScript SDK oraz PHP SDK. Ja omówię wykorzystanie PHP SDK, który można pobrać stąd.

Przed czytaniem dalszej części pobierz cały kod. Większość plików pochodzi z Composer i SDK, a więc skupie się tylko na 3 plikach napisanych przeze mnie.

src/FacebookApi.php

<?php
namespace LukaszSocha\DemoFB;

/**
 * Class FacebookApi
 * @package LukaszSocha\DemoFB
 * @author Łukasz Socha <kontakt@lukasz-socha.pl>
 * @licence http://opensource.org/licenses/bsd-license.php
 */
class FacebookApi{
    /**
     * @var string ID aplikacji
     */
    private $appId;
    /**
     * @var string Klucz secret do aplikacji
     */
    private $secret;
    /**
     * @var Facebook API
     */
    private $fbSdk;
    /**
     * @var array Lista praw dostępu. Pełna lista dostępna tutaj https://developers.facebook.com/docs/facebook-login/permissions
     */
    private $permissions=array();
    /**
     * @var string Adres URL na jaki przekieruje po zalogowaniu
     */
    private $callback;

    /**
     * @param string $appId
     * @param string $secret
     */
    public function __construct($appId, $secret)
    {
        $this->appId = $appId;
        $this->secret = $secret;
        $this->fbSdk=new \Facebook\Facebook(array('app_id' => $this->appId, 'app_secret' => $this->secret));
    }

    /**
     * @param array $permissions
     */
    public function setPermissions($permissions)
    {
        $this->permissions = $permissions;
    }

    /**
     * @param string $callback
     */
    public function setCallback($callback)
    {
        $this->callback = $callback;
    }

    /**
     * Zwraca access token, jeżeli istnieje
     * @return bool|string
     */
    public function getAccessToken() {
        if(!empty($_SESSION['facebook_access_token'])) {
            return $_SESSION['facebook_access_token'];
        }
        return false;
    }

    /**
     * Pobiera access token zalogowanego użytkownika
     * @return bool
     */
    public function login() {
        $helper = $this->fbSdk->getRedirectLoginHelper();
        try {
            $accessToken = $helper->getAccessToken();
        } catch(\Facebook\Exceptions\FacebookSDKException $e) {
            // There was an error communicating with Graph
            echo $e->getMessage();
            exit;
        }

        if (isset($accessToken)) {
            $_SESSION['facebook_access_token'] = (string) $accessToken;
            echo 'Successfully logged in!';
            exit;
        } elseif ($helper->getError()) {
            var_dump($helper->getError());
            var_dump($helper->getErrorCode());
            var_dump($helper->getErrorReason());
            var_dump($helper->getErrorDescription());
            exit;
        }
    }

    /**
     * Zwraca adres URL do zalogowania
     * @return string adres URL
     */
    public function getLoginUrl() {
        $helper = $this->fbSdk->getRedirectLoginHelper();
        return $helper->getLoginUrl($this->callback, $this->permissions);
    }

    /**
     * Zwraca tablicę z danymi użytkownika
     * @param string $param Informacje jakie mają byc pobrane z Facebooka
     * @return array Dane użytkownika
     */
    public function getUserData($param) {
        return $this->fbSdk->get($param, $this->getAccessToken());
    }
}

Facebook co jakiś czas aktualizuje API. Dlatego postanowiłem tym razem zamknąć wszystko w swojej klasie. Będzie łatwiej zaktualizować kod w razie nowych wersji API.

index.php

<?php
session_start();
$loader = include "vendor/autoload.php";
$fb = new \LukaszSocha\DemoFB\FacebookApi('appId', 'appSecret');
$fb->setPermissions(array('email', 'public_profile'));
$fb->setCallback('http://adres-url/after-login.php');

if ($fb->getAccessToken()) {
    // jeżeli zalogowany wyświetli danr
    $data = $fb->getUserData('me?fields=email, name');
    print_r($data->getDecodedBody());
} else {
    // jeżeli niezalogowany
    echo '<a href="' . $fb->getLoginUrl() . '">Zaloguj</a>';
}

W linii 3 ustawiam ID aplikacji oraz klucz secret. Niżej przekazuję do obiektu tablicę z uprawnieniami aplikacji. W linii 6 przekazuję adres URL do skryptu logowania.

If zaczynający się od linii 8 wyświetla dane użytkownika (o ile się zalogował) lub link do logowania. Metoda getDecodedBody() zwraca tablicę, więc przetworzenie danych (np. podczas logowania do serwisu www) nie jest problematyczne.

after-login.php

<?php
session_start();
$loader = include "vendor/autoload.php";
$fb = new \LukaszSocha\DemoFB\FacebookApi('appId', 'appSecret');
$fb->login();

W pliku tym wywołuję metodę login() z mojej klasy. W przypadku pomyślnego logowania metoda zapisuje do sesji access token dzięki, któremu można pobierać dane użytkownika.

Będę aktualizować wpis jak tylko zorientuję się, że Facebook znowu coś zmienia :). Liczę też na waszą czujność i informację w komentarzu.

Print Friendly, PDF & Email