diff --git a/server.js b/server.js index 2340f55..005669c 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,7 @@ const SiteVitrine = require('./src/siteVitrine'); const adaptateurChiffrement = require('./src/adaptateurs/adaptateurChiffrement'); const adaptateurEnvironnement = require('./src/adaptateurs/adaptateurEnvironnement'); const adaptateurFranceConnectPlus = require('./src/adaptateurs/adaptateurFranceConnectPlus'); +const journal = require('./src/adaptateurs/journal'); const FabriqueSessionFCPlus = require('./src/modeles/fabriqueSessionFCPlus'); const Middleware = require('./src/routes/middleware'); @@ -16,15 +17,12 @@ const serveur = SiteVitrine.creeServeur({ adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, }); const port = process.env.PORT || 3000; serveur.ecoute(port, () => { - /* eslint-disable no-console */ - - console.log(`Le site vitrine est démarré et écoute le port ${port} !…`); - - /* eslint-enable no-console */ + journal.consigne(`Le site vitrine est démarré et écoute le port ${port} !…`); }); diff --git a/src/adaptateurs/journal.js b/src/adaptateurs/journal.js new file mode 100644 index 0000000..4229127 --- /dev/null +++ b/src/adaptateurs/journal.js @@ -0,0 +1,5 @@ +/* eslint-disable no-console */ +const consigne = console.log; +/* eslint-enable no-console */ + +module.exports = { consigne }; diff --git a/src/api/connexionFCPlus.js b/src/api/connexionFCPlus.js index e63ec9b..39563df 100644 --- a/src/api/connexionFCPlus.js +++ b/src/api/connexionFCPlus.js @@ -1,7 +1,12 @@ const { stockeDansCookieSession } = require('../routes/utils'); const connexionFCPlus = (config, code, requete, reponse) => { - const { adaptateurChiffrement, adaptateurEnvironnement, fabriqueSessionFCPlus } = config; + const { + adaptateurChiffrement, + adaptateurEnvironnement, + fabriqueSessionFCPlus, + journal, + } = config; const secret = adaptateurEnvironnement.secretJetonSession(); @@ -13,8 +18,9 @@ const connexionFCPlus = (config, code, requete, reponse) => { return stockeDansCookieSession(infos, adaptateurChiffrement, requete); })) .then(() => reponse.render('redirectionNavigateur', { destination: '/' })) - .catch(() => { + .catch((e) => { requete.session.jeton = undefined; + journal.consigne(`Échec authentification (${e.message})`); reponse.render('redirectionNavigateur', { destination: '/auth/fcplus/destructionSession' }); }); }; diff --git a/src/routes/routesAuth.js b/src/routes/routesAuth.js index 410d67f..dd5a90e 100644 --- a/src/routes/routesAuth.js +++ b/src/routes/routesAuth.js @@ -11,6 +11,7 @@ const routesAuth = (config) => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, } = config; @@ -56,12 +57,13 @@ const routesAuth = (config) => { (...args) => middleware.verifieTamponUnique(...args), (requete, reponse) => { const { code } = requete.query; - connexionFCPlus( - { adaptateurChiffrement, adaptateurEnvironnement, fabriqueSessionFCPlus }, - code, - requete, - reponse, - ); + const adaptateurs = { + adaptateurChiffrement, + adaptateurEnvironnement, + fabriqueSessionFCPlus, + journal, + }; + connexionFCPlus(adaptateurs, code, requete, reponse); }, ); diff --git a/src/siteVitrine.js b/src/siteVitrine.js index 9fc84d6..b465ae1 100644 --- a/src/siteVitrine.js +++ b/src/siteVitrine.js @@ -10,6 +10,7 @@ const creeServeur = (config) => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, } = config; let serveur; @@ -35,6 +36,7 @@ const creeServeur = (config) => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, })); diff --git a/test/api/connexionFCPlus.spec.js b/test/api/connexionFCPlus.spec.js index 458fca8..c311366 100644 --- a/test/api/connexionFCPlus.spec.js +++ b/test/api/connexionFCPlus.spec.js @@ -4,7 +4,13 @@ describe('Le requêteur de connexion FC+', () => { const adaptateurChiffrement = {}; const adaptateurEnvironnement = {}; const fabriqueSessionFCPlus = {}; - const config = { adaptateurChiffrement, adaptateurEnvironnement, fabriqueSessionFCPlus }; + const journal = {}; + const config = { + adaptateurChiffrement, + adaptateurEnvironnement, + fabriqueSessionFCPlus, + journal, + }; const requete = {}; const reponse = {}; @@ -15,6 +21,7 @@ describe('Le requêteur de connexion FC+', () => { fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ enJSON: () => Promise.resolve({}), }); + journal.consigne = () => {}; requete.session = {}; reponse.render = () => Promise.resolve(); reponse.status = () => reponse; @@ -39,25 +46,38 @@ describe('Le requêteur de connexion FC+', () => { .then(() => expect(requete.session.jeton).toBeUndefined()); }); - it('redirige vers la destruction de session FC+ si le nonce retourné est différent du nonce en session', () => { - expect.assertions(2); - adaptateurChiffrement.verifieJeton = () => Promise.resolve({ nonce: 'unNonce' }); + describe('quand nonce retourné diffère du nonce en session', () => { + beforeEach(() => { + adaptateurChiffrement.verifieJeton = () => Promise.resolve({ nonce: 'unNonce' }); - requete.session.jeton = { nonce: 'abcde' }; - fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ - enJSON: () => Promise.resolve({ nonce: 'oups' }), + requete.session.jeton = { nonce: 'abcde' }; + fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ + enJSON: () => Promise.resolve({ nonce: 'oups' }), + }); + }); + + it("journalise l'erreur", () => { + expect.assertions(1); + + journal.consigne = (entree) => { expect(entree).toBe('Échec authentification (nonce invalide)'); }; + + return connexionFCPlus(config, 'unCode', requete, reponse); }); - reponse.render = (nomModelePage, { destination }) => { - try { - expect(nomModelePage).toBe('redirectionNavigateur'); - expect(destination).toBe('/auth/fcplus/destructionSession'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return connexionFCPlus(config, 'unCode', requete, reponse); + it('redirige vers la destruction de session FC+', () => { + expect.assertions(2); + + reponse.render = (nomModelePage, { destination }) => { + try { + expect(nomModelePage).toBe('redirectionNavigateur'); + expect(destination).toBe('/auth/fcplus/destructionSession'); + return Promise.resolve(); + } catch (e) { + return Promise.reject(e); + } + }; + + return connexionFCPlus(config, 'unCode', requete, reponse); + }); }); }); diff --git a/test/routes/serveurTest.js b/test/routes/serveurTest.js index 84c5723..b061027 100644 --- a/test/routes/serveurTest.js +++ b/test/routes/serveurTest.js @@ -6,6 +6,7 @@ const serveurTest = () => { let adaptateurEnvironnement; let adaptateurFranceConnectPlus; let fabriqueSessionFCPlus; + let journal; let middleware; let serveur; @@ -44,6 +45,10 @@ const serveurTest = () => { nouvelleSession: () => Promise.resolve({ enJSON: () => Promise.resolve({}) }), }; + journal = { + consigne: () => {}, + }; + middleware = new MiddlewareFantaisie({}); serveur = OOTS_FRANCE.creeServeur({ @@ -51,6 +56,7 @@ const serveurTest = () => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, }); @@ -65,6 +71,7 @@ const serveurTest = () => { adaptateurFranceConnectPlus: () => adaptateurFranceConnectPlus, arrete, fabriqueSessionFCPlus: () => fabriqueSessionFCPlus, + journal: () => journal, initialise, middleware: () => middleware, port,