Dans ce tutoriel je vous propose de découvrir comment mettre en place la fonction Se connecter avec facebook. Avant de se lancer tête baisser dans le code il est important de comprendre comment va fonctionner la communication avec Facebook :

  • L'utilisateur va cliquer sur le bouton "Se connecter avec Facebook"
  • Il accepte ou refuse la liste des permissions demandées
  • Il est redirigé sur le site avec un code
  • On va convertir ce code en token d'accès
  • On va utiliser ce token d'accès pour appeller l'api /me et obtenir les informations de l'utilisateur

Installer le SDK

Heureusement pour nous facebook propose un SDK pour PHP. Pour l'installer on va choisir la méthode moderne et l'ajouter à notre composer.

"require" : {
    "facebook/php-sdk-v4" : "4.0.*"
}

Et on lance un petit

composer update

Ce qui permettra d'installer les librairies nécessaires à l'utilisation du SDK Facebook. Pour finir on va donc charger l'autoloader de composer dans notre fichier php.

require 'vendor/autoload.php';
session_start(); // Le SDK nécessite l'utilisation de la session

Utilisation du SDK

Pour pouvoir utiliser le SDK Facebook on va avoir besoin de 2 informations importantes : l'AppID etl'AppSecret. Pour obtenir ces 2 codes il faudra commencer par créer une application sur Facebook Developers et configurer le champs App Domains pour qu'il corresponde au nom de domaine de votre site.

Pour commencer on va générer le lien permettant d'accepter les permissions.

// Permet de définir l'AppID / Secret pour le reste des class
FacebookSession::setDefaultApplication(APP_ID, APP_SECRET);
$helper = new FacebookRedirectLoginHelper('http://mondomaine.fr/login.php');
echo $helper->getLoginUrl(['email']);

La fonction getLoginUrl() permet d'obtenir l'URL de redirection vers facebook. Elle prend en premier paramètre un tableau contenant la liste des permissions à demander.
Maintenant, il nous faut traiter le retour de Facebook.

// Lors du retour Facebook passera un code dans l'url
$session = $helper->getSessionFromRedirect();
// On récupère un objet FacebookSession que l'on pourra utiliser dans nos requêtes
$request = new FacebookRequest($session, 'GET', '/me');
$user = $request->execute()->getGraphObject('Facebook\GraphUser');
echo 'ID Facebook : ' . $user->getId(); 
echo 'Email : ' . $user->getEmail(); 

Et voila le tour est joué vous avez dans $user un objet GraphUser qui vous permet d'obtenir les informations de l'utilisateur.

Pour aller plus loin

Histoire de ne pas se répéter à chaque application on pourra créer une classe pour gérer la connexion facebook.

<?php

namespace App\Facebook;

use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookSession;

class FacebookConnect {

    private $appId;
    private $appSecret;

    /**
     * @param $appId Facebook Application ID
     * @param $appSecret Facebook Application secret
     */
    function __construct($appId, $appSecret){
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }

    /**
     * @param $redirect_url
     * @return string|Facebook\GraphUser Login URL or GraphUser
     */
    function connect($redirect_url){
        FacebookSession::setDefaultApplication($this->appId, $this->appSecret);
        $helper = new FacebookRedirectLoginHelper($redirect_url);
        if(isset($_SESSION) && isset($_SESSION['fb_token'])){
            $session = new FacebookSession($_SESSION['fb_token']);
        }else{
            $session = $helper->getSessionFromRedirect();
        }
        if($session){
            try{
                $_SESSION['fb_token'] = $session->getToken();
                $request = new FacebookRequest($session, 'GET', '/me');
                $profile = $request->execute()->getGraphObject('Facebook\GraphUser');
                if($profile->getEmail() === null){
                    throw new \Exception('L\'email n\'est pas disponible');
                }
                return $profile;
            }catch (\Exception $e){
                unset($_SESSION['fb_token']);
                return $helper->getReRequestUrl(['email']);
            }
        }else{
            return $helper->getLoginUrl(['email']);
        }
    }

}