Projet MonDossierWeb
Pages enfant
  • MDWP -2- APIs Pégase


Architecture

MDW est autorisé à interroger les APIs Pégase en s'identifiant à l'aide d'un token (JWT). Ce dernier est obtenu en s'authentifiant (username + passwordd) auprès du serveur OAuth dédié.


Ce token a une durée de vie limitée. MDW garde donc ce token en mémoire et vérifie régulièrement sa validité afin de le renouveller si nécessaire.

Le paramètre pegase.accesstoken.duration (application.properties) permet d'indiquer la durée (en heure) de conservation du token.

APIs utilisées

Exemple de configuration

Voici un exemple des URLs à configurer dans la vue "Configuration" de l'application

APIvariablesURL exemple
OAuth
url_authn_app_ticketshttps://authn-app.univ.pc-scol.fr/cas/v1/tickets
IDTurl_api_idthttps://idt.univ.pc-scol.fr/api/idt/v1
INS EXT
url_api_ins_ext
https://ins.univ.pc-scol.fr/api/ins/ext/v2
INSurl_api_inshttps://ins.univ.pc-scol.fr/api/ins/v1
PIECE EXTurl_api_piece_exthttps://piece.univ.pc-scol.fr/api/pie/ext/v1
CHC
url_api_chc
https://chc.univ.pc-scol.fr/api/chc/v6
COC
url_api_cochttps://coc.univ.pc-scol.fr/api/coc/publication/v2
PAI
url_api_pai
https://pai.univ.pc-scol.fr/api/v1

Méthodes utilisées

URL (voir variables ci-dessus)Module/APIMéthodeUtilisation

url_authn_app_tickets?username=${username}&password=${password}&token=true

serveur OAuth
Récupération du Jeton JWT pour authentification des API
url_api_idt/etablissements/${etab}/identites/apprenants?codeApprenant=${codeApprenant}IDTrechercherIdentiteApprenantRechercher des identité d'apprenants
url_api_ins_ext/gestion/inscription/${etab}/${codeApprenant}INS EXT v2lireInscriptionsRécupération du dossier de l'apprenant et de ses inscriptions
url_api_ins/etablissement/${etab}/${uuidApprenant}/${codeVoeu}/certificat-de-scolariteINSgenererCertificatDeScolariteGénération du certificat de scolarité
url_api_piece_ext/etablissements/${etab}/codeApprenant/${codeApprenant}/codePeriode/${codePeriode}/codeChemin/${codeChemin}/photoPIECE EXTvisualiserPhotoRécupération de la photo de l'étudiant

url_api_chc/cursus-dca?codeApprenant={codeApprenant}

CHC

lireCusrsuApprenant

Récupération du cursus
url_api_coc/etablissements/${etab}/periodes/${codePeriode}/apprenants/${codeApprenant}/chemins/${chemin}COClisterCursusPubliableApprenantRécupération des notes et résultats de l'étudiant
url_api_coc/etablissements/${etab}/periodes/${codePeriode}/apprenants/${codeApprenant}/chemins/${chemin}/releves-de-notesCOClisterReleveDeNotePubliableApprenantLister les relevés de notes publiables
url_api_coc/modeles-releves-notes/${idReleve}/apprenants/${codeApprenant}/chemins/${chemin}/releves-de-notes-et-resultatsCOCgenererRelevesDeNotesEtResultatsPubliableApprenantGénérer un relevé de note
url_api_pai/pai/attestation-de-paiement/${etab}/${codeApprenant}/${codePeriode}PAIimprimerAttestationDePaiementRécupération de l'attestation de paiement


Tester une API

Nous allons voir comment tester le bon fonctionnement d'une API en la requêtant "à la main".

Plutôt que d'utiliser la commande "curl" pour executer les requêtes http, il possible d'utiliser un outil comme Insomnia afin de se faciliter la tâche.

Appeler une API s'effectue via une requête HTTP.

Pour être autorisé à appeler l'API d'un module Pégase, il faut préalablement avoir récupéré un token d'authentification.

Par exemple pour tester la méthode lireInscriptions de l'API INS (qui retourne la quasi totalité du dossier), il faut :

  1. Faire un premier appel (POST) au serveur OAuth pour récupérer le token
  2. Utiliser ce token pour appeler l'API (GET)

Récupération du token

POST https://authn-app.[univ].pc-scol.fr/cas/v1/tickets?username=[username]&password=[password]&token=true

Le username et le password à passer sont ceux permettant d'identifier MDW auprès du serveur OAuth de Pégase.

Ces informations correspondent aux paramètres suivant dans application.properties :

  • pegase.accesstoken.url
  • pegase.accesstoken.username
  • pegase.accesstoken.password

Appel de l'API

GET https://ins.[univ].pc-scol.fr/api/v5/ins/gestion/inscription/[codeEtablissement]/[codeApprenant]/

Ajouter la chaîne "Bearer " (attention à bien ajouter l'espace) au début du token et le passer dans un header nommé "Authorization".

Via Postman le passage du token se fait facilement depuis l'onglet "Authorization" (Type "OAuth 2.0")

L'url de l'API et le code établissement correspondent aux paramètres suivant dans application.properties :

  • pegase.api.ins.url
  • pegase.etablissement


Génération des classes clientes java

MDW embarque directement dans son code les classes java clientes utilisées pour interroger les APIs. Il n'y a pas de dépendance vers une librairie externe.

Pour générer ces classes java, OpenAPI Generator est utilisé depuis la v1.

Dans un soucis de transparence et afin de permettre de rejouer cette procédure (normalement pas nécessaire), voici, ci-dessous, la démarche utilisée lors du développement.

Installation d'OpenAPI Generator

Télécharger la version zip de node (https://nodejs.org/en/download/) et dézipper puis :

# Se rendre dans le répertoire d'installation
cd C:/node-v14.16.0-win-x64

# Installer openapi-generator-cli
npm install @openapitools/openapi-generator-cli -g

# Forcer l'utilisation de la version 5.4.0  
# /!\ IMPORTANT /!\  A vérifier avant chaque génération sous peine d'obtenir des imports non valides
openapi-generator-cli version-manager set 5.4.0

# Aide sur la config
npx @openapitools/openapi-generator-cli config-help -g jav

Génération du client java

Exemple pour générer les classes de clients java des principales API :

Copier les YML descripteurs des APIs Pégase dans C:\tmp\YML et lancer depuis le répertoire où se trouve le YAML une génération des classes java :

Génération des clients java à partir des yaml
# Forcer l'utilisation de la version 5.4.0  
# /!\ IMPORTANT /!\  A vérifier avant chaque génération sous peine d'obtenir des imports non valides
openapi-generator-cli version-manager set 5.4.0

# IDT   
npx @openapitools/openapi-generator-cli generate -i idt-api-v1-1.0.0-rc.yaml -g java -o C:/tmp/openapi-generator/ -p invokerPackage=fr.univlorraine.pegase.idt.invoker -p apiPackage=fr.univlorraine.pegase.idt.api -p modelPackage=fr.univlorraine.pegase.idt.model -p dateLibrary=java17-localdatetime

# INS EXT 
npx @openapitools/openapi-generator-cli generate -i inscription-ext-api-v2-2.2.0-dev.20250424143719.yaml -g java -o C:/tmp/openapi-generator/ -p invokerPackage=fr.univlorraine.pegase.insext.invoker -p apiPackage=fr.univlorraine.pegase.insext.api -p modelPackage=fr.univlorraine.pegase.insext.model -p dateLibrary=java17-localdatetime

# INS 
npx @openapitools/openapi-generator-cli generate -i ins-api-v1-1.0.0-rc.yaml -g java -o C:/tmp/openapi-generator/ -p invokerPackage=fr.univlorraine.pegase.ins.invoker -p apiPackage=fr.univlorraine.pegase.ins.api -p modelPackage=fr.univlorraine.pegase.ins.model -p dateLibrary=java17-localdatetime

# PIECE EXT 
npx @openapitools/openapi-generator-cli generate -i piece-ext-api-v1-1.2.0.yaml -g java -o C:/tmp/openapi-generator/ -p invokerPackage=fr.univlorraine.pegase.pieceext.invoker -p apiPackage=fr.univlorraine.pegase.pieceext.api -p modelPackage=fr.univlorraine.pegase.pieceext.model -p dateLibrary=java17-localdatetime

# PAI
npx @openapitools/openapi-generator-cli generate -i pai-api-v1-27.0.0.yaml -g java -o C:/tmp/openapi-generator/ -p invokerPackage=fr.univlorraine.pegase.pai.invoker -p apiPackage=fr.univlorraine.pegase.pai.api -p modelPackage=fr.univlorraine.pegase.pai.model -p dateLibrary=java17-localdatetime

# CHC
npx @openapitools/openapi-generator-cli generate -i chc-application-api-v6-6.8.0.yml -g java -o C:/tmp/openapi-generator/ -p invokerPackage=fr.univlorraine.pegase.chc.invoker -p apiPackage=fr.univlorraine.pegase.chc.api -p modelPackage=fr.univlorraine.pegase.chc.model -p dateLibrary=java17-localdatetime

# COC
npx @openapitools/openapi-generator-cli generate -i coc-publication-api-v2-2.1.0.yml -g java -o C:/tmp/openapi-generator/ -p invokerPackage=fr.univlorraine.pegase.coc.invoker -p apiPackage=fr.univlorraine.pegase.coc.api -p modelPackage=fr.univlorraine.pegase.coc.model -p dateLibrary=java17-localdatetime

Récupérer le code généré dans le projet

Récupérer les classes générées dans les répertoires :

  • / src/main/java/fr/univlorraine/pegase/{NOM_API}

Modification des classes générées

Dans les classes générées il faut remplacer l'annotation :

@javax.annotation.Generated

par 

@jakarta.annotation.Generated


Si des erreurs persistent à la compilation ou dans l'IDE, il peut être nécessaire d'apporter des modifications au code généré.

Exemple :

  • Corriger l'assignation aux énumérations dans les constructeurs des classes qui le nécessite. Par exemple, le code :

    this.canalCommunication = this.getClass().getSimpleName();
    devient : 
    this.canalCommunication = CanalCommunicationEnum.fromValue(this.getClass().getSimpleName());
    

    et certaines lignes 

    this.type = this.getClass().getSimpleName();
    deviennent :
    this.type = TypeEnum.fromValue(this.getClass().getSimpleName());
  • Supprimer l'attribut est1 et la constante SERIALIZED_NAME_EST1 de la classe fr.univlorraine.pegase.insext.model.Periode

Implémentation

Pour des exemples d'appels aux APIs effectués grâce aux classes générées ci-dessus, voir le code source du PegaseService sur github : https://github.com/EsupPortail/esup-mdw-pegase/blob/master/src/main/java/fr/univlorraine/mondossierweb/service/PegaseService.java



  • Aucune étiquette