Communiquer avec les services Google en Java

Demander un devis
Je souhaite télécharger le programme ou imprimer le programme
  • Imprimer

Utilisation des services de Google en Java

  1. Pourquoi utiliser les services Google ?
  2. Test du projet d’exemple
  3. Configuration du compte Google
  4. Intégration
    1. Intégration avec Maven
    2. Intégration dans un projet Java J2EE classique (Ant)
  5. Configuration
  6. SSO de Google
  7. Évolution
  8. Erreur possible
  9. Licence

1. Pourquoi utiliser les services Google ?

Nos utilisateurs souhaitent s'inscrire et se connecter le plus rapidement possible sur les services Internet. Des sites comme bitbucket et GrooveShark l'ont compris et proposent de se connecter ou de s’inscrire via le SSO de Google directement.
Il n'y a pas seulement le SSO de Google qui peut être intéressant, les interactions avec les services comme Drive et Calendar peuvent être utiles dans certain cas. Par exemple, Drive permet notamment de stocker des fichiers sur le compte de l'utilisateur et ainsi permettre à l'utilisateur de le modifier via son compte Drive.

Les services Google sont accessibles via un SDK fournis en Javascript, Python, Php, Java, … Le problème de ces SDKs est qu’il faut régulièrement taper les mêmes lignes de code (boilerplate code) ou encore qu’il est nécessaire de se préoccuper de certains désagréments par exemple la gestion du ‘Refresh Token’, la gestion des credentials, etc..

Pour éviter de réinventer la roue à chaque projet utilisant les services de Google, Matelli a créé une librairie écrite en Java qui permet d’utiliser le SSO (OAuth 2.0) et ainsi que les services Google Calendar et Drive. A l’origine, Matelli a développé cette librairie sur l’un de ses projets client, suite à son utilisation et l'engouement des utilisateurs finaux, nos développeurs l’ont simplifiée et l’ont rendue Open Source sur Github.

Pour vous faciliter la vie, nous mettons à votre disposition :

  • La librairie pour les services de Google en Open Source
  • Ce tutoriel vous permettant d'implémenter le SSO Google, les différents appels au Drive ainsi qu'au service Calendar.
  • Un projet d'exemple d'utilisation de notre librairie, disponible en ligne à l'adresse https://gservicematelli.appspot.com

Le code source de la librairie est ainsi disponible à l’adresse : https://github.com/matelli/GoogleService
Le code source du projet d’exemple est disponible à l’adresse : https://github.com/Matelli/GoogleService-Sample

 

2. Test du projet d’exemple

La librairie est disponible sur Github et un projet projet d’exemple afin de vous expliquer comment l'utiliser et l’intégrer par l’exemple.

Ce projet sample contient principalement :

  • Un exemple d’utilisation du SSO de Google
  • Diverses opérations sur le service Google Calendar (liste des évènements, insertion d’un nouveau calendrier, …) et de Google Drive (liste des fichiers, création d’un nouveau fichier ou dossier, …)
  • Une gestion du refresh token qui vous permet d'effectuer plusieurs opérations à la suite sur les services google ainsi que d'effectuer des opérations sur le compte de l'utilisateur sans qu’il ne soit pas connecté (utile pour la création de tâches planifiées)
  •  

    3. Configuration du compte Google

    Quelque soit le service google que l’on souhaite utiliser, Google nous oblige à créer un projet dans la console de développement Google afin de posséder un ClientId et ClientSecret, ces dernières sont des informations que nous allons ensuite insérer dans notre projet Java pour nous identifier auprès de Google.

    La marche à suivre est la suivante :
    1. Rendez-vous sur https://console.developers.google.com/
    2. Puis “Create Project“
      1. Définissez un “Project name” (nom qui identifiera notre projet dans la console Google)
      2. Ne modifiez pas le “Project Id”
    3. Dans “APIs & Auth” activez les services suivants :
      1. Drive API (Offre gratuite : 10,000,000 requests/day)
      2. Calendar API (Offre gratuite : 100,000 requests/day)
    4. Dans “Consent screen” définissez le nom de votre application, logo, … (cette partie sera visible par tous les utilisateurs lors de la demande d'autorisation)
    5. Dans “Credentials”, cliquez sur “Create new Client ID”
      1. Application type : Web application
      2. Authorized redirect URI : Toutes les CallBack Url de votre application (une url par ligne)

     image01

    Enfin, téléchargez le JSON, puis renommé le en “client_secret.json”.

     

    4. Intégration

    L'objectif est d'intégrer la librairie développée par Matelli dans votre projet Java. Nous vous présentons deux sortes d’intégrations soit avec Maven, soit un projet java J2EE classique avec Ant.

    Dans un premier temps, copier le package fr.matelli.googleService du projet d’exemple dans votre propre projet java. Puis selon l’intégration souhaitée regarder la partie qui vous intéresse.

    Intégration avec Maven

    Au préalable, vous devez posséder maven, dont voici un tutoriel qui vous explique comment l’installer http://maven-guide-fr.erwan-alliaume.com/maven-guide-fr/site/reference/installation.html Cependant, si vous utilisé Eclipse, je vous recommande d’utiliser le plugins Maven http://eclipse.org/m2e/download/

    Pour d’intégrer cette librairie dans votre projet Maven, ajouter les lignes suivantes dans votre pom.xml

<repositories>
     <repository>
         <id>GoogleService</id>
         <url>https://raw.github.com/Matelli/GoogleService/mvn-repo/ </url>
     </repository>
 </repositories>
 
 </dependencies>
     <dependency>
         <groupId>fr.matelli</groupId>
         <artifactId>MatelliGoogleService</artifactId>
         <version>0.1.1</version>
     </dependency>
 </dependencies>
 

Enfin, faites un “mvn clean install” afin d’importer les nouvelles dépendance.


Ajouter le fichier “client_secret.json” (fichier télécharger dans l’étape précédente) dans votre dossier “src/main/ressource/” de votre projet et créer un fichier xml nommé “matelli-googleservice-config.xml” dans le même dossier, ce fichier sera complété dans la partie “5. Configuration”.

Intégration dans un projet Java J2EE classique (Ant)

Afin d'utiliser cette librairie dans un projet qui ne se base pas sur Maven, veuillez vous rendre sur le dépôt de la librairie dans la partie “Version” du README.md (https://github.com/Matelli/GoogleService#version), sélectionner la version qui vous intéresse et télécharger le jar (ex : MatelliGoogleService-VERSION.jar)

Enfin, télécharger les archives des différents services que cette librairie utilise via les liens ci-dessous et importer seulement les jars qui correspondent à votre configuration (voir le fichier readme.html dans les différentes archives :

Import dans votre IDE :

  • Si vous êtes sous Eclipse : http://stackoverflow.com/a/3280384
  • Si vous êtes sous IntelliJ IDEA : http://stackoverflow.com/a/1051705

Ajouter le fichier “client_secret.json” (fichier télécharger dans l’étape précédente) dans votre dossier “war/” de votre projet de votre projet et créer un fichier xml nommé “matelli-googleservice-config.xml” dans le même dossier, ce fichier sera complété dans la partie “5. Configuration”.

 

5. Configuration

La librairie ira lire le fichier “client_secret.json” afin de récupérer le ClientID et le ClientSecret et ainsi identifier votre application auprès de Google afin d'interroger les services Google.

Pour fonctionner, notre librairie a besoin que vous la configuriez selon vos besoin :

  • Mettre à jour les scopes (les scopes correspondent aux différents droits que l’on souhaite disposer sur le compte de l’utilisateur) présents dans les différentes classes des services Google (facultatif, car la librairie demande une autorisation maximale sur le compte de l’utilisateur mais certains internautes peuvent être réticents si les autorisations demandent un accès administrateurs sur leur compte.
  • Définir l’url de base (exemple : http://localhost:8080/GoogleService) de votre application

Les points cités précédemment sont détaillés plus précisément ci-dessous :

Pour chacun des services de Google, nous devons spécifier les droits que nous voulons sur le compte de l’utilisateur, pour cela, nous devons modifier le fichier “matelli-googleservice-config.xml” afin de lui définir les droits voulus, par exemple :

<?xml version="1.0" encoding="UTF-8"?>
 <MatelliGoogleService>
 <host>http://gservicematelli.appspot.com</host>
     <service>
         <sso>
             <scopes>
                 <value>https://www.googleapis.com/auth/userinfo.email</value>
                 <value>https://www.googleapis.com/auth/userinfo.profile</value>
             </scopes>
         </sso>
         <drive>
             <scopes>
                 <value>https://www.googleapis.com/auth/drive</value>
             </scopes>
         </drive>
         <calendar>
             <scopes>
                 <value>https://www.googleapis.com/auth/calendar</value>
             </scopes>
         </calendar>
     </service>
 </MatelliGoogleService>

    Dans cet exemple on définie le scope "https://www.googleapis.com/auth/drive" qui correspond à un contrôle absolu sur le compte drive de l'utilisateur. Toutefois, si vos besoins se limitent seulement a de la consultation, ou de modifier les fichiers créés ou ouverts par votre application, … Il existe différents scopes qui sont présentés dans la documentation de google dont voici les liens : Puis, modifier la valeur de la variable “host” selon l’url de base de votre application.

     

    6. SSO de Google

    Afin d’intégrer le SSO de Google dans votre application, vous devez suivre une procédure prédéfinie dans les appels à Google afin d'interroger ces services. Pour utiliser le SSO de Google nous allons ajouter deux méthodes dans votre contrôleur, la première étant celle qui va générer l’url de callback pour Google, et la deuxième est celle qui recevra le code et l'échangera afin d’avoir un jeton d’accès. Tout ceci est expliqué ci-dessous avec un schéma qui provient de la documentation officielle de Google.

     image01

    (https://developers.google.com/accounts/docs/OAuth2WebServer?hl=FR)


    Dans un premier temps, il suffira de générer l’url qui vous permettra de rediriger l’utilisateur vers la page de demande d’autorisation des droits (liste des scopes), puis Google redirigera l’utilisateur vers la page définie en url de callback, le code ci-dessous permet d’effectuer cette opération :

 @RequestMapping(method = RequestMethod.GET)
 public String printHome(ModelMap model) throws Exception {
     // "/userinfo/login" : Url de callback pour google
     UserInfoService userInfo = new UserInfoService("/userinfo/login");
     model.addAttribute("authorizationUrlGoogle", userInfo.getAuthorizationUrl());
     return "userinfo/index";
 } 

userInfo.getAuthorizationUrl() : Générera une url pour la demande d’autorisation (voir étape E1 sur le schéma). 

    Après avoir cliqué sur le lien, l'utilisateur se retrouve sur une page de ce type (étape E2).

     image00

    Après avoir validé, google nous renvoi sur l'url de callback avec code d'autorisation (étape E3), ce code devra être échangé (étape E4) afin d'avoir un token (étape E5), le token qui en résulte sera utilisé afin de faire un appel à l'api de Google (étape E6), voici les étapes énoncées précédemment représentées sous la forme d'un code Java.

     @RequestMapping(value = "/login", method = RequestMethod.GET)
     public String printInfoUser(ModelMap model, HttpServletRequest request, HttpSession session) throws Exception {
         if (request.getParameter("code") != null) {
             //  "/userinfo/login" : URL de Callback
             UserInfoService userInfo = new UserInfoService("/userinfo/login");
    
             // "code" : Étant le code d’autorisation (voir l’étape E3 sur le schéma)
             userInfo.setAuthorizationCode(request.getParameter("code"));
    
             // Échange du code pour avoir un token (voir l’étape E4 et E5 sur le schéma)
             Credential credential = userInfo.exchangeCode();
    
             // Interrogation du service google (voir étape E6 sur le schéma)
             Userinfoplus user = userInfo.getUserInfo(credential);
             if (user != null && user.isVerifiedEmail()) {
                 session.setAttribute("user", user);
                 session.setAttribute("refreshToken", credential.getRefreshToken());
                 session.setAttribute("scopes", userInfo.getScopes());
                 return "redirect:/home";
             }
         }
         model.addAttribute("error", "Problèmes d'authentification");
         return printHome(model);
     } 

    Après ce code vous pouvez enregistrer et / ou effectuer la connexion de l'utilisateur grâce au information reçus par la méthode userinfo.getUserInfo().

     

    7. Évolution

    Si vous souhaitez ajouter un nouveau service ou bien améliorer cette librairie, tous les “Pull Request” sur Github sont les bienvenus.

     

    8. Erreur possible

    Lors de l’appel au service google, il peut vous arriver certaines erreurs, mais ne vous inquiétez pas la team Matelli est la pour vous expliquer les différents problèmes possibles, quand vous avez une erreur, une page comme celle ci-dessous s’affiche :

     image02

    Dans l’image ci-dessus, l’erreur “redirect_uri_mismatch” indique que l’url de Callback n’est pas renseignée dans la configuration du projet de la console Google (voir la partie “3. Configuration du compte Google”)

    “Error : Insufficient Permission”
    Cette erreur vous informe que les opérations que vous voulez faire nécessitent un droit (scope) plus élevé. Il faudra choisir un scope qui permet d'effectuer l’opération voulu sur le service Google (voir la partie “5.Configuration”)

     

    9. Licence

    image02 Ce tutoriel est mise à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 France.

 

.
X
 
 
 
 
 

You havecharacters left.