Pour authentifier et authorisé un client à faire une requête sur notre api, il dois construire une signature et l'envoyer avec sa requête.
Le calcule est inspiré de ce que fait AWS pour authentifer ces clients.
Pour le calcule de la signature, nous avons besoin de la key et du secret forunis quand on créer une appliaction.
Exemple JS:
const shaObj = new jsSHA("SHA-1", "TEXT", {
hmacKey: { value: secret, format: "TEXT" },
});
const url = req.url.split('?')[0]; // On ignore la querystring
const data = `${key}${url}`;
shaObj.update(data);
const hmacHEX = shaObj.getHash("HEX");
const hmac64 = window.btoa(hmacHEX);Pour envoyer la key et la signature , il faut le faire dans les headers, Dans respectivement le header x-api-key pour la key et signature pour la signature.
Pour implémenter la signature dans swagger , il a fallu customizer le swagger-ui pour y inclure un requestInterceptor.
requestInterceptor: req => {
const apiKeyheader = req.headers['x-api-key'];
if(!apiKeyheader){
return;
}
const key = apiKeyheader.split(":")[0];
const secret = apiKeyheader.split(":")[1];
const shaObj = new jsSHA("SHA-1", "TEXT", {
hmacKey: { value: secret, format: "TEXT" },
});
const url = req.url.split('?')[0];
const data = `${key}${url}`;
shaObj.update(data);
const hmacHEX = shaObj.getHash("HEX");
const hmac64 = window.btoa(hmacHEX);
req.headers['x-api-key']= key;
req.headers.signature = hmac64;
return req;
},Pour ce faire, on a pris la version buildé de swagger-ui et placé son dossier dans le dossier ressources pour qu'il soit servit statiquement par notre serveur spring.
-
Lancer le docker-compose qui se trouve dans
docker/environment/devavecdocker-compose up -
Dans le dossier
impl:mvn clean package mvn spring-boot:run
- S'assurer d'avoir la dernière version des image avec
docker-compose pull - Dans le dossier
docker/environment/prod, lancer le docker-compose avecdocker-compose up
-
S'assurer d'avoir une version du serveur qui tourne (voir au dessus)
-
Dans le dossier
specs:mvn clean test
- S'assurer d'avoir un serveur qui tourne
- Ouvir le ficher
gameificatorTest.jmxdu dossierjmeteravec Apache Jmeter et lancer les tests (Avec le petit bouton play)
Le leaderboard pour un pointScale donné est paginé pour ne pas récupérer tout les utilisateurs d'un seul coup. Pour ce faire nous utilisons un PagingAndSortingRepository sur l'entité User. Le soucis est que nous calculons les scores des utilisateurs seulement après avoir récupéré les User. Nous nous trouvons donc dans une situation ou chaque page est triée par le score décroissant des users. Mais les pages ne sont pas triès entres elles. Donc la page 3 pourrait avoir des scores de User supérieurs à ceux de la page 1.
La correction de ce problème passerait par l'écriture d'une requête en jpql pour calculer directement le score des users en fonction d'un pointScale donnée et sur ce résultat on applique la pagination avec le ``PagingAndSortingRepository`.
- Simon Walther - simon.walther@heig-vd.ch
- Didier Page - didier.page@heig-vd.ch
- Eric Noel - eric.noel@heig-vd.ch
- Guillaume Laubscher - guillaume.laubscher@heig-vd.ch
- Bruno Legrand - bruno.legrand@heig-vd.ch
