Simplifier vos requêtes API avec les tests de Postman
Saviez-vous que le fameux client Postman dispose de son propre runtime développé en Nodejs ? Un must-have vous permettant de construire des requêtes API dynamiques en récupérant la réponse d'une autre requête API, ajouter des conditions etc...
L'authentification auprès d'une API
Prenons le cas le plus courant où vous avez besoin de vous authentifier auprès d'une API avec la méthode "Basic HTTP". Cette méthode consiste tout simplement à fournir un nom d'utilisateur et un mot de passe, le tout encodé en Base64 et le fournir dans le Header de la requête HTTP comme ceci :
echo 'username:password' | base64
dXNlcm5hbWU6cGFzc3dvcmQK
Le Header aura comme clé Authorization
et comme valeur Basic <votre user:password encodé en base64>
comme ceci :
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQK
Prenons un cas concret d'une API qui nécessite ce type d'authentification en créant notre requête dans Postman comme ceci :
Réponse HTTP :
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiQVBJIiwiMTcyLjI4LjAuMiJdLCJleHAiOjE2NzY1NjQ0MzcsImp0aSI6ImNmbjU2OTlncmZhYzczZGw4N3AwIiwibmJmIjoxNjc2NTYzMjA3LCJwZXJtaXNzaW9ucyI6WyIqIl0sInN1YiI6IjE2NzI0MTQ0MjIyNjQiLCJ1c2VybmFtZSI6InN5bm9fYWRtaW4ifQ.5rQLALiSfGf4W7Mlx59w5a9rdh19bMGzoBatkUd6cXY",
"expires_at": "2023-02-16T16:20:37Z"
}
Je peux ensuite fournir cet access_token
dans ma prochaine requête :
Cela pose deux problèmes :
- A l'expiration de cet
access_token
, il faut relancer la requête pour s'authentifier, récupérer le token, modifier le Header de la requête avec le nouveau token. - L'
access_token
est noté en clair dans Postman ce qui n'est pas sécurisé, et ne vous permet pas de pouvoir échanger avec d'autres personnes votre requête dans Postman.
C'est là qu’intervient le principe de tests dans Postman, c'est ce processus là que nous allons automatiser et sécuriser !
Notre premier test
Dans notre première requête d'authentification, la réponse HTTP est un JSON et le token est stocké dans la clé access_token
.
Nous allons donc stocker la valeur de la clé access_token
dans une variable nommée token_auth
avec le test suivant :
pm.environment.set("token_auth", pm.response.json().access_token);
Ce test vient :
- Créer une variable nommée
token_auth
- Parser le JSON contenu dans le body de la réponse HTTP et filtrer sur la clé
access_token
.
Votre test devrait ressembler à ceci :
Nous allons maintenant modifier notre requête afin d'y ajouter cette variable à la place du token en clair comme ceci :
Vous venez d'automatiser et de sécuriser votre requête pour vous authentifier auprès d'une API dans Postman ! 🎉
Pour une poignée de tests
Il est possible d'effectuer également des tests pour s'assurer qu'une clé est bien contenue dans le body de la réponse HTTP par exemple.
Toujours dans notre cas, si on crée une fonction comme ceci dans notre test :
pm.test("Le token est contenu dans la réponse", function () {
pm.expect(pm.response.json()).to.have.property('access_token');
});
Retour :
Vous pouvez inclure autant de tests unitaire que vous le souhaitez afin de sécuriser un maximum vos collections Postman.
Il est aussi possible de tester le code retour HTTP avec la fonction suivante :
Mais encore, il est aussi possible de tester la durée d'une réponse HTTP avec la fonction ci-dessous :
pm.test("Réponse HTTP inférieure à 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});