API Frontend
Le rôle de cette API est d'effectuer la liaison entre le frontend et la base de données. Elle se charge donc principalement de faire du CRUD (Create Read Update Delete) sur les données de la base de données, et de quelques fois faire appel au serveur de stockage d'objets et à l'API backend afin d'effectuer certains calculs.
Cette API à été développée en TypeScript à l'aide de Koa, car le développement avec est assez simple, et que c'est une technologie que nous avons vu en formation pendant le stage.
Authentification et sécurité
Cette API permet de gérer l'ensemble des données du projet. Une personne malveillante qui aurait accès à l'API aurait donc la possibilité de détruire complètement l'ensemble des données. Afin d'éviter cela, il est donc nécessaire d'ajouter de la sécurité en authentifiant les personnes se connectant à l'API.
Pour cela, nous fonctionnons à l'aide d'un système d'authentification avec identifiant et mot de passe. Un compte super-utilisateur (dont les identifiants sont définis par des variables d'environnement) peut créer des comptes administrateurs, qui auront accès à l'entièreté du projet. Afin d'appeler la moindre route sur l'API, il est nécessaire d'être connecté.
Pour se connecter, le frontend va appeler la route POST /auth/login avec l'identifiant et le mot de passe de l'opérateur, et l'API renverra un Access Token ainsi qu'un Refresh Token. L'Access Token est conservé dans le code JavaScript du frontend et a une période de validité de quelques minutes, et le Refresh Token est conservé dans les cookies du navigateur (avec l'attribut HttpOnly) et a une période de validité plus longue.
Lorsque le frontend effectue des requêtes à l'API, il fournit en plus l'Access Token dans les headers de la requête. Si le token est valide, l'API accepte la requête. Sinon, le frontend fait un appel à la route POST /auth/refresh avec son Refresh Token dans les headers de la requête, et l'API renvoie un nouvel Access Token que le frontend peut alors utiliser.
Il n'y a pour l'instant pas de système de permissions permettant de restreindre les accès des comptes, car cela aurait pris trop de temps à développer, mais cela pourrait être une évolution future.
Stateless
Cette API est stateless, car elle ne conserve pas de données en local, toutes les données sont sauvegardées dans les autres services.