lundi 15 mars 2010

[SYMFONY][FACEBOOK] Proposer aux visiteurs de s'identifier en un simple clic : FACEBOOK CONNECT

Se connecter à un site en clic est si pratique ! Plus besoin pour vos utilisateurs de passer 2 minutes à remplir le formulaire d'inscription et d'aller cliquer sur lien recu dans l'email de confirmation bal bla !
On connaissait Open ID qui permettait déjà de faire ca, cependant, OpenId ca ne parle pas à grand monde alors que Facebook ! est completement et omiprésent sur le web.

Facebook pense à nous, developpeurs de sites 2.0, pour nous rendre cette tache possible.
Symfony pense à nous, développeurs fainéants, pour nous rendre cette tache facile et complete !

aussi avant d'installer notre fameux plugin, on doit avoir installé le plugin sfDoctrineGuard (marche aussi avec les autres version de sfGuard)
INSTALLEZ sfGuard AVANT D'INCLURE LE FACEBOOK CONNECT
Une fois que c'est fait, on installe le plugin sfFacebookConnect
Pour d'autres (plus amples) informations, vous pouvez vous rendre sur la page du Plugin sfFacebook





svn co http://svn.symfony-project.com/plugins/sfFacebookConnectPlugin/trunk sfFacebookConnectPlugin
Ensuite créer vous une application sur Facebook/developpers
Vous devez renseigner les champs suivants :
Connect Url : 
http://mon.url/  // doit finir par un slash
 Base Domain :
mon.url
ATTENTION : Ceci est choisi d'une certaine facon. Il faut plusieurs choses : que votre mon.url soit en ligne (pas de fichier particulier à inclure sur le site en ligne, Facebook va le pinger, c'est tout). Si vous voulez, comme moi, programmer et tester le plugin en local, vous pouvez modifier votre fichier hosts (qui se trouve ici sous linux : /etc/hosts) et rajoutant la ligne 127.0.0.1 local.mon.url
Ainsi, vous garderez votre accès internet pour votre site en ligne et vous aurez accès à votre site local avec l'adresse local.mon.url . Evidement, votre virtual host doit être fonctionnel mais ca je ne m'en fait pas pour vous.

Une fois l'application créer, on va faire en sorte que nos fichiers de configuration autorise le plugin à être utilisé :
Dans le fichier settings.yml, ajoutez sfFacebookConnectAuth à la ligne enabled_modules :

all:
  .settings:
    enabled_modules:      [default, sfGuardAuth, sfFacebookConnectAuth]
    login_module:           BasesfFacebookConnectAuthActions
    login_action:           executeAjaxSignin
Ensuite modifiez votre fichier app.yml :
all:
  facebook:
    api_key:  votre_api_key
    api_secret: votre_api_secret 
    api_id: votre_app_id
    redirect_after_connect: false
    redirect_after_connect_url: ''
    connect_signin_url: 'sfFacebookConnectAuth/signin'
    app_url: '/my-app'
    guard_adapter: ~
    js_framework: jQuery

  sf_guard_plugin:
    profile_class: sfGuardUserProfile
    profile_field_name: user_id
    profile_facebook_uid_name: facebook_uid
    profile_email_name: email
    profile_email_hash_name: email_hash

  facebook_connect:
    load_routing:     true
    user_permissions: [] 

Allez ensuite dans le fichier /plugins/sfDoctrineGuardPlugin/config/doctrine/schema.yml
Pour qu'on puisse stocker les informations de profil du nouvel utilisateur, il va falloir  une nouvelle table dans la base de données, la table sf_guard_user_profile et la lier avec la table sf_guard_user...
Voilà donc les modifications à apporter :


sfGuardUserProfile:
  tableName:     sf_guard_user_profile
  columns:
    user_id:          { type: integer(4), notnull: true }
    first_name:       { type: string(30) }
    last_name:        { type: string(30) }
    facebook_uid:     { type: string(20) }
    email:            { type: string(255) }
    email_hash:       { type: string(255) }
    birthday_date :   { type: string(255) }
    sex:          { type: string(255) }
    pic:          { type: string(255) }
    pic_small:          { type: string(255) }
    relationship_status : { type: string(255) }
    current_location  : { type: string(255) }
    activities  : { type: string(255) }
    interests  : { type: string(255) }
    music  : { type: string(255) }
    tv  : { type: string(255) }
    movies  : { type: string(255) }
    books  : { type: string(255) }
    local  : { type: string(255) }
    books  : { type: string(255) }
    website  : { type: string(255) }

  indexes:
    facebook_uid_index:
      fields: [facebook_uid]
      unique: true
    email_index:
      fields: [email]
      unique: true
    email_hash_index:
      fields: [email_hash]
      unique: true
  relations:
    sfGuardUser:
      type: one
      foreignType: one
      class: sfGuardUser
      local: user_id
      foreign: id
      onDelete: cascade
      foreignAlias: Profile
Evidement, il faut dire à Doctrine de construire la nouvelle table et les relations associées :
symfony Doctrine:build --all --and-load --no-confirmation
Allez ensuite dans /apps/frontend/lib/myUser.class.php
et faites étendre la classe
class myUser extends sfFacebookUser{}
Voilà, la configuration du plugin est finie.
 U T I L I S O N S   L E   M A I N T E N A N T  !
J'imagine et j'espère que vous utilisez un layout, avec Facebook Connect, l'utilisation du layout facilite grandement l'intégration du plugin.
Ouvre votre /apps/frontend/templates/layout.php
Insérez ces lignes dans la balise head:

<script type="text/javascript" src="/sfFacebookConnectPlugin/js/animation/animation.js"></script>
<?php use_helper('sfFacebookConnect'); ?>
<?php include_bottom_facebook_connect_script();?>

Ensuite, on veut proposer un lien à l'utilisateur pour se connecter en 1 clic à notre site.
On va donc vérifier que l'utilisateur n'est pas connecté au site pour lui proposer ce boutton :
Toujours dans layout, car c'est un élement que vraissemblablement, on veut voir sur toutes les pages :

<?php if (!$sf_user->isAuthenticated()) {
?>
     <fb:login-button v="2" size="medium">Se connecter avec Facebook</fb:login-button>
<?php
}else{
     echo "hello";
} ?>
A ce niveau là, un simple clic sur le bouton, vérifiera si l'utilisateur est déjà connecté à facebook, sinon il lui proposera d'entrer ses identifiants. S'il s'identifie correctement dans le formulaire facebook, il est alors immédiatement identifié sur votre site.
Et si l'on va voir dans la base de données, on voit qu'un nouvel utilisateur nommé Facebook-012345678 vient d'être créé et qu'il a aussi un profile.
Mais là, ( Suprise ! ho !) le profile est vierge. Seul l'uid est récupéré.


J'ai longtemps cherché la solution mais en fait ca parait logique. On ne sait pas a l'avance ce que vous voulez récupérer pour votre application et de base on dit que vous ne voulez seulement connecter un utilisateur.
Mais moi, je veux récupérer beaucoup plus de choses que cela, c'est pour cette raison que j'ai créé un modèle pour sf_guard_user_profile avec tous ces champs (sex, brithday_date etc...).


Pour faire ceci, vous pouvez suivre ce tuto : Récupérer les informations des utilisateurs FacebookConnect
http://www.symfony-project.org/more-with-symfony/1_4/fr/12-Developing-for-Facebook
http://blog.fruitsoftware.com/2010/01/facebook-connect-friends-et-autres-plaisirs/

Aucun commentaire:

Enregistrer un commentaire

Bonjour,