From 7c59f7641c904ea4a8a509ea8d5a5e12d0675aef Mon Sep 17 00:00:00 2001 From: Fabien Lamarque Date: Thu, 28 Nov 2024 15:39:14 +0100 Subject: [PATCH] =?UTF-8?q?Transf=C3=A8re=20un=20jeton=20utilisateur=20lor?= =?UTF-8?q?s=20de=20la=20r=C3=A9cup=C3=A9ration=20de=20document?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/urlOOTS.js | 13 ++++++++++++- src/routes/routesOOTS.js | 15 ++++++++++----- src/siteVitrine.js | 2 +- test/api/urlOOTS.spec.js | 34 +++++++++++++++++++++++++++------- test/routes/routesOOTS.spec.js | 13 +++++++++++++ test/routes/serveurTest.js | 2 ++ 6 files changed, 65 insertions(+), 14 deletions(-) diff --git a/src/api/urlOOTS.js b/src/api/urlOOTS.js index deaec7e..8631858 100644 --- a/src/api/urlOOTS.js +++ b/src/api/urlOOTS.js @@ -1,3 +1,14 @@ -const urlOOTS = (adaptateurEnvironnement) => `${adaptateurEnvironnement.urlBaseOOTSFrance()}/requete/pieceJustificative?codeDemarche=00&codePays=FR&idRequeteur=${adaptateurEnvironnement.identifiantRequeteur()}`; +const urlOOTS = (config, requete) => { + const { adaptateurChiffrement, adaptateurEnvironnement } = config; + const { infosUtilisateur } = requete.session; + const clePrivee = adaptateurEnvironnement.clePriveeJWK(); + + return adaptateurChiffrement.genereJWT(infosUtilisateur, clePrivee) + .then((jeton) => { + const requeteur = adaptateurEnvironnement.identifiantRequeteur(); + const urlOOTSFrance = adaptateurEnvironnement.urlBaseOOTSFrance(); + return `${urlOOTSFrance}/requete/pieceJustificative?codeDemarche=00&codePays=FR&idRequeteur=${requeteur}&utilisateur=${jeton}`; + }); +}; module.exports = urlOOTS; diff --git a/src/routes/routesOOTS.js b/src/routes/routesOOTS.js index 80437fd..3dd7870 100644 --- a/src/routes/routesOOTS.js +++ b/src/routes/routesOOTS.js @@ -1,14 +1,19 @@ const express = require('express'); - const urlOOTS = require('../api/urlOOTS'); const routesOOTS = (config) => { - const { adaptateurEnvironnement, depotDonnees } = config; + const { adaptateurChiffrement, adaptateurEnvironnement, depotDonnees } = config; const routes = express.Router(); - routes.get('/document', (requete, reponse) => depotDonnees - .demarreRecuperationDocument() - .then(() => reponse.render('redirectionNavigateur', { destination: urlOOTS(adaptateurEnvironnement, requete) }))); + routes.get( + '/document', + (requete, reponse) => depotDonnees.demarreRecuperationDocument() + .then(() => urlOOTS({ adaptateurEnvironnement, adaptateurChiffrement }, requete) + .then((url) => reponse.render( + 'redirectionNavigateur', + { destination: url }, + ))), + ); routes.post('/document', (requete, reponse) => depotDonnees .termineRecuperationDocument(Buffer.from(requete.body.document)) diff --git a/src/siteVitrine.js b/src/siteVitrine.js index 567c7b8..84e697d 100644 --- a/src/siteVitrine.js +++ b/src/siteVitrine.js @@ -51,7 +51,7 @@ const creeServeur = (config) => { app.use( '/oots', protegeRouteAvecOOTS(adaptateurEnvironnement), - routesOOTS({ adaptateurEnvironnement, depotDonnees }), + routesOOTS({ adaptateurChiffrement, adaptateurEnvironnement, depotDonnees }), ); app.use('/', routesBase({ adaptateurEnvironnement, depotDonnees, middleware })); diff --git a/test/api/urlOOTS.spec.js b/test/api/urlOOTS.spec.js index 948d9bd..bdc4bf3 100644 --- a/test/api/urlOOTS.spec.js +++ b/test/api/urlOOTS.spec.js @@ -1,25 +1,45 @@ const urlOOTS = require('../../src/api/urlOOTS'); -describe("Le constructeur de l'URL de requête OOTS-France", () => { +describe('Le constructeur de l\'URL de requête OOTS-France', () => { + const adaptateurChiffrement = {}; const adaptateurEnvironnement = {}; + const requete = {}; beforeEach(() => { adaptateurEnvironnement.avecOOTS = () => true; + adaptateurEnvironnement.clePriveeJWK = () => ''; adaptateurEnvironnement.urlBaseOOTSFrance = () => ''; adaptateurEnvironnement.identifiantRequeteur = () => ''; + adaptateurChiffrement.genereJWT = () => Promise.resolve(); + requete.session = { infosUtilisateur: {} }; }); it('retourne un lien vers OOTS', () => { adaptateurEnvironnement.urlBaseOOTSFrance = () => 'http://example.com'; - const url = urlOOTS(adaptateurEnvironnement); - - expect(url).toMatch(/^http:\/\/example\.com.*/); + urlOOTS( + { adaptateurChiffrement, adaptateurEnvironnement }, + requete, + ).then((url) => expect(url).toMatch(/^http:\/\/example\.com.*/)); }); - it("contient l'identifiant de requeteur", () => { + it('contient l\'identifiant de requeteur', () => { adaptateurEnvironnement.identifiantRequeteur = () => 'un-identifiant'; - const url = urlOOTS(adaptateurEnvironnement); + urlOOTS( + { adaptateurChiffrement, adaptateurEnvironnement }, + requete, + ).then((url) => expect(url).toContain('idRequeteur=un-identifiant')); + }); + + it('contient le jeton utilisateur', () => { + requete.session.infosUtilisateur = { prenom: 'Pierre', nom: 'Jax' }; + adaptateurChiffrement.genereJWT = (infosutilisateur) => { + expect(infosutilisateur).toStrictEqual({ prenom: 'Pierre', nom: 'Jax' }); + return Promise.resolve('unJeton'); + }; - expect(url).toContain('idRequeteur=un-identifiant'); + urlOOTS( + { adaptateurChiffrement, adaptateurEnvironnement }, + requete, + ).then((url) => expect(url).toContain('unJeton')); }); }); diff --git a/test/routes/routesOOTS.spec.js b/test/routes/routesOOTS.spec.js index 160b890..852655c 100644 --- a/test/routes/routesOOTS.spec.js +++ b/test/routes/routesOOTS.spec.js @@ -38,6 +38,19 @@ describe('le serveur des routes `/oots/document`', () => { .catch(leveErreur); }); + it('transmet un jeton utilisateur à OOTS', () => { + serveur.adaptateurEnvironnement().urlBaseOOTSFrance = () => 'http://example.com'; + serveur.adaptateurChiffrement().genereJWT = () => Promise.resolve( + 'un Jeton Utilisateur', + ); + + return axios.get(`http://localhost:${port}/oots/document`) + .then((reponse) => { + expect(reponse.data).toContain('un Jeton Utilisateur'); + }) + .catch(leveErreur); + }); + it('lève une erreur 501 (not implemented) si la fonctionnalité est désactivée', () => { expect.assertions(2); serveur.adaptateurEnvironnement().avecOOTS = () => false; diff --git a/test/routes/serveurTest.js b/test/routes/serveurTest.js index 51e9c83..3be7dac 100644 --- a/test/routes/serveurTest.js +++ b/test/routes/serveurTest.js @@ -21,6 +21,7 @@ const serveurTest = () => { adaptateurChiffrement = { cleHachage: () => '', dechiffreJWE: () => Promise.resolve(), + genereJWT: () => Promise.resolve(''), verifieSignatureJWTDepuisJWKS: () => Promise.resolve({}), }; @@ -28,6 +29,7 @@ const serveurTest = () => { avecEnvoiCookieSurHTTP: () => true, avecMock: () => true, avecOOTS: () => true, + clePriveeJWK: () => '', identifiantClient: () => '', identifiantRequeteur: () => '', secretJetonSession: () => 'secret',