| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
| adel:utilisateurs:api-rest [2021/02/16 11:20] – [Documentation OpenAPI] julien.lanfrey | adel:utilisateurs:api-rest [2022/06/13 14:48] (Version actuelle) – eric |
|---|
| |
| |
| {{:adel:work-in-progress.png?50|}} **ECRITURE EN COURS** | ===== Introduction ===== |
| | |
| |
| | Adel met à disposition depuis 2021 ce qu'on appelle une "API REST". De manière résumée, une API est une solution informatique qui permet à des applications de communiquer entre elles, de s'échanger des informations. |
| |
| ===== Introduction ===== | Une API met à disposition un ensemble de fonctions qui facilitent l'accès aux services fournis par une application. L'échange d'informations s'effectue à travers un langage de programmation. |
| | |
| Adel met à disposition depuis 2021 ce qu'on appelle une "API REST". De manière résumée, une API est une solution informatique qui permet à des applications de communiquer entre elles, de s'échanger des informations. Une API met à disposition un ensemble de fonctions qui facilitent l'accès aux services fournis par une application. L'échange d'informations s'effectue à travers un langage de programmation. | |
| |
| Le terme "[[https://fr.wikipedia.org/wiki/Representational_state_transfer|REST]]" désigne le style d'architecture de l'API. Nous ne la détaillerons pas ici. | Le terme "[[https://fr.wikipedia.org/wiki/Representational_state_transfer|REST]]" désigne le style d'architecture de l'API. Nous ne la détaillerons pas ici. |
| |
| |
| ===== A qui s'adresse le présent document ? ===== | ===== A qui s'adresse ce document ? ===== |
| |
| L'utilisation d'une API REST nécessite des connaissances en programmation informatique. La documentation qui suit s'adresse donc à un profil de développeur. Il y sera question du protocole HTTP, d'authentification JWT, et des exemples de programme seront donnés en langage Javascript. | L'utilisation d'une API REST nécessite des connaissances en programmation informatique. La documentation qui suit s'adresse donc à un profil de développeur. Il y sera question du protocole HTTP, d'authentification JWT, et des exemples de programme seront donnés en langage Javascript. |
| ===== Notes de version ===== | ===== Notes de version ===== |
| |
| * Dernière mise à jour de ce document : **le 16 février 2021** | * Dernière mise à jour de ce document : **le 9 septembre 2021** |
| | * Clarification de la forme de l'URL attendue au niveau de l'implémentation |
| | * Version d'Adel utilisé lors des tests : **6.4.6** |
| * Version de l'API : **v1** | * Version de l'API : **v1** |
| * Version d'Adel utilisé lors des tests : **6.4.6** | |
| |
| ===== Présentation ===== | **Versioning d'API** :\\ |
| | Les différentes "routes" de l'API sont préfixées par le numéro de version de l'API.\\ [[https://blog.octo.com/versioning-de-services-rest|En savoir plus]] |
| |
| ==== Documentation OpenAPI ==== | |
| |
| La documentation technique de l'API est disponible en ligne à l'adresse suivante :\\ | ===== Documentation OpenAPI ===== |
| [[https://www.bayard-service.com|Documentation technique de l'API]] | |
| | L'accès à la documentation technique de l'annuaire ADEL est le suivant :\\ |
| | **<nowiki>https://secure.bayard-service.com/annuaire_<MON_ANNUAIRE>/swagger-ui/index.html</nowiki>** |
| |
| Cette documentation repose sur le standard [[https://www.openapis.org|OpenAPI]] et met à disposition une interface permettant de découvrir les possibilités de l'API mais aussi de **tester les différents services** offerts par celle-ci. | Cette documentation repose sur le standard [[https://www.openapis.org|OpenAPI]] et met à disposition une interface permettant de découvrir les possibilités de l'API mais aussi de **tester les différents services** offerts par celle-ci. |
| * Les fonctions | * Les fonctions |
| |
| Nous vous laissons le soin le découvrir par vous-même la liste de ces services. Certains paramètres d'entrée attendent des valeurs particulières qui ne sont pas décrites. Vous trouverez alors ces informations ici-même : | Nous vous laissons le soin le découvrir par vous-même la liste de ces services. Vous verrez que certains paramètres d'entrée attendent des valeurs particulières. Celles-ci sont décrites sur cette page dédiée : [[adel:utilisateurs:api-rest:endpoints|Informations complémentaires]]. |
| * [[adel:utilisateurs:api-rest:groupes|Informations complémentaires pour la section groupe]]. | |
| |
| |
| Les requêtes effectuées sur l'API nécessitent une authentification afin que l'API soit en mesure d'accéder aux données de votre base Adel. C'est pourquoi l'interface de la documentation technique en ligne affiche un bouton "//Authorize//" avec un cadenas ouvert qui précise que vous n'êtes pas encore authentifié. | Les requêtes effectuées sur l'API nécessitent une authentification afin que l'API soit en mesure d'accéder aux données de votre base Adel. C'est pourquoi l'interface de la documentation technique en ligne affiche un bouton "//Authorize//" avec un cadenas ouvert qui précise que vous n'êtes pas encore authentifié. |
| |
| Pour pouvoir tester les différentes routes, il est donc nécessaire d'être authentifié. Pour cela, cliquez sur le bouton pour renseigner les informations d'identification. | Pour pouvoir tester les différentes "routes", il est donc nécessaire de l'être. Pour cela, cliquez sur le bouton pour renseigner les informations d'identification. |
| * ''username'' et ''password'' : correspondent à un compte d'accès Adel. Ce compte doit être habilité à utiliser l'API. | * ''username'' et ''password'' : correspondent à un compte d'accès Adel. Ce compte doit être habilité à utiliser l'API. |
| * ''client-id'' et ''client-secret'' : Mécanisme complémentaire d'authentification. Les informations à saisir sont à demander à Bayard-Service. | * ''client-id'' et ''client-secret'' : Mécanisme complémentaire d'authentification. Les informations à saisir sont à demander à Bayard-Service. |
| |
| Ces 4 champs étant renseignés, cliquez sur le bouton "Authorize" au bas du formulaire. Le résultat de l'opération s'affiche. Fermez cette petite fenêtre. Le cadenas est alors fermé ce qui indique que l'authentification a réussi. Vous êtes désormais en mesure de tester les différentes routes. | Ces 4 champs étant renseignés, cliquez sur le bouton "Authorize" au bas du formulaire. Le résultat de l'opération s'affiche. Fermez cette petite fenêtre. Le cadenas est alors fermé ce qui indique que l'authentification a réussi. Vous êtes désormais en mesure de tester les différentes "routes". |
| | |
| Le mécanisme d'authentification sera expliqué plus en détail dans la partie "Implémentation". | |
| | |
| | |
| ==== Versioning ==== | |
| | |
| Les différentes routes de l'API sont préfixés par le numéro de version de l'API. [[https://blog.octo.com/versioning-de-services-rest|En savoir plus sur le concept de versioning d'API]] | |
| | |
| ==== Projections ==== | |
| | |
| Au niveau des paramètres d'entrée, figure la plupart du temps, un paramètre facultatif nommé "projection". Ce paramètre permet de préciser ce que l'on souhaite obtenir en réponse. | |
| | |
| Si vous testez les différentes routes, vous remarquerez que les informations qu'elles retournent sont toujours minimalistes. Si vous saisissez "huge" comme valeur, vous pourrez voir que les données obtenus sont plus complètes avec notamment les coordonnées, les descriptions publiques, privées, les mots-clés, etc. | |
| | |
| Vous pouvez ainsi moduler vos appels à l'API en précisant "huge" au niveau de la projection selon que vous avez besoin d'informations complètes ou pas. Les requêtes effectuées avec la projection "huge" sont donc plus lourdes et peuvent prendre plus de temps. Cet aspect est à prendre en compte selon l'usage que vous faites de l'API. | |
| | |
| | |
| | |
| | |
| | |
| ===== Implémentation ===== | |
| | |
| Il est possible d'utiliser à peu près n'importe quel langage de programmation pour utiliser l'API. Nous donnerons quelques exemples en langage Javascript avec la librairie JQuery. | |
| | |
| Les communications avec l'API passent par des requêtes HTTPS GET. Le format d'échange utilisé est le format JSON. | |
| | |
| ==== Authentification ==== | |
| | |
| Deux standards sont employés dans le but de sécuriser l'API : | |
| * HTTP Basic Authentication | |
| * OAuth 2.0 JWT, avec échange de Token | |
| | |
| Le principe général est le suivant : | |
| - On commence par transmettre des informations d'authentification initiale à l'API (login et mot de passe). L'API vérifie les droits de la personne à utiliser l'API et, le cas échéant lui retourne un ''access_token'' et un ''refresh_token''. | |
| - Le ''access_token'' est un identifiant unique qui sert de laisser-passer pour tout appel successif à l'API. Il a une durée de vie relativement courte (de l'ordre de l'heure). Au delà, un nouvel appel à l'API provoquera une erreur. | |
| - Le ''refresh_token'' sert à demander à l'API un nouvel ''access_token'', typiquement quand ce dernier a expiré. Il a donc une durée de vie beaucoup plus longue. | |
| | |
| Pour en savoir plus sur JWT : | |
| * [[https://tools.ietf.org/html/rfc7519|RFC 7519]] | |
| * Présentation sur [[https://jwt.io/introduction|jwt.io]] | |
| * Schémas illustrant l'échange de token sur [[https://blog.ippon.fr/2017/10/12/preuve-dauthentification-avec-jwt|ce billet de blog]]. | |
| ==== Exemples avec la librairie JQuery ==== | |
| | |
| Version de JQuery utilisée : 3.5.1 | |
| | |
| === 1 - Authentification initiale === | |
| | |
| <code javascript | Authentification : /oauth/token> | |
| $.ajax({ | |
| method: 'POST', | |
| url: 'https://votre/instance/adel/oauth/token', | |
| contentType: 'application/x-www-form-urlencoded; charset=utf-8', | |
| crossDomain:true, | |
| dataType: 'json', | |
| data: { | |
| grant_type: 'password', | |
| username: 'xxxxx', // Login Adel | |
| password: 'xxxxx', // Mot de passe Adel | |
| client_id: 'xxxxx', // Basic-auth : id | |
| client_secret: 'xxxxx' // Basic-auth : mot de passe | |
| }, | |
| success: function (data) { | |
| console.log('success', data); | |
| }, | |
| error: function (e) { | |
| console.log('error', e.responseText); | |
| } | |
| }); | |
| </code> | |
| | |
| Si l'authentification réussie, vous obtiendrez un retour de la forme : | |
| | |
| <code json | Réponse> | |
| { | |
| "access_token": "azertyiJIhyhyNiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiand0cmVzb3VyY2VpZCJdLCJ1c2VyX25hbWUiOiJqbGFuZnJleSIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSIsInRydXN0Il0sImV4cCI6MTYxMjU0NDA1MSwiYXV0aG9yaXRpZXMiOlsic3lzX2dsb2JhbF9hZG1pbmlzdHJlciIsIlJPTEVfc3lzX2FkbWluIl0sImp0aSI6IjJiV1lwdEazertyXJ4Nm1hSSIsImNsaWVudF9pZCI6Imp3dGNsaWVudGlkIn0.x6gJRCbsOVVkpnsYduVL9QldGK0qPgW-Hql8mjcqBiQ", | |
| "token_type": "bearer", | |
| "refresh_token": "azertyzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiand0cmVzb3VyY2VpZCJdLCJ1c2VyX25hbWUiOiJqbGFuZnJleSIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSIsInRydXN0Il0sImF0aSI6IjJiV1lwdEQ0QkdaSXJqaFplYTlpTXJ4Nm1hSSIsImF1dGhvcml0aWVzIjpbInN5c19nbG9iYWxfYWRtaW5pc3RyZXIiLCJST0xFX3N5c19hZG1pbiJdLCJqdGkiOiJvd1RkamQwZ3dUTU51MTg3ckNPRlRxT0ZwWHMiLCJjbGllbnRfaWQiOiJqd3RjbGllbnRpZCJ9.hT4WZ5yjloX5zH0Ko6c7WaTWD-ImGQYlmFxsInHVQqU", | |
| "expires_in": 3559, | |
| "scope": "read write trust", | |
| "jti": "azertyD4BGZIrjhZea9iMrx6maI" | |
| } | |
| </code> | |
| | |
| === 2 - Utilisation de l'API === | |
| |
| Vous êtes désormais en mesure d'appeler les différentes routes de l'API en transmettant le ''access_token'' à chaque appel. | Le mécanisme d'authentification est expliqué plus en détail dans la partie [[adel:utilisateurs:api-rest:implementation|Implémentation]]. |
| |
| <code javascript | Appel de /api/v1/personnes/123> | |
| $.ajax({ | |
| method: 'GET', | |
| url: 'https://votre/instance/adel/api/v1/personnes/123', | |
| dataType: 'json', | |
| crossDomain:true, | |
| data: {}, | |
| beforeSend: function (xhr) { | |
| xhr.setRequestHeader('Authorization','Bearer ' + store.access_token); | |
| }, | |
| success: function (data) { | |
| console.log('success', data); | |
| }, | |
| error: function (e) { | |
| console.log('error', e.responseText); | |
| } | |
| }); | |
| </code> | |
| |
| Si vous utilisez votre ''access_token'' alors que ce dernier a expiré, qu'il n'est plus valide, vous obtiendrez un retour d'erreur de ce type : | |
| |
| <code json | Utilisation d'un access_token invalide> | |
| {"error":"invalid_token","error_description":"Access token expired: azertyiJIhyhyNiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiand0cmVzb3VyY2VpZCJdLCJ1c2VyX25hbWUiOiJqbGFuZnJleSIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSIsInRydXN0Il0sImV4cCI6MTYxMjU0NDA1MSwiYXV0aG9yaXRpZXMiOlsic3lzX2dsb2JhbF9hZG1pbmlzdHJlciIsIlJPTEVfc3lzX2FkbWluIl0sImp0aSI6IjJiV1lwdEazertyXJ4Nm1hSSIsImNsaWVudF9pZCI6Imp3dGNsaWVudGlkIn0.x6gJRCbsOVVkpnsYduVL9QldGK0qPgW-Hql8mjcqBiQ"} | |
| </code> | |
| |
| === 3 - Actualisation du ''access_token'' === | |
| |
| Si votre ''access_token'' est invalide, vous devez en demander un nouveau en utilisant le ''refresh_token''. | |
| |
| <code javascript | Actualisation du token : /oauth/token> | |
| $.ajax({ | |
| method: 'POST', | |
| url: 'https://votre/instance/adel/oauth/token', | |
| contentType:'application/x-www-form-urlencoded; charset=utf-8', | |
| data: { | |
| grant_type: 'refresh_token', | |
| refresh_token: store.refresh_token, // Le refresh_token | |
| client_id: 'xxxxx', // Basic-auth : id | |
| client_secret: 'xxxxx' // Basic-auth : mot de passe | |
| }, | |
| success: function (data) { | |
| console.log('success', data); | |
| }, | |
| error: function (e) { | |
| console.log('error', e.responseText); | |
| } | |
| }); | |
| </code> | |
| |
| Le retour est similaire à celui obtenu lors de l'authentification initiale. | |
| |
| |