Tutos & Astuces

FOSFacebookBundle & FOSUserBundle : Installation et configuration pas à pas

De plus en plus de sites souhaitent intégrer une connexion via Facebook pour faciliter l’inscription de l’utilisateur. Le mieux est d’utiliser un facebook bundle adapté. Sur Symfony2, FOSFacebookBundle, combiné à FOSUserBundle, rempli parfaitement...

De plus en plus de sites souhaitent intégrer une connexion via Facebook pour faciliter l’inscription de l’utilisateur. Le mieux est d’utiliser un facebook bundle adapté.
Sur Symfony2, FOSFacebookBundle, combiné à FOSUserBundle, rempli parfaitement son rôle.

Les documentations de ces bundles sont très complètes, mais malgré ça, pas mal de personnes se retrouvent très vite perdus. Je vais donc vous exposer ma façon de faire pas à pas. N’hésitez pas à commenter l’article si vous avez des compléments à apporter ! 😉

Dans cet article nous travaillerons sur Symfony2.1, Doctrine et composer pour la gestion des dépendances.

Configuration de FOSUserBundle

Je vais être assez rapide sur cette étape, la documentation vous fourni déjà toutes les informations nécessaires, je m’attarde sur les parties que nous réutiliseront par la suite.

Pour l’installation du bundle, suivez les étapes de cette page.

Une fois le bundle installé, nous allons faire hériter notre UserBundle par celui de FOS :

// src/My/UserBundle/MyUserBundle.php
<?php

namespace My\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

Cela nous permettra plus tard de modifier facilement le template de connexion pour ajouter notre facebook connect.

Création d’une application sur Facebook

Avant de continuer le développement sur Symfony, nous avons d’abord besoin d’avoir une application Facebook pour mettre en place notre FacebookConnect.
Pour ce faire, rendez-vous sur http://developers.facebook.com/ et authentifiez-vous.

Allez ensuite dans Applications, puis cliquez sur Créer une application, vous devriez voir apparaître un formulaire, remplissez-le de cette façon :

Facebook - Popup de création d'une application

Validez, vous devriez tomber sur la page des paramètres principaux de votre nouvelle application.
Ce n’est pas terminé, il reste encore quelques informations à compléter ! 🙂

Pour que votre application fonctionne sur votre site, vous devez spécifier les domaines à utiliser pour l’authentification Facebook dans le champs AppDomains.
Dans notre cas nous en mettrons qu’un seul, monsupersiteweb.fr qui permettra l’authentification facebook sur tous les sous-domaines possibles.

Ensuite, vous devez activer le Facebook Login, pour cela cliquez sur Website with Facebook Login et tapez l’adresse de base de votre site web sur le champ apparaissant. Dans notre cas il s’agit de http://monsupersiteweb.fr/.

Au final, votre page de paramètres devrait ressembler à ça :

Facebook - paramètres principaux d'une application

N’oubliez pas d’enregistrer les modifications ! 😛
Pour le reste des paramètres, je vous laisse découvrir leurs fonctionnements en consultant la documentation de Facebook ! 🙂

Attention pour les sites en local ! Préférez une adresse comme local.monsupersiteweb.fr ou dev.monsupersiteweb.fr pour que l’api Facebook fonctionne correctement !

Installation de FOSFacebookBundle

La méthode d’installation de FOSFacebookBundle va globalement suivre celle de la documentation sur github, je la ré-explique pour suivre avec l’application que nous venons de créer.

Commencez par la méthode habituelle, l’ajout du bundle via composer.json :

php composer.phar require friendsofsymfony/facebook-bundle # dev-master

Puis son ajout dans le fichier ApplicationKernel.php :

  // app/ApplicationKernel.php
  public function registerBundles()
  {
      return array(
          // ...
          new FOS\FacebookBundle\FOSFacebookBundle(),
          // ...
      );
  }

Ensuite, dans le fichier de configuration routing.yml, ajoutons les routes nécessaires :

# app/config/routing.yml
_security_check:
    pattern:  /login_facebook_check
_security_logout:
    pattern:  /logout

Configuration de l’application Facebook

Avant de continuer, ajoutons quelques informations concernant l’application dans notre fichier parameters.yml, cela peut être pratique si elles viennent a être modifiées dans le futur.

# app/config/parameters.yml
    api_facebook_id:      532147190133967 # ID de l’application/Clé de l’API
    api_facebook_secret:  7c43d4bca55690b16da9329be0d60ad2 # Clé secrète
    api_facebook_name:    http://apps.facebook.com/mon-super-site-web/ # App Namespace
    api_facebook_server:  http://monsupersiteweb.fr/ # URL du site

Les informations ci-dessus correspondent aux paramètres que l’on a vu précédemment  les commentaires vous permettrons de les retrouver facilement ! 😉
A noter pour les petits rigolos qui tenterons d’utiliser les codes de cette application, celle-ci n’existe plus ! 😛

Maintenant, importons les configurations requires du bundle dans config.yml :

 # app/config/config.yml
fos_facebook:
    file:   %kernel.root_dir%/../vendor/facebook/php-sdk/src/base_facebook.php # Emplacement du SDK Facebook, auto-installé lors de l'import du bundle
    alias:  facebook
    app_id: %api_facebook_id%
    secret: %api_facebook_secret%
    cookie: true
    permissions: [email, user_birthday, user_location]

A vous de changer les permissions, selon les informations que vous souhaitez récupérer, mais ne soyez pas trop gourmands ! 🙂

Attention ! Si vous utilisez la version 1.1.x, le paramètre file n’est plus utilisé, ne le mettez pas. Merci à Pyrrah pour l’astuce ! 🙂

Pour terminer, configurons notre fichier security.yml :

# app/config/security.yml
security:
    providers:
        fos_userbundle:
          id: fos_user.user_provider.username
        my_facebook_provider:
          id: my_user.facebook_provider # Notre provider, nous y viendrons par la suite.

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                login_path: /login
                check_path: /login_check

            fos_facebook:
                app_url: "%api_facebook_name%"
                server_url: "%api_facebook_server%"
                check_path: /login_facebook_check   # Pour éviter toute confusion avec le formulaire de base, j'ai spécifié une route pour Facebook
                provider: my_facebook_provider

            anonymous: true
            logout:
                path: /logout
                handlers: ["fos_facebook.logout_handler"]

Création du User UserProvider

Dans ce tutoriel, nous choisirons de créer notre propre UserProvider nous permettant de contrôler la façon de traiter les données Facebook lors de l’authentification.

Commençons d’abord par adapter notre entité User. Nous avons besoin d’une information principale, sont facebook_id, nous permettant de le retrouver lors de sa prochaine authentification via Facebook. Voici une classe Doctrine d’exemple inspirée de la doc officielle :

// src/My/UserBundle/Entity/User.php
<?php

namespace My\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="firstname", type="string", length=255)
     */
    protected $firstname;

    /**
     * @var string
     *
     * @ORM\Column(name="lastname", type="string", length=255)
     */
    protected $lastname;

    /**
     * @var string
     *
     * @ORM\Column(name="facebookId", type="string", length=255)
     */
    protected $facebookId;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getFirstname()
    {
        return $this->firstname;
    }

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

    /**
     * @return string
     */
    public function getLastname()
    {
        return $this->lastname;
    }

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

    /**
     * Get the full name of the user (first + last name)
     * @return string
     */
    public function getFullName()
    {
        return $this->getFirstName() . ' ' . $this->getLastname();
    }

    /**
     * @param string $facebookId
     * @return void
     */
    public function setFacebookId($facebookId)
    {
        $this->facebookId = $facebookId;
        $this->setUsername($facebookId);
        $this->salt = '';
    }

    /**
     * @return string
     */
    public function getFacebookId()
    {
        return $this->facebookId;
    }

    /**
     * @param Array
     */
    public function setFBData($fbdata) // C'est dans cette méthode que vous ajouterez vos informations
    {
        if (isset($fbdata['id'])) {
            $this->setFacebookId($fbdata['id']);
            $this->addRole('ROLE_FACEBOOK');
        }
        if (isset($fbdata['first_name'])) {
            $this->setFirstname($fbdata['first_name']);
        }
        if (isset($fbdata['last_name'])) {
            $this->setLastname($fbdata['last_name']);
        }
        if (isset($fbdata['email'])) {
            $this->setEmail($fbdata['email']);
        }
    }
}

Pour plus d’infos sur les données récupérables, allez faire un tour sur la doc concernant le Graph API de Facebook.

Une fois l’entité User préparée, nous allons mettre en place notre UserProvider qui va nous permettre de renvoyer ou de créer l’utilisateur de votre site une fois la connexion Facebook faite.

La classe d’exemple qui va suivre est globalement la même que celle de la doc officielle :

 // src/My/UserBundle/Security/User/Provider/FacebookProvider
<?php

namespace My\UserBundle\Security\User\Provider;

use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;

use \BaseFacebook;
use \FacebookApiException;

class FacebookProvider implements UserProviderInterface
{
    /**
     * @var \Facebook
     */
    protected $facebook;
    protected $userManager;
    protected $validator;

    public function __construct(BaseFacebook $facebook, $userManager, $validator)
    {
        $this->facebook = $facebook;
        $this->userManager = $userManager;
        $this->validator = $validator;
    }

    public function supportsClass($class)
    {
        return $this->userManager->supportsClass($class);
    }

    public function findUserByFbId($fbId)
    {
        return $this->userManager->findUserBy(array('facebookId' => $fbId));
    }

    public function loadUserByUsername($username)
    {
        $user = $this->findUserByFbId($username);

        try {
            $fbdata = $this->facebook->api('/me');
        } catch (FacebookApiException $e) {
            throw new UsernameNotFoundException('The user is not authenticated on facebook');
            $fbdata = null;
        }

        if (!empty($fbdata)) {
            if (empty($user)) {
                $user = $this->userManager->createUser();
                $user->setEnabled(true);
                $user->setPassword('');

                $user->setFBData($fbdata); // Ici on passe les données Facebook à notre classe User afin de la mettre à jour
            }

            if (count($this->validator->validate($user, 'Facebook'))) {
                throw new UsernameNotFoundException('The facebook user could not be stored');
            }
            $this->userManager->updateUser($user);
        }

        if (empty($user)) {
            throw new UsernameNotFoundException('The user is not authenticated on facebook');
        }

        return $user;
    }

    public function refreshUser(UserInterface $user)
    {
        if (!$this->supportsClass(get_class($user)) || !$user->getFacebookId()) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
        }

        return $this->loadUserByUsername($user->getFacebookId());
    }
}

Déclarons ce provider en tant que service :

<!-- Resources/config/services.xml -->
    <parameters>
        <parameter key="my_user.facebook_provider.class">My\UserBundle\Security\User\Provider\FacebookProvider</parameter>
    </parameters>

    <services>
        <!-- Facebook provider -->
        <service id="my_user.facebook_provider" class="%my_user.facebook_provider.class%">
            <argument type="service" id="fos_facebook.api" />
            <argument type="service" id="fos_user.user_manager" />
            <argument type="service" id="validator" />
            <argument type="service" id="service_container" />
            <argument>%fos_user.model.user.class%</argument>
        </service>
    </services>

Si vous êtes curieux, vous pouvez allez voir à quoi sert un UserProvider ici. 😉

Intégration de Facebook sur le layout

Voilà c’est tout pour l’arrière plan, vous suivez encore ? Allez il ne reste plus qu’à mettre le bouton FBConnect ! 😀

Commençons par inclure le script Facebook nécessaire :

<!-- app/Resources/views/base.html.twig -->
<html xmlns:fb="http://www.facebook.com/2008/fbml">
    <body>
        {{ facebook_initialize({'xfbml': true, 'culture': 'fr_FR', 'fbAsyncInit': 'onFbInit();'}) }}
        <script type="text/javascript" > // Script for FOSFacebookBundle
        function goLogIn(){
            window.location = "{{ path('_security_check') }}";
        }

        function onFbInit() {
            if (typeof(FB) != 'undefined' && FB != null ) {
                FB.Event.subscribe('auth.statusChange', function(response) {
                    if (response.session || response.authResponse) {
                        setTimeout(goLogIn, 50);
                    } else {
                        window.location = "{{ path('_security_logout') }}";
                    }
                });
            }
        }
        </script>
    </body>
</html>

Et vous pouvez ensuite intégrer le bouton facebook ou vous le souhaitez en utilisant ce code :

{{ facebook_login_button({'autologoutlink': false}) }}

Note : autologoutlink est à false car la déconnexion n’est pas nécessaire via Facebook pour cette méthode.

Conclusion

A ce stade vous devriez pouvoir à la fois vous connecter de façon classique via le formulaire, et faire un Facebook Connect sans soucis ! 🙂

L’intérêt de cette méthode, c’est qu’elle vous permet de rester détaché de l’application Facebook.
Elle ne sert ici que de passerelle pour récupérer les informations et authentifier l’utilisateur.
Par exemple, si l’utilisateur se déconnecte manuellement, cela ne le virera pas de son compte Facebook! 😀
Ce qui est le cas malheureusement sur certains sites…

J’espère que cette article, bien qu’un peu long, vous facilitera la tache, si vous rencontrez un problème en suivant cette méthode, n’hésitez pas à m’en faire part par commentaires ! 😉

Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
  • thomas

    Comment ensuite peux t’on récupérer des informations sur le user ? Genre date d’anniversaire, ville etc …

    • Soullivaneuh

      Tu as les infos dans la variable $fbdata de la fonction setFBData pour cet exemple.

      C’est un tableau de donnés si je ne me trompe pas, donc avec les bonnes autorisations tu devrais avoir ce que tu veux ! 😉
      Pour des infos plus avancés, comme récupérer des photos ou les amis, il faut jouer avec l’api du Facebook SDK, la par contre tu devrais regarder la doc officielle de Facebook !

      Bon dèv ! 🙂

    • Soullivaneuh

      Tu as les infos dans la variable $fbdata de la fonction setFBData pour cet exemple.

      C’est un tableau de donnés si je ne me trompe pas, donc avec les bonnes autorisations tu devrais avoir ce que tu veux ! 😉

      Pour des infos plus avancées, comme récupérer des photos ou les amis, il faut jouer avec l’api du Facebook SDK, la par contre tu devrais regarder la doc officielle de Facebook !

      Bon dèv ! 🙂

  • Matista19

    Ouai c’est de la bombe ce tuto !! merci en tous cas ! sinon moi aussi comme thomas j’ai besoin de récupérer les photos des utilisateursn en plus du pseudo, anniversaire, mail 🙂

    • Soullivaneuh

      Ravi qu’il te plaise ! 🙂

      Sinon même réponse, les infos sont normalement stockées sous forme de tableau.

      Après pour des infos supplémentaires comme les photos, il faut paramétrer ton appli pour demander l’autorisation à l’utilisateur.

      Je vais voir pour rajouter une demo à cet article quand j’aurai un peu de temps ! 😉

      • Matista19

        D’accord !! Merci pour les infos ! Mais je viens de voir sur l’appli de facebook il disent qu’il faut un acces_token pour récupérer les infos comme les photos, amis… Mais le probleme c’est que je sais pas comment le gérer avec symfony2 :)! Si tu a des infos sur ce sujet je suis preneur 🙂

        • Soullivaneuh

          L’access_token n’est pas directement gérer par FOSUserBundle ?
          Je pense que tu peux le recup via le sdk FB ou le bundle, faudrait regarder les sources de mémoire je ne sais pas t’en dire plus…

          Prestashop je connai mais jamais utilisé, pour les autres posts sur Symfony, je suis un peu pris par le temps en ce moment mais ça va venir !
          Si tu as des idées de sujets SF2 à traiter justement, hésite pas à m’en parler, par mail par exemple ! 😉

      • Merci !! Mais jai vu sur l’API de facebook qu’il faut un acces_token et je ne sais pas comment l’intégrer au niveau du bundle FOSFacebookbundle 🙁 sinon jsui preneur si tu a de nouveaux post pour symfony2 ou prestashop si tu connais a++

  • Malian

    Je viens de mettre en place le système et tout fonctionne correctement ! Merci à toi ! As-tu une idée de comment on peut totalement personnaliser le bouton facebook, parce que là il est tout pas beau et mes recherches ont été infructueuses. Merci

    • Soullivaneuh

      Salut Malian, content pour toi que ça fonctionne ! 😉

      Pour ta question, je n’ai pas pensé à ça mais si on regarde un peu là : https://github.com/FriendsOfSymfony/FOSFacebookBundle#include-the-login-button-in-your-templates

      On voit bien dans le javascript à mettre en place, la fonction goLogIn() est un handler pour quand on clique sur le bouton.

      Peut-être avec un code comme décrit ici, http://stackoverflow.com/a/6675642 tu devrais t’en sortir…

      Tiens moi au courant ! 😉

    • Ines Ben Dhafer

      Bonjour,
      je galère depuis un beau temps avec ce tuto, mais ça fonctionne toujours pas sur mon projet, pourriez-vous regarder avec moi le problème svp?

  • Guest

    Bonjour,

    Merci en tout cas pour ton tuto, j’ai cependant une question. J’aimerai au lieu d’update mon user dans le facebook provider qu’il revienne sur mon formulaire d’inscription pour compléter les infos manquantes. Quelle est la façon la plus propre pour faire cela ?

    Merci 🙂

  • Celta

    Bonjour,

    Merci pour ton tuto très utile 🙂

    Cependant j’ai une petite question, j’aimerai de mon cas qu’il ne crée pas de user automatiquement lorsqu’il est vide. Mais qu’il retourne sur mon formulaire d’inscription avec les données facebook.

    J’ai une autre question quand il update le user, il met à jour les données manquantes c’est à dire facebookid ?

    Merci

    • Soullivaneuh

      J’ai déjà cherché après ça sans succès… :/

      Je ne suis pas sur que cela soit facilement configurable, si tu trouves tiens moi au courant, en attendant tu peux toujours forcer une redirection vers son profil à compléter tant que l’utilisateur n’a pas remplit les infos nécessaires ! 😉

      Pour le updateUser, cette méthode va seulement s’occuper d’enregistrer les nouvelles informations dans ta base de données en faisant abstraction de ton ORM.

      Les données sont mise à jour quand tu appelles setFBData() de ta classe User.

      Regarde ici pour plus d’info sur le manager : https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/user_manager.md#updating-a-user-object

      Bon dèv ! 😉

  • Pyrrah

    Bonjour, très bon tuto

    Cependant, j’ai une erreur qui persiste et je ne trouve pas de solution…

    J’ai l’erreur suivante :

    InvalidConfigurationException: Unrecognized options « file » under « fos_facebook »

    Quelqu’un à la solution ? Merci par avance 🙂

  • J’ai oublié de préciser les numéros de versions :
    FOSFacebookBundle v1.1.0
    FOSUserBundle v1.3.1
    facebook/php-sdk v3.2.0 (à noter qu’elle semble deprecated, je ne sais pas si il y a un lien de cause à effet)

    Merci 🙂

    • Soullivaneuh

      Je viens de check la dernière version que je n’ai jamais utilisée, apparemment le paramètre « file » n’est plus utilisé, voir ici : https://github.com/FriendsOfSymfony/FOSFacebookBundle/blob/1.1.0/DependencyInjection/Configuration.php#L40

      Je n’ai pas cherché plus mais à mon avis le sdk doit être automatiquement trouvé maintenant…

      Essaye en enlevant ce paramètre et donne moi des nouvelles ! 🙂

      • Merci, c’était cela qui bloquait, il faut bien supprimer cette ligne ‘file ».
        Par ailleurs pour la partie « Configuration de l’application Facebook » du tuto, il est nécessaire de supprimer la ligne 27. La partie logout n’existe plus (https://github.com/FriendsOfSymfony/FOSFacebookBundle/commit/1b257670ca39240708c086cc98c550373e500ff1#L2L13)
        Autre remarque, le facebook/php-sdk a changé de chemin. Pour être sûr d’avoir la dernière version il faut mettre facebook/facebook-php-sdk. Je n’ai pas encore eu l’occasion de tester cette dernière version. (Plus d’infos ici: https://github.com/facebook/php-sdk)

        Je suis bloqué sur le tutoriel de nouveau… et me retrouve avec l’erreur suivante « MappingException: Class « MyAppUserBundleEntityUser » sub class of « FOSUserBundleEntityUser » is not a valid entity or mapped super class. »
        (Le cache a été vidé plusieurs fois, c’est bien déclaré dans AppKernel et le Entity est correct)

        Une idée ? 🙂

        • Soullivaneuh

          Peux-tu me faire un pastebin de ta classe ?

          • Voici l’adresse : http://pastebin.com/0j10MRp4

          • Problème résolu pour ceux et celles qui ont pu avoir la même erreur que moi. Il vous suffit d’ajout dans UserBundle/Entity/User.php devant la ligne 9 (class User extends BaseUser) l’argument suivant :

            /**
            * @ORMEntity
            */

            L’application fonctionne maintenant 🙂 Merci !

          • Soullivaneuh

            Super ! Bon dev ! 😉

  • Victor Delépine

    Bonsoir,

    Tout d’abord merci mille fois pour ce tutoriel qui m’est très utilie. Cependant j’ai une erreur dont je n’arrive pas à me débarasser :

    ServiceNotFoundException: The service « security.authentication.manager » has a dependency on a non-existent service « my_user.facebook_provider ».

    Quelqu’un a déjà résolu ce problème ?
    Merci !

    • Maxime

      Bonsoir,

      J’ai exactement le même problème que vous :/ Si vous trouvez la solution ça serait génial de la partager 🙂

      Merci

      • Victor Delépine

        Il suffit d’importer le service dans le config.yml :
        imports:
        – { resource: parameters.yml }
        – { resource: security.yml }
        – { resource: services.xml }

        En mettant le services.xml dans le même dossier. Je ne sais pas si c’est une méthode très propre mais ça a marché. Après il est possible qu’il te mette une erreur de handler pour le logout. Il faut commenter la ligne « handlers: [« fos_facebook.logout_handler »] » dans le security.yml et c’est bon.

        • Victor Delépine

          Et j’ai eu une erreur bizarre m’indiquant un problème de namespace pour le FacebookProvider.php, alors qu’il était correct. J’ai cherché un peu et j’ai trouvé que cela venait du fait que le code donné par @Soullivaneuh:disqus serait (apparement) encodé en UTF-8 (normal tu me diras) mais le fait d’utiliser de l’UTF-8 et pas de l’UTF-8 without BOM peut causer des erreurs dans certains cas. Du coup j’ai repris le FacebookProvider.php du github de FOSFacebookBundle et le problème s’est réglé.

          • Maxime

            Merci pour ton aide 🙂 Ca fonctionne .. presque. Désormais lorsque je me log, j’ai un « The user is not authenticated on facebook » qui apparaît Mon Provider me retourne bien mon ID Facebook mais mon findUserByFbId me retourne NULL. J’ai adapté mon services.xml en services.yml je me suis peut être trompé ..

            arguments:
            facebook: « @fos_facebook.api »
            userManager: « @fos_user.user_manager »
            validator: « @validator »
            container: « @service_container »

          • Victor Delépine

            Normalement tu dois avoir ça du coup :

            services:
            my.facebook.user:
            class: NameBundleSecurityUserProviderFacebookProvider
            arguments:
            facebook: « @fos_facebook.api »
            userManager: « @fos_user.user_manager »
            validator: « @validator »
            container: « @service_container »

          • Maxime

            Merci pour ta réponse. J’ai le même problème … Impossible de récupérer le feu vert lorsque je teste la présence du facebookId dans la fonction « findUserByFbId() »

          • Soullivaneuh

            Tu as toujours le soucis ?

            As-tu verifié la valeur du FbId demandé par rapport à ta BDD ?

          • Maxime

            Justement je n’ai rien dans ma bdd dans la table user :/

          • Maxime

            J’ai rentré mon ID facebook à la mano dans ma bdd, j’ai bien mon user qui m’est retourné. Cependant mon $fdata me renvoie NULL .. Je voudrais avoir une precision, pour être sur de bien avoir compris le truc .. Si je me loggue avec FBConnect, si mon FacebookId n’est pas présent il me crée un user c’est ça ?

          • Soullivaneuh

            Logiquement oui c’est tout l’intérêt !

            C’est censé le faire dans le loadUserByUserName() : $user = $this->userManager->createUser();

            Sur le coup je vois pas trop ou est ton problème je te conseille de regarder les docs officielles surtout si tu utilises la dernière version, apparemment ils ont bougé pas mal de choses…

            Je tenterai de faire un article par rapport à la dernière version si j’ai le temps…

          • Maxime

            Ok merci beaucoup en tout cas pour votre aide Soullivaneuh et Victor Delépine 🙂 Dernière idée, le problème ne pourrait pas venir de la conf. FB ?

            Sur Facebook :
            App Domain et Website with FB Login: localhost.local.fr

            Dans mon parameters.yml :
            api_facebook_name: http://apps.facebook.com/app-x/
            api_facebook_server: http://localhost.local.fr/x/

            Je vais reprendre à la lettre le FOSFacebookBundle du Git et si je trouve la solution je reviens vers vous 🙂 Bonne soirée (nuit)

          • Victor Delépine

            Pas de soucis ! Perso mon api_facebook_server c’est http:/localhost/monapp/

          • Maxime

            Et ton api_facebook_name ?

          • Victor Delépine

            http://apps.facebook.com/monapp/ mais les deux peuvent être différents il me semble. Tant que tu as rentré la bonne url sur le site de facebook

          • Julien

            Salut Maxime ! Alors des news ?
            Perso je m’en sors pas de mon cote ^^’

          • Julien

            En fait c’est que le commentaire « // src/XXXXXXX/UserBundle/Security/User/Provider/FacebookProvider » se trouve avant le tag <?php donc… ca va po ^^
            Il suffit donc de mettre le comment apres le tag et ca roule
            (Soullivaneuh, ca serait super si tu pouvais modifier le tuto avec les remarques des comments comme ca les nouveaux lecteurs n'ont pas besoin de lire tout ca 😀 )
            Surtout pour le fichier UserBundle/Resources/config/service.xml, qui se trouve bien dans
            Et il faut creer un fichier UserBundle/DependencyInjection/MyBundleExtension.php pour loader le fichier xml

            Et je vois dans les comments qu'il faut commenter quelques lignes pour que ca fonctionne mais ne perd on pas des fonctionalites ?..
            Comme je debute avec Symfony, je suis loin de pouvoir aprehender tout le parametrage ^^

            Mais en tous cas merci beaucoup pour ce tuto ^^

          • Soullivaneuh

            En effet j’ai mis ca pour se repérer mais il est au dessus du tag, il faut l’enlever ! 😉

        • Soullivaneuh

          Inclure ton services.yml de cette facon n’est pas la facon la plus propre, ton fichier xml devrait être dans ton bundle normalement, et dans ta classe Extension tu dois avoir quelque chose du genre : $loader->load(‘services.xml’);

          🙂

    • Don Carlight

      Même problème avec Symfony 2.1.10, j’ai essayé d’ajouter le paramètre « factories » dans « security » mais cela ne fonctionne pas, Symfony ne reconnais pas « factories »…. Quelqu’un a eu ce problème et a réussi à le solutionner?

  • Julien

    Voila alors j’ai tout suivi a la lettre. J’ai corrige les deux trois bugs par ci par la.
    Comme virer le parametre « file » et virer « fos_facebook.logout_handler ».
    Mais apres avoir clique sur le bouton login facebook et accepte que mon siteweb recupere des infos de mon compte facebook, je suis renvoye sur la page login avec  » The Facebook user could not be retrieved from the session. »

    J’ai ensuite essaye https://github.com/djepo/TemplateViergeSymfony2/
    qui est cense faire la meme chose que ce tuto Mais j’ai du faire les deux rectifs cite precedement (jai ajoute ces bugs au bug tracker) ET j’obtiens la meme error  » The Facebook user could not be retrieved from the session. »

    Donc ! Soit
    1) c’est mon compte facebook qui n’a pas les bons parametres, c’est pas les id parcequ’en cliquant sur « login » ca m’envoit bien sur mon appli facebook, c’est pas l’url de l’appli non plus.. Reste l’url de renvoit :
    Sur facebook c’est : Website with Facebook Login Site url :: http://localhost/monwebsitequimarchepas/

    2) c’est la maj des bundles (facebook) (avec ces histoires de fix) qui fait tout peter..

    Quelqu’un a un avis la dessus ?

    • Soullivaneuh

      Sur quel fichier ? Quelle ligne ?

      • Julien

        Pardon :
        1) Pour « file » : config.yml ligne 3
        # app/config/config.yml
        fos_facebook:
        file: %kernel.root_dir%/../vendor/facebook/php-sdk/src/base_facebook.php # Emplacement du SDK Facebook, auto-installé lors de l’import du bundle

        2) Pour « fos_facebook.logout_handler » security.yml ligne 27
        handlers: [« fos_facebook.logout_handler »]

        • Julien

          Ah mais l’erreur a l’air de venir de chez FOSFacebookBundle https://github.com/FriendsOfSymfony/FOSFacebookBundle/issues/234

          • Soullivaneuh

            hmm en effet, je ne peux pas vraiment plus pour toi, il faut suivre le ticket ou essayer sur une autre version…

          • Julien

            Donc en fait je le dis la bas, ca ne fonctionne pas seulement sur chrome localhost.. sur firefox cest ok.. bizarre mais ca me va ! ^^
            Merci beaucoup en tous cas !

          • Soullivaneuh

            Maintenant que tu le dis, j’avais eu le même soucis au boulot pour un ancien projet, mais je ne me souviens plus comment je l’ai résolu ou si je l’ai résolu tout court d’ailleurs… :p

            Tiens moi au courant si tu as de nouveau ! 😉

  • Tétard

    Bonjour, avant de vous présenter mon petit soucis je voulais vous dire merci pour ce tutoriel :).

    Après avoir suivi vos instructions, je rencontre un problème lors de la connexion avec Facebook. J’ai renseigné sur l’api Facebook l’apps domain « monsiteWeb.local et l’adresse « http://monsiteWeb.local/ »

    Je précise que je développe en local, j’accède à la page d’accueil de mon site via l’url « localhost/monsiteWeb/ »

    lorsque je clique sur mon bouton de connexion facebook, que je renseigne mes identifiants, et que je me connecte, j’ai un message d’erreur (dans firebug ) qui m’indique :

    « L’URL fournie n’est pas autorisée par la configuration de l’application.: Une ou plusieurs URL fournies ne sont pas autorisées par les paramètres de l’application. Elle(s) doi(ven)t correspondre à l’URL du site ou du Canevas, ou le domaine doit être un sous-domaine de l’un des domaines de l’application.  »

    Je pense que je n’ai pas saisi cette notion d’ AppDomain. Mais je ne vois pas d’ou mon erreur peut provenir. Auriez vous une idée ?

    par avance merci

  • Dave

    Bonjour,

    Avant toute choses, Merci pour ce tuto !

    J’ai suivi a la lettre et ça marche presque nickel.

    J’ai juste un petit soucis lors de la déconnexion. Je suis redirigé vers la page /login de mon site. Or cette page n’étant pas accessible ça me plante =/

    Quel est la meilleur solution pour forcer à rester sur la même page au logout ?

    Dans le fichier joint, vous pourrez remarquez que j’ai essayer d’activé use_referer, mais sans succès.

    Si quelqu’un a une idée, je suis preneur !
    Merci d’avance à tous ceux qui prendrons du temps pour mon problème, et encore un grand merci pour ce tuto !

  • Don Carlight

    Salut,

    Tu devrais ajouter au début du tuto les versions utilisées de Symfony, FOSUserBundle et FOSFacebookBundle.

    • Soullivaneuh

      Oui en effet, surtout qu’il y a eu pas mal de changement depuis…

      Je testerai à nouveau mon tuto sur une base propre, et je mettrai à jour l’article par la suite ! 😉

      • Don Carlight

        Quand ca? Héhé on attend avec impatience ton tuto pour les dernière versions de Symfony et FOSFacebookBundle!

  • Bastien Sevajol

    Une modif a eu lieu depuis: https://github.com/FriendsOfSymfony/FOSFacebookBundle/issues/221 (il faut retirer le paramètre « handlers: [« fos_facebook.logout_handler »] ») 😉

    • Soullivaneuh

      Juste le retirer ? Pas de remplacement ?

      Je n’ai pas réutiliser ce bundle depuis un moment, il faut que je revoit l’article…

      • Bastien Sevajol

        En tout cas j’ai du l’enlever pour que ça fonctionne chez moi. En tout cas merci pour l’article il m’a beaucoup aidé 😉

  • Valentin Lecourt

    Bonjour, excellent tuto,merci beaucoup ! Néanmoins je suis confronté à un problème que je ne sais résoudre: Comment rediriger l’utilisateur après expiration de la session facebook ( toute les 2h) ou encore comment empêcher l’expiration de session ?

    message d’erreur :Error validating access token: Session has expired at unix time 1370206800. The current unix time is 1370244197.

    Merci beaucoup !

  • Ines Ben Dhafer

    Bonjour,

    J’ai suivi cet excellent tuto à la lettre, sauf que j’ai ce message d’erreur qui s’affiche quand je clique sur le bouton de login de facebook:

    « L’URL fournie n’est pas autorisée par la configuration de l’application.: Une ou plusieurs URL fournies ne sont pas autorisées par les paramètres de l’application. Elle(s) doi(ven)t correspondre à l’URL du site ou du Canevas, ou le domaine doit être un sous-domaine de l’un des domaines de l’application.  »

    Je suis pas sur de mes paametres.yml

    Pourriez vous m’aider?

  • Franck Wilfried

    Chez moi le bouton facebook ne s affiche âs

  • Juan

    Salut, je suis espagnol…

    J’ai l’errro

    « J’ai contrôleur doit retourner une réponse (null donné). Avez-vous oublié d’ajouter une déclaration de retour quelque part dans votre contrôleur? »

    qui peut être le problème?

    security.yml

    firewalls:
    main:
    pattern: ^/
    form_login:
    provider: fos_userbundle
    csrf_provider: form.csrf_provider
    login_path: /login
    check_path: /login_check
    failure_path: /login/failure
    fos_facebook:

    app_url: « %api_facebook_name% »
    server_url: « %api_facebook_server% »
    check_path: /login_facebook_check
    provider: my_facebook_provider
    default_target_path: /
    logout:

    path: /logout

    target: /

    anonymous: true

    dev:
    pattern: ^/(_(profiler|wdt)|css|images|js)/

    security: false

  • Pingback: FOSFacebookBundle & FOSUserBundle : Install...()