From 1f98ac2e3998614c8a887bddaf9e09a59fa09309 Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Mon, 17 Jun 2024 14:23:14 +0200 Subject: [PATCH] =?UTF-8?q?Introduis=20objet=20m=C3=A9tier=20`Utilisateur`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note pour plus tard : - Quand on s'occupera de revoir l'utilisation du cookie de session, il faudra regarder où est-ce qu'on veut initialiser `jwtSessionFCPlus`, actuellement stocké dans `Utilisateur` Co-authored-by: Fabien Lamarque --- src/modeles/sessionFCPlus.js | 10 ++++++---- src/modeles/utilisateur.js | 13 +++++++++++++ src/routes/middleware.js | 6 +++++- src/vues/accueil.pug | 2 +- test/modeles/sessionFCPlus.spec.js | 5 +++-- test/modeles/utilisateur.spec.js | 8 ++++++++ test/routes/middleware.spec.js | 4 ++-- test/routes/routesAuth.spec.js | 3 ++- test/routes/routesBase.spec.js | 9 +++++---- 9 files changed, 45 insertions(+), 15 deletions(-) create mode 100644 src/modeles/utilisateur.js create mode 100644 test/modeles/utilisateur.spec.js diff --git a/src/modeles/sessionFCPlus.js b/src/modeles/sessionFCPlus.js index 334bcac..05d3ee7 100644 --- a/src/modeles/sessionFCPlus.js +++ b/src/modeles/sessionFCPlus.js @@ -29,10 +29,12 @@ class SessionFCPlus { jwtInfosUtilisateur, this.urlClefsPubliques, )) - .then((infosDechiffrees) => Object.assign( - infosDechiffrees, - { jwtSessionFCPlus: this.jwt, nonce: this.nonce }, - )) + .then((infosDechiffrees) => ({ + prenom: infosDechiffrees.given_name, + nomUsage: infosDechiffrees.family_name, + jwtSessionFCPlus: this.jwt, + nonce: this.nonce, + })) .catch((e) => Promise.reject(new ErreurEchecAuthentification(e.message))); } diff --git a/src/modeles/utilisateur.js b/src/modeles/utilisateur.js new file mode 100644 index 0000000..2e50775 --- /dev/null +++ b/src/modeles/utilisateur.js @@ -0,0 +1,13 @@ +class Utilisateur { + constructor(donnees) { + this.prenom = donnees.prenom; + this.nomUsage = donnees.nomUsage; + this.jwtSessionFCPlus = donnees.jwtSessionFCPlus; + } + + afficheToi() { + return `${this.prenom} ${this.nomUsage}`; + } +} + +module.exports = Utilisateur; diff --git a/src/routes/middleware.js b/src/routes/middleware.js index efbd3b5..591b591 100644 --- a/src/routes/middleware.js +++ b/src/routes/middleware.js @@ -1,3 +1,5 @@ +const Utilisateur = require('../modeles/utilisateur'); + class Middleware { constructor(config) { this.adaptateurChiffrement = config.adaptateurChiffrement; @@ -6,7 +8,9 @@ class Middleware { renseigneUtilisateurCourant(requete, _reponse, suite) { return this.adaptateurChiffrement.verifieJeton(requete.session.jeton, this.secret) - .then((infosUtilisateur) => { requete.utilisateurCourant = infosUtilisateur; }) + .then((infosUtilisateur) => { + requete.utilisateurCourant = new Utilisateur(infosUtilisateur); + }) .catch(() => { requete.utilisateurCourant = undefined; }) .then(() => suite()); } diff --git a/src/vues/accueil.pug b/src/vues/accueil.pug index e3bf653..64bdcef 100644 --- a/src/vues/accueil.pug +++ b/src/vues/accueil.pug @@ -6,7 +6,7 @@ block styles block page if avecConnexionFCPlus if infosUtilisateur - p= `Utilisateur courant : ${infosUtilisateur.given_name} ${infosUtilisateur.family_name}` + p Utilisateur courant : #{infosUtilisateur.afficheToi()} a(href = '/auth/fcplus/destructionSession') Déconnexion else p Pas d'utilisateur courant diff --git a/test/modeles/sessionFCPlus.spec.js b/test/modeles/sessionFCPlus.spec.js index 54ecc34..ceff5ea 100644 --- a/test/modeles/sessionFCPlus.spec.js +++ b/test/modeles/sessionFCPlus.spec.js @@ -86,7 +86,7 @@ describe('Une session FranceConnect+', () => { try { expect(jwt).toBe('aaa'); expect(url).toBe('http://example.com'); - return Promise.resolve({ uneClef: 'uneValeur' }); + return Promise.resolve({ given_name: 'Anne', family_name: 'Durand' }); } catch (e) { return Promise.reject(e); } @@ -96,7 +96,8 @@ describe('Une session FranceConnect+', () => { return session.enJSON() .then((json) => { - expect(json).toHaveProperty('uneClef', 'uneValeur'); + expect(json).toHaveProperty('prenom', 'Anne'); + expect(json).toHaveProperty('nomUsage', 'Durand'); expect(json).toHaveProperty('jwtSessionFCPlus', '999'); }); }); diff --git a/test/modeles/utilisateur.spec.js b/test/modeles/utilisateur.spec.js new file mode 100644 index 0000000..f2e8f14 --- /dev/null +++ b/test/modeles/utilisateur.spec.js @@ -0,0 +1,8 @@ +const Utilisateur = require('../../src/modeles/utilisateur'); + +describe("L'utilisateur courant", () => { + it("sait s'afficher", () => { + const utilisateur = new Utilisateur({ prenom: 'Juliette', nomUsage: 'Haucourt' }); + expect(utilisateur.afficheToi()).toBe('Juliette Haucourt'); + }); +}); diff --git a/test/routes/middleware.spec.js b/test/routes/middleware.spec.js index 393cefc..4be4ebf 100644 --- a/test/routes/middleware.spec.js +++ b/test/routes/middleware.spec.js @@ -35,14 +35,14 @@ describe('Le middleware OOTS-France', () => { }); it("renseigne les infos de l'utilisateur courant dans la requête", (suite) => { - adaptateurChiffrement.verifieJeton = () => Promise.resolve({ infos: 'des infos' }); + adaptateurChiffrement.verifieJeton = () => Promise.resolve({ prenom: 'Pierre', nomUsage: 'Jax' }); const middleware = new Middleware(config); expect(requete.utilisateurCourant).toBeUndefined(); middleware.renseigneUtilisateurCourant(requete, null, () => { try { - expect(requete.utilisateurCourant).toEqual({ infos: 'des infos' }); + expect(requete.utilisateurCourant).toEqual({ prenom: 'Pierre', nomUsage: 'Jax' }); suite(); } catch (e) { suite(e); } }) diff --git a/test/routes/routesAuth.spec.js b/test/routes/routesAuth.spec.js index d163ca7..762175f 100644 --- a/test/routes/routesAuth.spec.js +++ b/test/routes/routesAuth.spec.js @@ -2,6 +2,7 @@ const axios = require('axios'); const { leveErreur } = require('./utils'); const serveurTest = require('./serveurTest'); +const Utilisateur = require('../../src/modeles/utilisateur'); describe('Le serveur des routes `/auth`', () => { const serveur = serveurTest(); @@ -143,7 +144,7 @@ describe('Le serveur des routes `/auth`', () => { describe('sur GET /auth/fcplus/destructionSession', () => { it("appelle le middleware pour renseigner les infos de l'utilisateur courant", () => { serveur.middleware().reinitialise({ - utilisateurCourant: { given_name: '', family_name: '', jwtSessionFCPlus: 'abcdef' }, + utilisateurCourant: new Utilisateur({ prenom: 'Jean', nomUsage: 'Max', jwtSessionFCPlus: 'abcdef' }), }); serveur.adaptateurFranceConnectPlus().urlDestructionSession = () => Promise.resolve(`http://localhost:${port}`); diff --git a/test/routes/routesBase.spec.js b/test/routes/routesBase.spec.js index cea2ef3..151221a 100644 --- a/test/routes/routesBase.spec.js +++ b/test/routes/routesBase.spec.js @@ -2,6 +2,7 @@ const axios = require('axios'); const serveurTest = require('./serveurTest'); const { leveErreur } = require('./utils'); +const Utilisateur = require('../../src/modeles/utilisateur'); describe('Le serveur des routes `/`', () => { const serveur = serveurTest(); @@ -25,10 +26,10 @@ describe('Le serveur des routes `/`', () => { it("affiche prénom et nom de l'utilisateur courant s'il existe", () => { serveur.middleware().reinitialise({ - utilisateurCourant: { - given_name: 'Sandra', - family_name: 'Nicouette', - }, + utilisateurCourant: new Utilisateur({ + prenom: 'Sandra', + nomUsage: 'Nicouette', + }), }); return axios.get(`http://localhost:${port}/`)