Utilisation des API Google
Dans le cadre de mon appli jsf sur gae, j'ai à interagir avec le service de calendrier google. Voici les actions que j'ai menées pour installer et faire fonctionner le bousin:
Installation du client GDATA dans le référentiel MAVEN
$ mvn install:install-file -DgeneratePom=true -DgroupId=com.google.gdata -DartifactId=gdata-core -Dpackaging=jar -Dfile=gdata-core-1.0.jar -Dversion=1.0
$ mvn install:install-file -DgeneratePom=true -DgroupId=com.google.gdata -DartifactId=gdata-client -Dpackaging=jar -Dfile=gdata-client-1.0.jar -Dversion=1.0
$ mvn install:install-file -DgeneratePom=true -DgroupId=com.google.gdata -DartifactId=gdata-calendar -Dpackaging=jar -Dfile=gdata-calendar-2.0.jar -Dversion=2.0
Ajout dans le fichier pom.xml
<dependency> <groupId>com.google.gdata</groupId> <artifactId>gdata-core</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.google.gdata</groupId> <artifactId>gdata-client</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.google.gdata</groupId> <artifactId>gdata-calendar</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.google.collections</groupId> <artifactId>google-collections</artifactId> <version>1.0</version> </dependency>
Identification
La partie la plus subtile. Trois choix sont possibles, une authentification par token, par login/password et par openid. J'ai choisi de gérer le token car mon application va utiliser la gestion des comptes google.
J'ai choisi de créer une servlet qui fait les actions suivantes : Proposer une page qui redirige vers la connexion google, récupération du token et stockage en base pour chaque utilisateur.
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String tokenParameter = req.getParameter("token"); if (tokenParameter == null) { req.getRequestDispatcher("/faces/retreiveToken.xhtml").forward(req, resp); } else { try { //procedure google pour recuperer le token et le rendre permanent String onetimeUseToken = AuthSubUtil.getTokenFromReply(req.getQueryString()); String sessionToken = AuthSubUtil.exchangeForSessionToken(onetimeUseToken, null); Logger.getLogger(TokenServlet.class.getName()).log(Level.INFO, "Token recupéré"); UserManagedBean userManagedBean = (UserManagedBean) req.getSession(false).getAttribute("userManagedBean"); //assignation du token User user = userManagedBean.getUser(req); user.setToken(sessionToken); //persistence BusinessService<User> userService = new BusinessServiceImpl<User>(); userService.update(user, user.getId()); } catch (GeneralSecurityException ex) { Logger.getLogger(TokenServlet.class.getName()).log(Level.SEVERE, null, ex); } catch (AuthenticationException ex) { Logger.getLogger(TokenServlet.class.getName()).log(Level.SEVERE, null, ex); } } }
La page de connexion est assez simple :
<ui:composition template="./standardtpl.xhtml"> <ui:define name="content"> <h:form prependId="false"> <p>MyApp needs access to your Google Calendar account to read your Calendar feed. To authorize MyApp to access your account, <a href="#{userManagedBean.requestUrl}">Connexion sur google</a> </p> </h:form> </ui:define> </ui:composition>
Le lien de connexion se crée de la manière suivante
public String getRequestUrl() { StringBuffer request = new StringBuffer(FacesContext.getCurrentInstance().getExternalContext().getRequestScheme()).append("://").append(FacesContext.getCurrentInstance().getExternalContext().getRequestServerName()).append(":").append(FacesContext.getCurrentInstance().getExternalContext().getRequestServerPort()).append("/tokenServlet"); return AuthSubUtil.getRequestUrl(request.toString(), "http://www.google.com/calendar/feeds/", false, true); }
Conclusion
Je m'arrêterai la dans les exemples car la documentation est déjà bien détaillée sur ce sujet. Quoi qu'il en soit, je trouve que chez google, a défaut d'oeuvrer pour les données privées de ses utilisateurs, il savent très bien faire des API et les documenter
Seule limitation, la possibilité de faire des tests unitaires avec le token. La gestion du retour avec un proxy n'est pas possible (menfin à ce que j'ai vu ...)