• en
  • pl

Facebook

facebook-icon
Jak połączyć sesję Javascript z PHP w Facebook SDK 4.0

SDk Facebooka nigdy nie grzeszyły ani stabilnością, ani rozbudowaną dokumentacją. Zespół developerów FB próbuje jednak tą dziurę łatać w kolejnych wersjach. Ostatnia, czwarta wersja SDK ma już znamiona używalnego. Wprowadza kilka zmian, które ułatwiają wiele elementów, jednak w pierwszym momencie można pogubić się co, jak i dlaczego. Spróbujemy przybliżyć zmiany na podstawie przypadku, kiedy użytkownik loguje się za pomocą SDK Javascriptowego, a następnie nasz program ma za zadanie wykorzystać ciastko otworzone w ten sposób do wykonywania zapytań z pomocą PHP.

//These need to be updated, obviously
$fb_app_id = "xxxxxxxxxxxxxxxxxxx";
$fb_app_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

require_once( 'Facebook/FacebookSession.php' );
require_once( 'Facebook/FacebookRedirectLoginHelper.php' );
require_once( 'Facebook/FacebookRequest.php' );
require_once( 'Facebook/FacebookResponse.php' );
require_once( 'Facebook/FacebookSDKException.php' );
require_once( 'Facebook/FacebookRequestException.php' );
require_once( 'Facebook/FacebookOtherException.php' );
require_once( 'Facebook/FacebookAuthorizationException.php' );
require_once( 'Facebook/GraphObject.php' );
require_once( 'Facebook/GraphSessionInfo.php' );
require_once( 'Facebook/FacebookSignedRequestFromInputHelper.php' );
require_once( 'Facebook/FacebookJavaScriptLoginHelper.php' );
require_once( 'Facebook\HttpClients\FacebookHttpable.php' );
require_once( 'Facebook\HttpClients\FacebookCurlHttpClient.php' );
require_once( 'Facebook\HttpClients\FacebookCurl.php' );
require_once( 'Facebook\Entities\SignedRequest.php' );
require_once( 'Facebook\GraphUser.php' );

use Facebook\GraphUser;
use Facebook\FacebookRequest;
use Facebook\FacebookRequestException;
use Facebook\FacebookSession;
use Facebook\FacebookSignedRequestFromInputHelper;
use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\Entities\SignedRequest;
use Facebook\HttpClients\FacebookCurlHttpClient;
use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookCurl;

FacebookSession::setDefaultApplication($fb_app_id, $fb_app_secret);
$session = null;

//Starting new session to remember the token
session_start();

/* checking if facebook session token is available */
if ( !empty( $_SESSION["fb_token"] ) ) {
    try {
        $session = new FacebookSession( $_SESSION["fb_token"] );
        $session->validate();
    } catch (FacebookAuthorizationException $ex) {
        $session = null;
        $_SESSION["fb_token"] = NULL;
    }
} else {
    // getting token from js api/sdk
    $helper = new FacebookJavaScriptLoginHelper();

    try {
        $session = $helper->getSession();

        // creating new, long lived session. Js returns shortly living token
        $session = $session->getLongLivedSession();

        // remembering token for further usage
        $_SESSION["fb_token"] = $session->getToken();

    } catch (FacebookRequestException $ex) {
        // When Facebook returns an error
        $_SESSION["fb_token"] = NULL;
        echo $ex->getMessage();
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}

if ($session) {
    try {
        //getting user data
        $user_profile = (new FacebookRequest(
            $session, 'GET', '/me'
        ))->execute()->getGraphObject(GraphUser::className());

        //printing user data
        print_r( $user_profile );
    } catch (FacebookRequestException $e) {
        print_r($e->getMessage());
        return null;
    }
}

Sam kod powinien być zrozumiały, jedna trzeba zwrócić uwagę na kilka rzeczy. Token zwracany przez getLongLivedSession() nie jest zapisywany przez SDK, należy go zapamiętać własnoręcznie, i wykorzystać do utworzenia kolejne sesji. Inaczej przy kolejnym requescie tracimy możliwość wykonania zapytania do API facebooka.

Kod służący do zainicjowania SDK po stronie js wygląda następująco:

window.fbAsyncInit = function() {
	FB.init({
	  appId      : '<?php echo $fb_app_id; ?>',
	  xfbml      : true,
	  version    : 'v2.0',
	  cookie:true
	});
};

(function(d, s, id){
	 var js, fjs = d.getElementsByTagName(s)[0];
	 if (d.getElementById(id)) {return;}
	 js = d.createElement(s); js.id = id;
	 js.src = "//connect.facebook.net/en_US/sdk.js";
	 fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

Zwracamy uwage na cookie:true, co tworzy ciastko po stronie serwera i daje nam dostęp do sesji z poziomu PHP.

Najnowsza wersja SDK wymaga PHP w wersji minimum 5.3.

Powodzenia!

Facebook SDK 4.0
https://developers.facebook.com/docs/reference/php/4.0.0