Tutoriel La Poste IDentité Numérique

Intégration d'une API d'authentification avec Java

Jérémie Robert

L'Internet étant aujourd'hui accessible par tous et offrant de plus en plus de services, se pose le problème de la sécurité de l'information et plus particulièrement des données personnelles mais également de la réalité des internautes avec qui nous pouvons échanger. La gestion de l'identité numérique devient un enjeu majeur. La Poste propose une solution sécurisée pour les internautes avec son système de compte vérifié en face à face : L'IDentité Numérique de La Poste.

Dans ce tutoriel, nous allons voir ce qu'est cette API, à quoi elle va servir, pour quoi s'en servir, et comment l'intégrer dans votre application pour doper vos ventes et rassurer vos interlocuteurs.

Pour réagir au contenu de cet article, un espace de dialogue vous est proposé sur le forum : Commentez .

- Titre : Tutoriel La Poste IDentité Numérique

- Auteur : Jérémie Robert

- Parution : 9 décembre 2014

- Mise à jour : 9 décembre 2014

- Licence : Le contenu de cet article est rédigé par Jérémie Robert et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas de Modification 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Voir également :

- Tutoriel La Poste IDentité Numérique - Intégration d'une API d'authentification avec PHP

- Tutoriel La Poste IDentité Numérique - Intégration d'une API d'authentification avec Node.js

Sommaire

- I. Introduction de La Poste et du langage utilisé

- I-A. Histoire de La Poste

- I-B. Qu'est-ce que l'IDentité Numérique ?

- I-C. Rappel du langage

- II. Découverte de l'API et de ses intérêts

- II-A. Description de l'API

- II-A-1. Comment ça marche ?

- II-B. Usages

- II-B-1. Quels sont les usages actuels ?

- III. Intégration de l'API

- III-A. Clés de développement

- III-B. Utilisation d'une bibliothèque cliente OAuth2

- III-C. Installation et initialisation

- III-D. Authentification et autorisation

- IV. Informations utiles

- V. Remerciements

I - Introduction de La Poste et du langage utilisé

I-A - Histoire de La Poste

Société anonyme à capitaux publics depuis le 1er mars 2010, La Poste est un modèle original de groupe structuré autour de cinq branches : Services-Courrier-Colis, La Banque Postale, Réseau La Poste, GeoPost, Numérique.

Le Groupe est présent dans plus de 40 pays sur 4 continents.

Chaque jour, les 17 000 points de contact de La Poste, soit le 1er réseau commercial de proximité de France, accueillent 1,7 million de clients.

La Poste distribue 25 milliards d'objets par an dans le monde (lettres, imprimés publicitaires et colis), 6 jours par semaine.

En 2013, le Groupe La Poste a réalisé un chiffre d'affaires de 22,08 milliards d'euros, dont 17 % à l'international, et emploie plus de 266 000 collaborateurs.

Le Groupe La Poste, dans son plan stratégique « La Poste 2020 : Conquérir l'avenir » s'est donné pour objectif d'accélérer le développement de ses cinq branches et de conquérir de nouveaux territoires.

La Poste met le facteur humain et la confiance au cœur de la relation avec ses clients. Grâce à la convergence de ses réseaux, présente pour tous, partout et tous les jours, elle accompagne ses clients pour leur simplifier l'avenir.

La Poste est ainsi prestataire de services numériques via ses offres en ligne (MonTimbrenligne, Lettre recommandée électronique, …) disponibles sur laposte.fr, ses applications mobiles, les réseaux sociaux, mais aussi son webmail laposte.net, son coffre-fort électronique Digiposte et ses filiales BtoB : Mediapost Communication et Docapost.

I-B - Qu'est-ce que l'IDentité Numérique ?

L'IDentité Numérique peut être définie comme un lien technologique entre une entité réelle (personne, organisme ou entreprise) et une entité virtuelle (sa ou ses représentations numériques).

Le développement et l'évolution des moyens de communication, au travers notamment de la multiplication des blogs et des réseaux sociaux, changent le rapport de l'individu à autrui. Ainsi, l'IDentité Numérique permet l'identification de l'individu en ligne et la mise en relation de celui-ci avec cet ensemble de communautés virtuelles qu'est Internet.

Dès lors, l'IDentité Numérique peut être divisée en trois catégories :

- l'identité déclarative, qui se réfère aux données saisies par l'utilisateur comme son nom, sa date de naissance, ou autres informations personnelles directement renseignées par l'individu ;

- l'identité agissante, qui est indirectement renseignée par les activités de l'utilisateur sur la toile ;

- l'identité calculée, qui résulte d'une analyse de l'identité agissante par le système, comme le nombre de communautés virtuelles dans lesquelles l'individu évolue ou bien son nombre d'amis sur les réseaux sociaux.

Le décalage ou du moins les divergences qui peuvent subsister entre l'identité déclarative et l'identité agissante soulèvent une question majeure. Qui est vraiment l'individu auquel nous avons affaire sur la toile ?

Enfin, Internet étant accessible par tous et offrant de plus en plus de services, se pose le problème de la sécurité de l'information et plus particulièrement des données personnelles. La gestion de l'identité numérique devient alors un enjeu majeur.

Voilà le principe du l'IDentité Numérique, pour plus d'informations, visitez le lien Wikipédia.

Ainsi, La Poste propose une solution sécurisée pour les internautes avec son système de compte vérifié en face à face. Pour obtenir une IDentité Numérique de La Poste, l'internaute doit créer un compte sur www.laposte.fr/identitenumerique et faire vérifier son identité par un postier afin d'activer ce compte (un postier est un agent assermenté). En utilisant son IDentité Numérique pour s'authentifier sur un site partenaire, il choisit de partager ses données vérifiées à ce site et atteste ainsi que sa réelle identité et que son adresse postale ont été vérifiées. L'internaute garde la main sur ses données, La Poste les sécurise et ne trace pas ses actions.

Grâce à ce service, La Poste donne à l'internaute la possibilité d'accéder à plus de services sécurisés comme la réception des lettres recommandées en ligne en toute légalité.

I-C - Rappel du langage

Le langage utilisé durant ce tutoriel est Java. Vous pourrez réviser vos bases sur la section Développez prévue à cet effet : Cours et tutoriels Java

II - Découverte de l'API et de ses intérêts

II-A - Description de l'API

L'IDentité Numérique de La Poste : une identité vérifiée en face à face par le facteur au domicile des internautes.

C'est un service permettant à son détenteur de prouver qui il est grâce à l'identifiant et au mot de passe qu'il a choisis lors de son inscription, sans dévoiler son identité aux autres internautes.

II-A-1 - Comment ça marche ?

Il suffit d'utiliser le bouton de connexion « La Poste Connect » intégré par les applications partenaires.

II-B - Usages

L'utilité de ce service est donc de fournir un identifiant numérique qui permet d'attester de son identité sur le web !

II-B-1 - Quels sont les usages actuels ?

Aujourd'hui, l'IDentité Numérique permet de gagner du temps puisque son détenteur peut :

- recevoir des lettres recommandées en ligne (sous réserve qu'elles aient été expédiées depuis le site boutiqueducourrier.laposte.fr) ;

- créer et activer des contrats de procurations en trois clics pour permettre à un tiers de réceptionner des courriers ou des colis à sa place (monespaceclient.laposte.fr).

- afficher un badge « IDentité vérifiée par La Poste » sur son profil sur site collaboratif pour donner encore plus de confiance aux internautes qui souhaitent échanger avec lui.

L'objectif de ce tutoriel est de vous montrer comment intégrer la solution dans votre application pour doper vos ventes et rassurer vos interlocuteurs.

Pour plus d'explications, nous vous invitons à visionner la vidéo : http://youtu.be/USsQRTsWIZo?list=PLuWdndyU6Bbg3ckpqEZkLZ2DTaF5VMMRy

Animation en format "youtube" non supportée.
Contenu uniquement consultable en ligne à cette adresse :
https://www.youtube.com/watch?v=USsQRTsWIZo&feature=youtu.be&list=PLuWdndyU6Bbg3ckpqEZkLZ2DTaF5VMMRy

III - Intégration de l'API

III-A - Clés de développement

Pour créer une application cliente, il vous faudra les clés de développement qui vous seront données après votre inscription et qui ressembleront par exemple à ça :

CONSUMER_KEY : _kdvsazaaphmytp4gzoi8jdbal02pfgfh5l0w12iud

CONSUMER_SECRET : _vofna5navs92smal88obo2c2s4mah1k99i5r1xls

III-B - Utilisation d'une bibliothèque cliente OAuth2

Il y a de nombreux clients OAuth2 disponible pour la plupart des langages de programmation. Afin de ne pas réinventer la roue, nous allons utiliser une bibliothèque Java, “Scribe”, disponible sur github ( https://github.com/fernandezpablo85/scribe-java ).

La bibliothèque “Scribe” fournit un ensemble de fonctionnalités utiles à la communication avec les serveurs d'identifications pour accéder aux services de l'API Anywhere. Il s'agit notamment de rendre transparente l'utilisation du protocole d'autorisation OAuth2, et de se concentrer sur la logique du service à fournir aux utilisateurs finaux.

En supprimant la nécessité de gérer les jetons d'accès manuellement, “Scribe” simplifie énormément le processus d'authentification et d'autorisation des utilisateurs de notre application cliente.

“Scribe” est développé en Java et peut être intégré aux framework les plus courants.

Notre projet de démonstration utilisera aussi le SDK Java App Engine ( https://cloud.google.com/appengine/docs/java/gettingstarted/introduction ) pour faciliter la mise en ligne.

Toute la documentation pour son installation et son utilisation est disponible, en anglais, à cette url : https://cloud.google.com/appengine/docs/java/gettingstarted/introduction

Nous utiliserons aussi maven, une référence dans le monde Java, pour faciliter la gestion des dépendances et la création du projet ( http://maven.apache.org/ ).

Afin de ne pas se focaliser sur une plateforme dédiée, ce document utilise la notation {{base_url}} pour référencer le serveur IDN cible. Par exemple, pour cibler la plateforme de recette, {{base_url}} est égal à l'adresse qui vous sera envoyée par e-mail dès votre demande d'adhésion au service IDN soumise, dans notre cas : https://anywhere-sandbox.idn.laposte.fr/.

III-C - Installation et initialisation

Vous pouvez installer facilement les dépendances via Maven :

Création du projet :

mvn archetype:generate -Dappengine-version=1.9.15 -Dapplication-id=your-app-id -Dfilter=com.google.appengine.archetypes:

FIXME : Sélectionner l'archetype numéro 5.

Afin de pouvoir utiliser Maven, il suffit d'ajouter ces éléments à votre fichier pom.xml :

1. <!-- repository -->

2. <repositories>

3. <repository>

4. <id>scribe-java-mvn-repo</id>

5. <url>https://raw.github.com/fernandezpablo85/scribe-java/mvn-repo/</url>

6. <snapshots>

7. <enabled>true</enabled>

8. <updatePolicy>always</updatePolicy>

9. </snapshots>

10. </repository>

11. </repositories>

13. <!-- dependency ->

15. <dependency>

16. <groupId>commons-logging</groupId>

17. <artifactId>commons-logging</artifactId>

18. <version>1.1.1</version>

19. </dependency>

21. <dependency>

22. <groupId>org.scribe</groupId>

23. <artifactId>scribe</artifactId>

24. <version>1.3.6</version>

25. </dependency>

Vous pouvez enfin lancer la gestion des dépendances :

mvn clean install

III-D - Authentification et autorisation

On peut alors utiliser “Scribe” avec pour configuration minimum, la clef et le secret de l'application partenaire (CONSUMER_KEY et CONSUMER_SECRET).

Pour ce qui concerne l'authentification et l'autorisation, IDN possède la fonctionnalité SSO OAuth2. Il est alors possible de déléguer l'authentification de l'utilisateur au serveur IDN, puis d'utiliser la session établie.

Pour commencer, nous allons créer un fichier JSP, laposte.jsp, dans le dossier webapp “src/main/webapp/WEB-INF/”.

1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>

2. <%@ page import="com.google.appengine.api.users.User" %>

3. <%@ page import="com.google.appengine.api.users.UserService" %>

4. <%@ page import="com.google.appengine.api.users.UserServiceFactory" %>

5. <%@ page import="java.util.List" %>

6. <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

8. <html>

9. <head>

10. <title>La Poste</title>

11. </head>

13. <body>

15. <a href="/laposte">Identification</a>

17. </body>

18. </html>

Nous allons ensuite configurer les Servlet à venir via “web.xml” présent dans

1. <?xml version="1.0" encoding="UTF-8"?>

2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

3. <servlet>

4. <servlet-name>laposte</servlet-name>

5. <servlet-class>com.laposte.LaposteServlet</servlet-class>

6. </servlet>

7. <servlet>

8. <servlet-name>callback</servlet-name>

9. <servlet-class>com.laposte.CallbackOAuthProcessServlet</servlet-class>

10. </servlet>

11. <servlet-mapping>

12. <servlet-name>laposte</servlet-name>

13. <url-pattern>/laposte</url-pattern>

14. </servlet-mapping>

15. <servlet-mapping>

16. <servlet-name>callback</servlet-name>

17. <url-pattern>/callback</url-pattern>

18. </servlet-mapping>

19. <welcome-file-list>

20. <welcome-file>laposte.jsp</welcome-file>

21. </welcome-file-list>

22. </web-app>

Scribe ne reconnaît pas encore par défaut l'identification La Poste. Nous allons donc créer dans le répertoire “src/main/java/com/laposte/” le fichier API nécessaire à Scribe. DefaultApi20 correspond à Oauth2.

FIXME : Copier ce code dans le fichier LaposteApi.java

1. package com.laposte;

3. import org.scribe.builder.api.DefaultApi20;

4. import org.scribe.extractors.AccessTokenExtractor;

5. import org.scribe.extractors.JsonTokenExtractor;

7. import org.scribe.model.*;

9. import org.scribe.utils.*;

11. public class LaposteApi extends DefaultApi20

12. {

14. private static final String AUTHORIZE_URL = "{{base_url}}/oauth/v2/authorize?response_type=code&client_id=%s&redirect_uri=%s&scope=openid+email+phone+profile&state=123456";

15. private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s";

17. @Override

18. public String getAccessTokenEndpoint() {

19. return "{{base_url}}/v2";

20. }

22. @Override

23. public Verb getAccessTokenVerb() {

24. return Verb.POST;

25. }

27. @Override

28. public String getAuthorizationUrl(OAuthConfig config) {

29. Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Laposte does not support OOB");

31. // Append scope if present

32. if(config.hasScope())

33. {

34. return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope()));

35. }

36. else

37. {

38. return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()));

39. }

40. }

42. }

Concernant notre application nous allons créer un fichier LaposteServlet.java, dans le même répertoire que ci-dessus. Ce nouveau fichier contenant le code nécessaire à l'identification. Sa mission est de rediriger l'utilisateur vers le formulaire d'identification La Poste, le serveur d'autorisation.

Il s'agit donc de l'application cliente. Si La Poste autorise l'accès, le serveur d'autorisation envoie un code d'autorisation à notre application cliente via l'url callback.

1. package com.laposte;

3. import java.io.IOException;

4. import java.util.Properties;

5. import javax.servlet.http.HttpServlet;

6. import javax.servlet.http.HttpServletRequest;

7. import javax.servlet.http.HttpServletResponse;

9. import org.scribe.builder.*;

10. import org.scribe.builder.api.*;

11. import org.scribe.model.*;

12. import org.scribe.oauth.*;

14. import java.io.IOException;

15. import java.util.Arrays;

17. public class LaposteServlet extends HttpServlet {

19. private static final Token EMPTY_TOKEN = null;

21. @Override

22. public void doGet(HttpServletRequest req, HttpServletResponse resp)

23. throws IOException {

24. OAuthService service = new ServiceBuilder()

25. .provider(LaposteApi.class)

26. .apiKey("_API_KEY_")

27. .apiSecret("_API_SECRET_")

28. .callback("http://127.0.0.1/callback")

29. .build();

31. resp.getWriter().println("=== Laposte's OAuth Workflow ===");

32. resp.getWriter().println("Fetching the Authorization URL...");

33. String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);

34. resp.getWriter().println("Got the Authorization URL!");

35. resp.getWriter().println("Now go and authorize here:");

36. resp.getWriter().println(authorizationUrl);

37. resp.sendRedirect(authorizationUrl);

39. }

40. }

Le fichier CallbackOAuthProcessServlet.java, toujours dans “src/main/java/com/laposte/“ pour la démonstration permet d'échanger le code par un token d'accès. Enfin, notre application utilise ce token d'accès pour accéder aux données du profil de l'utilisateur par le serveur de ressources. Enfin, cette classe permet d'afficher les données de type : nom, prénom, téléphone…

1. package com.laposte;

3. import org.apache.commons.logging.Log;

4. import org.apache.commons.logging.LogFactory;

5. import javax.servlet.ServletException;

6. import javax.servlet.http.HttpServlet;

7. import javax.servlet.http.HttpServletRequest;

8. import javax.servlet.http.HttpServletResponse;

9. import java.io.IOException;

11. import org.scribe.builder.*;

12. import org.scribe.builder.api.*;

13. import org.scribe.model.*;

14. import org.scribe.oauth.*;

17. public class CallbackOAuthProcessServlet extends HttpServlet {

19. private Log log = LogFactory.getLog(getClass());

20. private static final String PROTECTED_RESOURCE_URL = "{{base_url}}/v2/me";

22. protected void doGet(HttpServletRequest req, HttpServletResponse res)

23. throws ServletException, IOException {

25. String code = req.getParameter(OAuthConstants.VERIFIER);

27. OAuthService service = new ServiceBuilder()

28. .provider(LaposteApi.class)

29. .apiKey("_API_KEY_")

30. .apiSecret("_API_SECRET_")

31. .callback("http://127.0.0.1/callback")

32. .build();

34. Token requestToken = service.getRequestToken();

36. Verifier verifier = new Verifier(code);

38. Token accessToken = service.getAccessToken(requestToken, verifier);

40. OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);

41. service.signRequest(accessToken, request);

43. Response response = request.send();

45. System.out.printin(response.getcode());

46. System.out.printin(response.getBody());

47. }

48. }

Dans une application en production, l'utilisateur ne doit pas avoir accès au token d'accès, à vous de le stocker. La Poste envoie également d'autres informations en dehors du token d'accès comme la durée de validité du token d'accès.

Pour lancer l'application : mvn appengine:devserver

Si vous avez correctement configuré la variable PROTECTED_RESOURCE_URL et les méthodes apiKey, apiSecret et callback, vous devez voir le lien “identification” si vous ouvrez votre navigateur sur l'adresse http://localhost:3000, un simple clic vous redirigera vers le site d'identification de laposte. Une fois identifié, vous serez redirigé vers votre application qui affichera simplement les données de votre compte.

IV - Informations utiles

- Le site de la Poste pour trouver toutes les infos utiles à votre intégration d'API : https://developpeurs.idn.laposte.fr/

- Le site Developpez.com pour les tutos Java : https://java.developpez.com/cours/

- Retrouvez le code source de l'intégration de l'API IDentité Numérique dans une application sur le compte Github de BeMyApp France.

- Utilisez le hashtag #LaPostedev sur Twitter pour échanger avec La Poste sur ce service.

- Vous pouvez contacter La Poste pour toutes vos questions techniques via equipe-idn.dsic@laposte.fr

V - Remerciements

Nous tenons à remercier Jérémie Robert - CTO de milliweb - de nous avoir donné la possibilité de publier ce tutoriel sur Developpez.com.

Je tiens également à remercier ClaudeLELOUP pour sa relecture et ses corrections.