Connectez votre application à Facebook grâce à Spring Social: Partie 1

Spring SocialSuite à la première release stable de Spring Social, je vais vous présenter comment utiliser ce module Spring pour connecter votre application à Facebook.

Spring Social est un module Spring qui va vous permettre de connecter votre application à plusieurs services en ligne, tel que les réseaux sociaux Facebook ou Twitter mais aussi des outils comme GitHub.

 

 

Cet extension de Spring se découpe en deux parties bien distinctes:

  • Spring Social Core, qui, comme son nom l’indique, est le coeur de l’extension
  • Divers plugins tel Spring Social Facebook, qui sont des extensions du core spécifique au service voulu.

Dans cet article, je vais me focaliser sur la connexion avec Facebook en présentant les diverses opérations à réaliser pour permettre à un utilisateur de se connecter à Facebook via votre application et rechercher ses amis.

Comme d’habitude, vous trouverez les sources de cet exemple dans le projet test « Personnes » (version 1.1.0) du blog (dans le module personnes-facebook) ;)

Sommaire

Créer une application Facebook

Dépendances Maven

Configuration de Spring Social

Connexion à Facebook

Récupérer le profil utilisateur

 

Créer une application Facebook


Afin de pouvoir utiliser l’API Facebook au sein de votre application, il vous faut d’abord créer une application Facebook.

Pour se faire, connectez vous à Facebook avec votre compte puis rendez vous à l’adresse suivante:

https://developers.facebook.com/

Ensuite cliquez sur l’onglet « Application » comme ci dessous:

Créer Application Facebook

Vous devez autoriser l’application « Développeur » à utiliser vos informations pour pouvoir créer votre application.

Une fois que vous avez donner votre autorisation, vous arrivez sur la page d’accueil du site pour développeur. Cliquez alors sur « Créer une application »:

Home Site Développeur

Remplissez alors les informations qui vous sont demandées. Facebook va vous demander votre numéro de téléphone afin de vérifier votre identité (et surtout d’avoir enfin votre numéro ;) ). Vous recevrez alors un sms de confirmation qu’il vous faudra entrer:

Confirmation Sms Facebook

Voila, vous êtes à présent sur la page de votre application. Les éléments importants de cette page sont:

  • App ID et App Secret: Notez bien ces paramètres donnés par Facebook. Ils seront utilisés dans votre application pour que Facebook la reconnaisse.
  • App Domain: Nom de domaine où sera hébergé l’application. Pour les tests, la valeur est localhost
  • Url du site dans l’onglet « Site web »: Comme nous hébergerons l’application comme un site web, il faut indiquer à Facebook l’url où il devra rediriger l’utilisateur.

Voici pour l’exemple, la page de l’application du blog:

Spring Social Application

Dépendances Maven


Maintenant que notre application Facebook est prête, attaquons nous à notre application Spring. La première chose à faire est de récupérer les dépendances nécessaire pour Spring Social.

Outre les dépendances Maven classique pour Spring, voici les dépendances du core de Spring social:

<dependency>
  <groupId>org.springframework.social</groupId>
  <artifactId>spring-social-core</artifactId>
  <version>1.0.0.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.social</groupId>
  <artifactId>spring-social-web</artifactId>
  <version>1.0.0.RELEASE</version>
</dependency>

Il faut ensuite ajouter le module spécifique à Facebook:

<dependency>
  <groupId>org.springframework.social</groupId>
  <artifactId>spring-social-facebook</artifactId>
  <version>1.0.0.RELEASE</version>
</dependency>

Enfin, Spring Social ayant besoin des éléments d’authentification de Spring, vous devez ajouter Spring Security à vos dépendances:

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-core</artifactId>
  <version>3.0.6.RELEASE</version>
</dependency>

 

Configuration de Spring Social


Notre environnement est prêt. Attaquons nous maintenant au vif du sujet et à la configuration de Spring Social.

Concrètement, Spring Social va établir une connexion entre notre application et Facebook grâce à son API. Spring Social présentera alors des objets Java classique qui masqueront toutes les communications entre Facebook et nous.

Pour s’authentifier à Facebook, il faut utiliser le protocole OAuth 2. Heureusement pour nous, tout cela est fait par Spring Social.

Une fois n’est pas coutume (surtout avec Spring :) ), la configuration XML est très facile et rapide. Il suffit de créer dans notre applicationContext.xml une ConnectionFactoryRegistry et de lui indiquer une connexion Facebook:

<bean id="connectionFactoryLocator"
  class="org.springframework.social.connect.support.ConnectionFactoryRegistry">
  <property name="connectionFactories">
    <list>
      <bean
  class="org.springframework.social.facebook.connect.FacebookConnectionFactory">
        <constructor-arg value="184498134952231" />
        <constructor-arg value="35d240a9d5eb81d0892763e59f540a0a" />
      </bean>
    </list>
  </property>
</bean>

La connexion Facebook est un bean du type FacebookConnectionFactory dont les deux paramètres sont:

  • L’application ID fournie par Facebook lors de la création de l’application Facebook
  • La clé secrète également fournie par Facebook

Voila pour la partie configuration, rapide comme prévu :). Tout le reste va se passer dans le code à proprement dit.

 

Connexion à Facebook


La première chose à faire pour pouvoir utiliser l’API Facebook et de se connecter à cette dernière. Le système d’authentification du réseau social est très simple:

  • Vous envoyez votre utilisateur sur le site Facebook pour qu’il accepte que l’application accède à ses données.
  • Une fois l’accord donné, Facebook renvoi l’utilisateur vers la page de votre site que vous avez configurer dans l’application Facebook. Ce renvoi contient un code qui va être utilisé tout au long de la durée de vie de la session.

La subtilité de ce système réside dans l’utilisation des « scopes » Facebook. En effet votre application ne pourra accéder qu’aux données dont vous avez demandé explicitement l’accès. Autrement dit, Facebook propose une multitude de scopes, chacun permettant de faire une action précise (voir les données du profil, voir les amis, poster un message, …).

La liste de ces scopes est définit dans ce lien:

https://developers.facebook.com/docs/reference/api/permissions/

Pour notre exemple, le scope « user_about_me » nous suffit. Il permet d’accéder à la plupart des données du profil (l’email à besoin du scope « email » en plus par exemple).

Spring Social fournit un object OAuth2Operations qui permet de construire l’url d’authentification où il faut rediriger l’utilisateur pour qu’il accepte l’application. Voici le code nécessaire pour construire l’url:

1
2
3
4
5
6
7
8
9
FacebookConnectionFactory connectionFactory = (FacebookConnectionFactory) connectionRepository
    .getConnectionFactory("facebook");
OAuth2Operations oauthOperations = connectionFactory
    .getOAuthOperations();
OAuth2Parameters oAuth2Parameters = new OAuth2Parameters();
oAuth2Parameters.setRedirectUri("http://localhost:8080/personnes-front");
oAuth2Parameters.setScope("user_about_me");
String authorizeUrl = oauthOperations.buildAuthorizeUrl(
    GrantType.AUTHORIZATION_CODE, oAuth2Parameters);

Voici l’explication du code:

  • 1. On récupère un objet FacebookConnectionFactory depuis la connectionFactory configurée dans l’applicationContext.xml
  • 3. On récupère depuis la connexion Facebook l’objet OAuth2Operations (protocole d’authentification utilisé par Facebook) qui va nous permettre de construire notre url
  • 5. On créé un OAuth2Parameters qui va encoder les paramètres pour notre url
  • 6. On ajoute l’url du site configuré lors de la création de l’application sur Facebook
  • 7. On ajoute le scope qui nous intéresse pour l’application (si vous en voulez plusieurs, séparés les par une virgule)
  • 8. On construit notre url

Une fois notre url créée, on redirige l’utilisateur vers celle ci. Il accepte de nous donner accès à ses informations et Facebook nous redirige vers notre url http://localhost:8080/personnes-front/ avec un paramètre code comme celui-ci:

http://localhost:8080/personnes-front/?code=AQDnAW4lFmBtyBc5WJBD9B7Qsn7aR1yLtJvl7u
ZZZdauO1z84MpetYTNQyQZB4ipW1jzKgXit-CoeXFu4PAiuUMk12UOUP1APoMIAQJB96mtCXX0IXc-KXHN
Dsv48vMl6Xeba4QvIV7McuPX-5xFH-XhTPSsT_fTsv7YINTrDLt-0-Fidevc1tNN3bZeJ6drhkk#_=_

C’est ce paramètre qui nous intéresse pour la suite des opérations, récupérez le et gardez le précieusement, voici comment le récupérer avec JSF:

String accessToken = FacesContext.getCurrentInstance().getExternalContext()
   .getRequestParameterMap().get("code");

 

Récupérer le profil utilisateur


Ça y’est, nous somme connecté à Facebook :), dernière étape, récupérons le profil de l’utilisateur. Et vous allez voir que Spring Social est très bien fait (enfin, à mon sens ;) ) et que c’est très simple d’obtenir ces informations.

L’équipe Spring a créé un objet nommé Facebook et qui est un mapping entre des objets au sens Java et l’API xml de Facebook.

La première étape consiste donc à créer cet objet:

1
2
3
4
5
6
7
8
9
10
FacebookConnectionFactory connectionFactory = (FacebookConnectionFactory) connectionRepository
   .getConnectionFactory("facebook");
OAuth2Operations oauthOperations = connectionFactory
   .getOAuthOperations();
AccessGrant accessGrant = oauthOperations.exchangeForAccess(
   accessToken, "http://localhost:8080/personnes-front", null);
Connection<Facebook> connection = connectionFactory
   .createConnection(accessGrant);
Facebook facebook = (Facebook) (connection != null ? connection
   .getApi() : new FacebookTemplate());

Voici l’explication de ce code:

  •  1. Comme dans le code précédent, on récupère une FacebookConnectionFactory
  • 3. Une nouvelle fois, on communique avec le protocole OAuth 2, donc on créé son objet correspondant
  • 5. Nous allons nous servir du code donné par Facebook lorsque l’on s’est connecté (la variable accessToken). Celui ci va être utilisé pour créer un objet contenant nos permissions grâce à la méthode exchangeForAccess. Cette méthode prend en paramètre le code et l’url où Facebook nous a redirigé
  • 7. Grâce à notre objet créé juste au dessus, nous créons une connexion à Facebook
  • 9. Enfin, si notre connexion est établie, nous récupérons notre objet Facebook qui va nous servir dans la suite de l’exemple

Tout ce que vous voulez faire ou presque va passer par cet objet Facebook. Il fournit une méthode par type d’opération que l’on souhaite réaliser (friendOperations pour les manipulations d’amis, feedOperations pour les opérations de flux, etc).

La méthode qui nous intéresse pour afficher les données de notre profil est userOperations.

La ligne de code qui nous permet de récupérer le profil de l’utilisateur est la suivante:

FacebookProfile facebookProfile = facebook.userOperations()
   .getUserProfile();

La variable « facebook » étant notre objet Facebook.

L’objet que nous obtenons est du type FacebookProfile est il contient toutes les informations que l’on peut avoir sur un utilisateur (en fonction des scopes utilisés bien sur ;) ). Par exemple, avec les méthodes suivantes:

  • getFirstName() pour obtenir le prénom
  • getLastName() pour obtenir le nom
  • getLink() pour obtenir le lien vers le profil de l’utilisateur
  • getId() pour obtenir son identifiant Facebook

 

Voila pour la première partie de la présentation de Spring Social. Dans la seconde partie, je vous présenterez plus en détail ce qu’il est possible de faire avec l’objet Facebook en particulier.

En attendant, je vous invite à regarder dans le projet « Personnes » (version 1.1.0) et plus particulièrement le module personnes-facebook ;)

MAJ 08/10/2011: Venez découvrir la partie 2 de la présentation de Spring Social avec Facebook

 

Liens utiles:

Page développeur Facebook: https://developers.facebook.com/

Page spécifique aux scopes Facebook: https://developers.facebook.com/docs/reference/api/permissions/

Site officiel de Spring Social: http://www.springsource.org/spring-social