Skip to content

Commit

Permalink
Transfère un jeton utilisateur lors de la récupération de document
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabinout committed Dec 3, 2024
1 parent 9239d33 commit 7c59f76
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 14 deletions.
13 changes: 12 additions & 1 deletion src/api/urlOOTS.js
Original file line number Diff line number Diff line change
@@ -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;
15 changes: 10 additions & 5 deletions src/routes/routesOOTS.js
Original file line number Diff line number Diff line change
@@ -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))
Expand Down
2 changes: 1 addition & 1 deletion src/siteVitrine.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 }));
Expand Down
34 changes: 27 additions & 7 deletions test/api/urlOOTS.spec.js
Original file line number Diff line number Diff line change
@@ -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'));
});
});
13 changes: 13 additions & 0 deletions test/routes/routesOOTS.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions test/routes/serveurTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ const serveurTest = () => {
adaptateurChiffrement = {
cleHachage: () => '',
dechiffreJWE: () => Promise.resolve(),
genereJWT: () => Promise.resolve(''),
verifieSignatureJWTDepuisJWKS: () => Promise.resolve({}),
};

adaptateurEnvironnement = {
avecEnvoiCookieSurHTTP: () => true,
avecMock: () => true,
avecOOTS: () => true,
clePriveeJWK: () => '',
identifiantClient: () => '',
identifiantRequeteur: () => '',
secretJetonSession: () => 'secret',
Expand Down

0 comments on commit 7c59f76

Please sign in to comment.