diff --git a/src/adaptateurs/adaptateurChiffrement.js b/src/adaptateurs/adaptateurChiffrement.js index 4bf8cec..74f3b2a 100644 --- a/src/adaptateurs/adaptateurChiffrement.js +++ b/src/adaptateurs/adaptateurChiffrement.js @@ -26,8 +26,20 @@ const verifieSignatureJWTDepuisJWKS = (jwt, urlJWKS) => { return verifieJeton(jwt, jwks); }; +const genereJWT = (infos) => { + const headerJWT = { + alg: 'RS256', + }; + + return jose.importJWK(adaptateurEnvironnement.clePriveeJWK()) + .then((clePrivee) => new jose.SignJWT(infos) + .setProtectedHeader(headerJWT) + .sign(clePrivee)); +}; + module.exports = { cleHachage, dechiffreJWE, + genereJWT, verifieSignatureJWTDepuisJWKS, }; diff --git a/src/api/urlOOTS.js b/src/api/urlOOTS.js index deaec7e..1f77930 100644 --- a/src/api/urlOOTS.js +++ b/src/api/urlOOTS.js @@ -1,3 +1,13 @@ -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; + + return adaptateurChiffrement.genereJWT(infosUtilisateur) + .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..08786ba 100644 --- a/src/routes/routesOOTS.js +++ b/src/routes/routesOOTS.js @@ -1,18 +1,22 @@ 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((destination) => reponse.render('redirectionNavigateur', { destination })) + )); - routes.post('/document', (requete, reponse) => depotDonnees - .termineRecuperationDocument(Buffer.from(requete.body.document)) - .then(() => reponse.send())); + routes.post('/document', (requete, reponse) => ( + depotDonnees + .termineRecuperationDocument(Buffer.from(requete.body.document)) + .then(() => reponse.send()) + )); routes.get('/callback', (requete, reponse) => { reponse.render('redirectionNavigateur', { destination: '/' }); 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..4e95a23 100644 --- a/test/api/urlOOTS.spec.js +++ b/test/api/urlOOTS.spec.js @@ -1,25 +1,44 @@ const urlOOTS = require('../../src/api/urlOOTS'); describe("Le constructeur de l'URL de requĂȘte OOTS-France", () => { + const adaptateurChiffrement = {}; const adaptateurEnvironnement = {}; + const requete = {}; beforeEach(() => { adaptateurEnvironnement.avecOOTS = () => true; 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/serveurTest.js b/test/routes/serveurTest.js index 51e9c83..d0c2b84 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({}), };