Je me décide enfin à écrire un tutoriel pour le développement d’une application Facebook. Et je dois dire que je me félicite de ne pas l’avoir fait avant :)

Pourquoi donc ? Et bien, l’API vient de changer de A à Z, fin-avril de cette année. Du coup, l’ancienne API (the old REST-API sur le wiki Facebook) est désormais obsolète et risque de ne plus être supportée. Écrire un tuto pour devoir le changer le mois suivant… Espérons que ce ne sera pas la même chose avec la nouvelle API ! J’ai donc nommée « Graph API »

Graph API : quoi de neuf ?

Ça a changé de A à Z. OK. Mais parlons un peu de cette nouvelle API. Du côté des développeurs, il faut savoir que cette API se base désormais sur OAuth 2.0 comme Yahoo, Google ou encore Twitter. Facebook commencerait t’il à s’ouvrir ?

Du côté utilisateur, une avancée, qui me plait beaucoup, est apparue lorsqu’on doit autoriser une application. On a ce genre de fenêtre désormais :

27198_395095088552_19292868552_3995134_1102397_n

Du coup, on sait à quoi on donne accès et on peut ainsi mieux contrôler ses données. Si une application de pronostic, par exemple, demande l’accès à toutes vos données, on peut légitiment se demander pourquoi…

Après ce petit état des lieux, entrons donc dans le vif du sujet !Ce premier article va vous permettre de mettre en place le système FBConnect sur votre site. Il va aussi vous permettre de commencer à prendre en main l’API, chose pas si facile que ça au premier abord. Le tutoriel s’oriente bien sûr vers le PHP :) FBConnect vous permet de récolter des informations sur l’utilisateur Facebook depuis votre propre serveur.

Téléchargeons le SDK PHP pour Facebook

Rendez vous donc sur le dépôt Git Facebook PHP SDK. Téléchargez simplement le fichier /src/facebook.php
Mettez le dans un dossier src/ à la racine de vos projets Facebook.

/projetsfb
/src
/test
/autre

Créez votre application sur Facebook

Pour que votre bouton FBConnect fonctionne, il vous faut créer une application Facebook. Pour cela, rendez vous donc sur « Créez une application Facebook ». Renseignez le nom de votre application et acceptez les termes des Condition d’utilisations de Facebook.
Une fois ceci fait, allez dans l’onglet « Connexion », et dans le champ Url Connect entrez le chemin du dossier contenant le index.php (exemple : http://localhost:8888/facebook/test/). Une fois ceci fait, gardez cet onglet ouvert et passons à la suite.

APERCU-APPLI

Téléchargez la base pour le FBConnect

Tout le code de ce tutoriel est présent sur un de mes repositories GitHub.

Téléchargez donc tout les fichiers (le bouton Download Source en haut à droite). Vous n’aurez qu’à toucher au fichier conf.php et au fichier index.php pour indiquer le chemin vers le fichier facebook.php. Le fichier facebook.php étant celui que vous avez téléchargé auparavant.

Je vais d’abord vous guider pour utiliser ceci puis j’expliquerai les fichiers. Ainsi, dans le fichier conf.php, entrez les données que vous trouverez dans l’administration de votre application sur Facebook (l’onglet que vous avez gardé ouvert).

define('APP_ID',        '');
define('APP_KEY',        '');
define('APP_SECRET',     '');
define('APP_URL',        'http://localhost:8888/api_test/facebook/tests/fbconnect3/index.php');

APP_ID         –>    l’Id de votre application
APP_KEY     –>    la clé API de votre application
APP_SECRET     –>    la clé secrète de votre application
APP_URL        –>    l’url de l’index.php de votre FBConnect

N’oubliez pas de régler le chemin pour votre facebook.php dans le index.php.

Une fois ceci fait, testez le script et tout devrait marcher. Nous verrons dans un autre billet comme ensuite intéragir avec Facebook (récupérer des infos ou mettre un statut à jour par exemple).

Si vous avez des erreurs, n’hésitez pas à aller voir à la fin de ce billet, j’en ai répertorié plusieurs. Si votre erreur n’est pas dans la liste, n’hésitez pas à poster sur le wiki de mon repository FBConnect.

Comprenons un peu le code

Maintenant que cela fonctionne (ou que vous avez une erreur non résolue ^^), décortiquons un peu le code fichier par fichier voulez vous ?

conf.php

Commençons par le fichier que vous avez modifié. Celui-ci contient donc :
- l’Id de votre application
- la clé publique de celle-ci
- la clé privée
- et enfin, l’url de votre application sur votre serveur.

Les clés servent à l’authentification via le protocole OAuth.
L’id de votre application, contribue aussi à cette authentification.
Enfin, l’url de celle-ci, vous sert pour les méthodes de login ou de logout.

Pour en finir avec ce fichier, j’y ai mit une méthode me permettant d’économiser quelques lignes lorsque je veux afficher des infos proprement.

C’en est fini pour le fichier de configuration. Passons à la suite.

index.php

Je vous épargne l’explication des deux premières lignes :) Passons à la création d’une instance pour la classe Facebook.
Si vous avez déjà utilisé une API s’appuyant sur OAuth, cette syntaxe doit vous être familière. On lui passe donc un tableau avec l’Id de votre application et votre clé secrète. Le troisième argument concerne la gestion des cookies. Mettez les à ‘true’, en effet, nous nous basons ensuite sur la méthode getSession() et celle-ci s’appuie sur l’utilisation de cookies. Si vous mettez à ‘false’ cela peut marcher, mais les urls seront franchement moches (Passage de l’Array séralizé).

Ensuite, $facebook->getSession() vous retourne les renseignements sur la session actuelle. Elle vous retourne donc :
- rien si l’utilisateur n’est pas connecté
-

 Array(
[access_token] => xxx
[expires] => 0
[secret] => xxx
[session_key] =>  xxx
[sig] => xxx
[uid] => xxx
)

si l’utilisateur est connecté. Ce sont donc les informations de la session en cours, ainsi que l’uid de l’utilisateur.

Ainsi, si $session existe, on pourra essayer de récupérer des informations sur l’utilisateur par la suite.

On met $fbme à null pour pouvoir la tester ensuite même si le test sur $session n’est pas ok.

Lorsque l’on fait if($session), on vérifie en fait la session est bien initialisé et donc si l’utilisateur est bien connecté.

Ensuite, si $session est ok, on récupère l’uid de l’utilisateur via la méthode getUser(). On pourrait aussi utiliser $session['uid'] bien entendu. C’est plus joli comme ça non ? :D
Puis on récupère toutes les informations auxquelles l’utilisateur nous a donné accès. Mais où y a t’il autorisé l’accès ? Vous verrez ça dans la suite ;)

Passons maintenant au fichier contenant le js.

js.php

Tout d’abord, l’extension est en .php pour pouvoir y insérer l’Id de notre application ainsi que l’url de notre serveur.
Attardons nous sur le code maintenant. Je préviens de suite, je ne suis pas un génie du js :) Ce code est fonctionnel, je vais plus ou moins vous l’expliquer. Si quelqu’un se sent de l’expliquer plus en profondeur je suis preneur :)
De plus, dans un billet qui suivra, j’expliquerai aussi le système de connexion via le php.

Si vous avez remarqué, on n’a encore demandé nulle part l’identification de l’utilisateur. Et bien, nous allons effectuer cela via ce fichier js.

Les premières lignes permettent un chargement asynchrone de la librairie JS SDK de Facebook. Du coup, ce lancement doit se situer après l’ouverture du tag <body>. Les lignes 2 à 19 font cela. Je vais tout de même vous en dire plus :)

Le FB.init permet l’initialisation de l’objet. Il a besoin de l’Id de votre application, de mettre les cookies à true aussi. L’option status doit aussi être à true. Cela vous permet de connaitre l’état de login (connecté/déconnecté) de l’utilisateur. Enfin, activez le xfbml pour permettre le parsage du XFBML (HTML spécial Facebook).
Ensuite, les FB.Event déclenchent les fonctions login ou logout. Celles-ci sont liées à un bouton spécial Facebook que nous verrons dans view.php. (login(); est appelé lorsque l’événement ‘auth.login’ est joué par exemple).

Les fonctions login et logout redirigent l’utilisateur vers l’url de votre application. Nous verrons dans le fichier view.php ce qui se passe en même temps.

Enfin, la fonction qui se déclenche en même temps que le FB.init inclut simplement la librairie JS SDK de Facebook dans la langue désirée (fr_FR ou en_US par exemple).

Nous avons donc fait le tour du js (y’en pas plus promis ;) , passons donc au dernier fichier.

view.php

Vous remarquez que l’en-tête est un peu bizarre. En effet, pour parser le XFBML il nous faut ajouter xmlns:fb= »http://www.facebook.com/2008/fbml ».

Le <div id= »fb-root »> est présent pour intégrer la librairie JS SDK de Facebook via le js.php.

Enfin, la seule chose réellement intéressante de ce fichier est le bouton <fb:login-button>. C’est celui-là qui sert à la connexion et à la déconnexion de l’utilisateur.

L’option « autologoutlink » est mise à true. Cela permet de transformer le bouton « Se connecter » en « Se déconnecter » lorsque l’utilisateur n’est plus connecté. Si vous mettez à false, vous devrez cacher le bouton via le js (et je vous ai promis qu’il n’y en aurait plus :)

Ensuite, l’option « perms » vous permet de définir ce dont vous avez besoin dans votre application. Vous n’aurez accès qu’à cela. Dans l’exemple nous avons accès à l’email de l’utilisateur, sa date d’anniversaire. Nous pouvons aussi mettre à jour son profil et publier quelque chose sur son mur. Les infos « de base » sont tout le temps accessibles (nom/prénom/ville/etc…).

Pour la liste des arguments pour « perms », je vous renvois à cette page du wiki.

facebook-small-logo

Et voilà, nous en avons fini de l’analyse du code :)

J’ai encore quelques petites choses à vous dire. Tout d’abord, sachez que lorsque que vous autorisez une application à accéder à votre mail, celle-ci y a accès en clair. Vous êtes prévenus :)

Voyons maintenant les erreurs rencontrées durant différents test. Je tiens à remercier _who qui a été assez bon dans la rencontre d’erreurs :) Et du coup, cela nous a permis de les résoudre. Ainsi :

Quelques erreurs ou les péripéties de _who !

Si vous avez :

(#2500) An active access token must be used to query information about the current user.

Cela provient surement du fait que vous tentez d’accéder à un utilisateur inactif ou inexistant. Vérifiez vos données (clés et id de l’appli). Cela arrive typiquement lorsque vous utilisez la méthode api(‘/me’) sans être connecté. Cette erreur est évité en ajoutant la vérification sur $session avant d’appeler la méthode api(‘/me’) (comme dans l’exemple fourni).

La deuxième erreur rencontré est une erreur sans détail :) Juste le mot erreur. Cela provient du fait que Facebook n’arrive pas à accéder à votre serveur distant. Cela peut par exemple venir du fait que votre routeur ne forward pas ou/et que les identifiants de connexion (clés et id) ne sont pas corrects.

Lorsque des erreurs seront rencontrées et résolues, je mettrais à jour cette partie.

Enfin, comme je l’ai déjà dit n’hésitez pas à écrire vos remarques/questions en commentaires de ce billet. Pour ce qui est des « bugs » je préfère que vous passiez via GitHub. Au pire, vous pouvez passer par les commentaires. Je ne répondrai pas aux questions par mail en revanche :)

Et la suite ?

Il y aura d’autres billets sur la nouvelle API de Facebook. Il y en aura un sur l’intégration d’une application sur la plateforme (via Iframe) et aussi un petit pour l’identification via PHP pour le FBConnect.

See you later ;)

Vous avez aimé ? Partagez !
  • Digg
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • Reddit
  • RSS


    ici
  1. Magicbob le Jeudi 10, 2010

    Bonne initiative. Je vais devoir me plonger dedans pour refaire le quizz Tout-Montpellier

  2. Alex le Jeudi 10, 2010

    oh merci l’ami.. Je cherche ce tuto depuis 3 jours et c’est pas simple de trouver des exemples et de comprendre leur wiki..
    Alex

  3. Colmea le Jeudi 10, 2010

    Excellent :)

    Votre travail a porté ses fruits.
    J’attends avec impatience les prochains articles ;)

  4. _who le Jeudi 10, 2010

    C’est plus ou moins loin d’être fini. J’continuerai d’accompagner Raph’ maintenant que j’attrape de plus en plus d’astuce pour ne pas se laisser ennuyer par Facebook Graph API à mesure que j’avance dans mes développements.

    J’apporterai conseil, astuce & ruse qui permettront à tout à chacun de mieux appréhender le développement et de savoir prendre des distances :)

    A une prochaine !

  5. Bubu le Jeudi 10, 2010

    Génial !! J’ai vraiment beaucoup de mal à comprendre leur wiki, non pas qu’il ne soit pas clair mais un petit exemple concret pour apprendre à utiliser les méthodes Graph API (et pas nécessairement à l’aide de cURL) auraient été les bienvenus !

    Merci pour ce tuto sur l’autorisation de l’appli, c’était ce que je cherchais à faire depuis un moment ! merci et à très vite pour la suite :)

  6. Tim le Jeudi 10, 2010

    Je vois pas que je suis pas le seul qui a passé du temps à déchiffrer tout ça ^^

    Pour les plus téméraires, j’ai un début de plugin pour pouvoir utiliser ce nouveau sdk dans symfony:
    http://github.com/tyx/zzFbSdkPlugin

    C’est pas documenté, c’est pas complet, mais ca fonctionne ;)

  7. R.kueny le Jeudi 10, 2010

    En effet j’y ai passé du temps :) Espérons que ça me servira longtemps ^^

    Pas mal ton début de plugin. Faut vraiment que je mette à fond sur symfony !

  8. Eric le Jeudi 10, 2010

    Est’il possible de combiner avec une application en flash (jeu) avec de l’action script comme ici http://www.facebook.com/home.php?sk=lf#!/pages/Saint-Paul/AgenceSolutioncom/140308969338015?ref=ts

  9. R.kueny le Jeudi 10, 2010

    Je ne comprends pas trop ta question Eric.

    Mettre du flash dans une appli Fb est très simple. Après je ne l’ai jamais fait (j’aime pas flash et il me le rend bien ^^)

  10. Nay le Jeudi 10, 2010

    Bonjour
    j’ai ajouté le code suivant:

    $session = $facebook->getSession();
    $fbme = null;

    if($session){
    print_t($session);
    try{
    $uid = $facebook->getUser();
    echo « uid= ».$uid;
    $fbme = $facebook->api(‘/me’);
    }catch(FacebookApiException $e){
    pre($e);
    }
    }
    print_t($_COOKIE);

    $friends = json_decode(file_get_contents(
    https://graph.facebook.com/me/friends?access_token=‘ .
    $session['access_token']), true);
    $friend_ids = array_keys($friends);

    echo file_get_contents(
    https://graph.facebook.com/me/friends?access_token=‘ .
    $session['access_token']);

    require(‘view.php’);

    =>votre tuto marche bien,
    le file_get_contents aussi
    Mais json_decode ne marche pas… (pourtant mon gestionnaire de site a bien installé JSON…)
    Savez vous ce qui pourrait clocher svp?

  11. Nay le Jeudi 10, 2010

    Bon pardon j’ai fait une errer le json-decode marche.

    Par contre j’ai le problème suivant en utilisant votre code:

    si cookie=true lors de l’appel de la classe facebook, j’observe que:
    si on se déconnecte de facebook, la session sur le site perso reste active (pas d’expiration du cookie)

    Donc j’ai essayé de mettre cookie = false, pour toujours verifier…
    et dans ce cas rien ne marche : le bouton fb:login marche correctement, mais je n’arrive jamais à récuper les infos user et le secuity token avec le php ($session n’est jamais définit).

    Comment faire pour que le code de votre index.php vérifie à chaque fois si on est connecté sur facebook? (en php, car les cookies je trouve un peu dangereux vu que c’est du côté du cient et non du serveur…, même avec un security token que l’on ne peux vérifier).

    En fait je voudrais qu’en se déconnectant de facebook, on se déconnecte aussi de mon site…

  12. R.kueny le Jeudi 10, 2010

    Il faut gérer avec les tokens. Je te regarde ça dans la semaine. Si tu y arrives entre temps n’hésite pas à poster ton code :)

  13. Clément le Jeudi 10, 2010

    Bonjour,
    Je me suis mis il y a quelques jours dans la réalisation d’applications facebook, avec déjà un certains nombre de connaissances en php et autres. Or je rencontre un problème quelque soit le script que j’utilise, c’est à dire que $facebook->getSession() me retourne toujours une variable NULL. Et ce, même si j’ai déjà accepté l’application…
    Avez-vous une idée de l’origine du problème ?
    Merci d’avance

  14. Nay le Jeudi 10, 2010

    Clément >>
    Verifie les fonction curl_init et json-decode sur ton serveur (il faut les installer CURL + JSON)

    Verifie les cookies de ton navigateur (fbs_…) et que tu as bien mis le javascript de FB dans ta page (test les … et voit si les boutons s’affichent, c’est le js qui gère les cookies)/ Pas de cookie pas de session à ce que j’ai compris

    J’ai eu le même problème du coup j’ai commencé à voir pour faire le get_session en php plutôt qu’en cookie… mais pas encore eu le temps de finir, c’est un peu brouillon et j’ai plus trop de temps.

    Je laisse R kueny te répondre plus en detail si besoin ;-)

  15. Nay le Jeudi 10, 2010

    il faut lire « test les fb:login (dans les balise html) et voit si les boutons s’affichent…

  16. R.kueny le Jeudi 10, 2010

    Tu as résolu ton soucis d’ailleurs Nay ?

    Pour clément, colle ton code dans un commentaire (utilise http://pastebin.com/ pour faire partager le code, plus lisible ^^)

  17. Nay le Jeudi 10, 2010

    Plus ou moins, en fait j’utilise les requetes https://graph.facebook.com/ pour obtenir les acces_token (AT) par le php ou les verifier, mais ca nécessite une iframe et un petit js pour récupérer l’AT qui est donné par FB: celui ci est dans une page de redirection sous la forme d’ancre (monsite.com#access_token=342….) et c’est impossible de le récupérer côté serveur!

    Du coup j’ai remplacé le get_session du sdk de facebook, et je conserve les AT dans la base de donnée (en fonction de l’id facebook).En cookie je ne garde plus que l’id facebook (pas très secrète) du client.

    Le seul problème c’est que si tu es connecté genre avec firefox avec un AT valide, et que ton id est dans le cookie de IExplorer, bah Iexplorer va obtenir un AT valide (celui dans la BDD grâce à firefox)…
    Mais bon d’un autre côté ca peux aussi permettre de savoir si quelqu’un se connecte ailleurs avec ton compte donc je vais peut-être le garder. Ma seule crainte c’est qu’on puisse modifier un cookie, mettre l’id fb dedans, et du coup avoir un accès quand la cible du hackeur est connectée… En gros va falloir que je rajoute un access token pour mon site aussi… Ou un traqueur de navigateur…
    J’ai aussi pensé à faire un historique des ip de connections au site pour que le client puisse vérifier si une autre ip se connecte à son compte (je voulais faire ca pour vérifier si qqn lisait mes mails y’a 5 ans)…
    Si tu as des critiques ou des conseils sur ces idées je suis tout ouïe :p

  18. Clément le Jeudi 10, 2010

    Bonjour,

    Merci beaucoup pour vos réponses !
    La solution était en fait très simple (ou pas =P) : j’utilisais en fait un hébergement gratuit avec un nom de domaine en .ueuo.com. Or cette adresse était bloquée par facebook dans le canvas.

    J’ai donc effectué une recherche pour trouver une solution, ce qui m’a conduit à utiliser un nom de domaine en .tk, avec redirection : le problème est que c’est une redirection iframe (je pense que le problème vient de là), et les variables $_GET n’étaient pas transmises. La session apparaissait donc toujours comme null.

    Merci encore de m’avoir répondu…

  19. Mes le Jeudi 10, 2010

    Bonjour à tous,

    J’ai suivi le tuto et utilisé les fichiers fournis par R. Kueny (d’ailleurs, un grand merci pour la simplicité du code). Toutefois, j’ai un petit souci !!! En exécutant mon application j’obtiens l’erreur suivante :
    [result:protected] => Array
    (
    [error_code] => 28
    [error] => Array
    (
    [message] => connect() timed out!
    [type] => CurlException
    )

    )

    [message:protected] => connect() timed out!
    [string:private] =>
    [code:protected] => 28
    [file:protected] => /www.mon-site.com/facebook/test/facebook.php
    [line:protected] => 622

    SVP, avez-vous une idée ???

  20. R.kueny le Jeudi 10, 2010

    Fait un pastebin de ton code, et partage l’url, là comme ça je peux pas trop te dire.
    http://pastebin.com/

  21. Mes le Jeudi 10, 2010

    voici le lien sur pastebin.com : http://pastebin.com/3uVuCdJf

    NB : j’ai repris exactement le même code que tu as mis en ligne et je n’ai modifié que le fichier config + le chemin du fichier facebook.php sur la page index.

    j’ai aussi le message suivant :

    Application temporairement indisponible
    Erreurs d’analyse :

    FBML Error (line 139): illegal tag « body » under « fb:canvas »

  22. adam le Jeudi 10, 2010

    Salut Kueny,

    Merci pour ce tuto mais pour moi ca fonctionne pas snif …..

    J’ai une erreure sur l’index ligne 8 et sur le fichier facebook.php ligne 20. Une idée géniale ?

    Merci d’avance

  23. R.kueny le Jeudi 10, 2010

    Bonjour Adam, peux tu me copier ces 2 lignes et me copier-coller l’erreur aussi ? :)

  24. VincentR le Jeudi 10, 2010

    Bonjour,

    J’ai suivi ton code, cela marche parfaitement cool.

    Par contre des que je veux utiliser la fonction getSession :
    $session = $facebook->getSession();

    j’ai un message d’erreur suivant : Fatal error: Call to undefined method Facebook::getSession()

    Quelqu’un a t’il une idée ?

    VincentR

  25. VincentR le Jeudi 10, 2010

    Trouvé en repassant au sdk 2.1.2

  26. R.kueny le Jeudi 10, 2010

    Pour le skd 3.0.0, la méthode getSession() n’existe plus. Il faut utiliser getUser()