Créer une API sécurisée avec gRPC
Vitalis Ogbonna
25 août 2022
0 minutes de lectureUn appel de procédure distante de Google (gRPC) est la version open source de Google du framework d’appel de procédure distante (RPC). Il s’agit d’un protocole de communication qui s’appuie sur HTTP/2 et les technologies de tampon de protocole (protobuf). gRPC permet à un client ou à un serveur distant de communiquer avec un autre serveur en appelant simplement la fonction de ce dernier comme si elle était locale. Dans les systèmes distribués, la communication et le transfert de grands volumes de données entre client et serveur s’en trouvent simplifiés.
Comme les autres systèmes RPC, gRPC définit un service. Il en spécifie les méthodes et les types de retour à l’aide de protobuf — un protocole de sérialisation et de désérialisation de Google — afin de faciliter la définition des services et la génération automatique des bibliothèques clientes. gRPC utilise ce protocole, actuellement en version 3, comme langage de définition d’interface et ensemble d’outils de sérialisation.
Pour la plupart des applications modernes, gRPC est un excellent choix grâce à sa prise en charge remarquable de tous les types de données. Il convient particulièrement aux volumes de données importants, comme les données diffusées en continu, et peut être excessif pour les applications simples où le transfert de grandes quantités de données est peu préoccupant.
Cet article vous montre comment utiliser gRPC pour faire communiquer un client et un serveur, à la manière d’applications, entre deux applications Node.js. Nous présenterons également quelques mesures de sécurité à prendre lors de l’utilisation de gRPC comme mécanisme de communication dans vos services.
Prérequis du tutoriel
Pour suivre ce tutoriel, vous devez avoir installé OpenSSL et Node.js (version 4.0 ou ultérieure) sur votre ordinateur. Une bonne compréhension de Node.js et de JavaScript est indispensable. Vous devez également vous assurer que votre environnement de travail dispose des privilèges d’administrateur.
Configurer le projet Node.js
Pour commencer, créez un dossier appelé event-app-node-grpc afin de définir la structure des dossiers de l’application, puis initialisez un projet Node.js avec npm en saisissant les commandes suivantes :
Une fois votre application initialisée, créez la structure de dossiers suivante. Vous pouvez consulter sur GitHub le code complet utilisé dans ce tutoriel :
Installer les packages
Dans le terminal, accédez au répertoire racine de votre application. Installez les packages suivants à l’aide de la commande npm install, comme indiqué dans l’extrait de code ci-dessous :
Voyons à quoi servent les packages que vous venez d’installer dans l’extrait de code ci-dessus :
Expressest le serveur HTTP de votre application.@grpc/grpc-jsest une bibliothèque gRPC pour Node.js. Elle nous permet de créer un service gRPC dans l’environnement d’exécution Node.js.@grpc/proto-loaderest un package nécessaire au chargement des fichiers protobuf utilisés avec gRPC. Il utilise le package version 3 deprotobuf.js.
Après avoir installé les packages ci-dessus, ouvrez le fichier package.json et ajoutez les configurations supplémentaires suivantes aux balises scripts, comme indiqué dans l’extrait de code ci-dessous :
Les configurations supplémentaires de l’extrait de code ci-dessus concernent la configuration de l’environnement d’exécution de l’application et la génération du certificat SSL. Une fois ces configurations ajoutées, votre fichier package.json mis à jour devrait ressembler à l’extrait de code ci-dessous :
L’extrait de code ci-dessus présente le fichier package.json mis à jour après l’ajout, dans la balise scripts, des commandes de configuration de l’environnement d’exécution de l’application et de génération du certificat SSL.
Définir le tampon de protocole
Ce tutoriel explique comment utiliser gRPC dans une application simple de suivi d’événements. Cette application de démonstration récupère les détails d’un événement et les enregistre dans une base de données en mémoire, tout en permettant de mettre à jour, récupérer et supprimer les données de l’événement.
Dans les applications gRPC, l’interface de service et les charges utiles requises sont définies dans un fichier protobuf afin de permettre la communication entre différentes applications. Les fichiers protobuf ont l’extension .proto, comme illustré dans le schéma de configuration de notre projet.
Dans le répertoire racine de votre application, créez maintenant un fichier events.proto et ajoutez-y le code suivant. Vous pouvez vous reporter au schéma de structure du projet défini précédemment.
Dans les extraits de code de définition proto ci-dessus, nous avons d’abord spécifié la version du tampon de protocole à l’aide de la définition syntax = "proto3", puis défini le service de protocole.
Ensuite, dans la description du service d’événements du protocole, nous avons créé un service appelé EventService. Nous avons ensuite créé des fonctions rpc au sein de ce service, avec leurs paramètres requis et leurs valeurs de retour attendues. Vous pouvez définir autant de services que nécessaire pour votre application, mais, pour simplifier, nous n’en définissons qu’un seul.
Nous avons également défini les types de données de la fonction rpc dans la définition EventService, ainsi que les valeurs de retour à l’aide du système de numérotation des champs propre à gRPC. Celui-ci indique le nombre d’octets utilisés lors de l’encodage. Pour en savoir plus, consultez la documentation officielle de protobuf.
Créer le serveur gRPC
En suivant la structure de dossiers ci-dessus, créez un dossier server dans le répertoire racine de votre application, puis créez un fichier index.js dans ce dossier. Collez l’extrait de code suivant dans le fichier server/index.js que vous venez de créer :
Dans l’extrait de code ci-dessus, nous avons importé le fichier events.proto défini précédemment dans la variable PROTO_PATH, puis l’avons chargé à l’aide de la méthode loadSync de la bibliothèque protoLoader. Nous avons ensuite enregistré les définitions proto dans la variable eventsProto, qui les contient toutes.
Ajoutez ensuite l’extrait de code suivant juste après la variable eventsProto dans le fichier server/index.js défini précédemment.
Dans l’extrait de code ci-dessus, nous avons importé le package node:crypto et sa fonction randomUUID, qui sert à générer des chaînes aléatoires uniques pour les identifiants de nos événements. Comme nous utilisons une base de données en mémoire pour ce tutoriel, nous la définirons sous forme de tableau pour stocker notre liste d’événements. Nous initialiserons ensuite notre instance de serveur en appelant une nouvelle méthode grpc.Server.
Nous allons ensuite enregistrer les services de l’application. Pour ce faire, ajoutez l’extrait de code suivant juste après la variable server dans l’extrait ci-dessus :
Dans l’extrait de code ci-dessus, nous avons appelé la méthode addService sur l’instance du serveur gRPC pour enregistrer les services de l’application, qui effectuent essentiellement des opérations de création, de lecture et de mise à jour des événements.
Pour permettre au serveur de l’application de démarrer, collez l’extrait de code suivant juste après la méthode addService de l’extrait ci-dessus.
Créer le client gRPC
En suivant la structure de dossiers ci-dessus, créez un dossier client dans le répertoire racine de votre application, puis créez-y deux fichiers : index.js et app.js. Collez l’extrait de code suivant dans le fichier client/app.js.
Dans l’extrait de code ci-dessus, nous avons importé les définitions proto créées précédemment, les avons chargées avec protoLoader, connecté le client grpc à l’adresse IP de l’application serveur, puis exporté le service d’événements sous le nom de variable client. Nous avons également associé un certificat SSL au client afin d’authentifier et de chiffrer les communications entre le client et le serveur.
Collez ensuite l’extrait de code suivant dans le fichier client/index.js :
Dans l’extrait de code ci-dessus, nous avons importé event-service depuis le fichier client/app.js. Nous avons ensuite configuré un serveur Express avec des points de terminaison simples pour gérer la creation, la update, la fetch et la delete des événements, en appelant à distance l’application serveur à l’aide de gRPC.
Tester les applications serveur et client
Nous pouvons maintenant tester notre travail pour vérifier que tout fonctionne comme prévu.
Le serveur
Dans le terminal, accédez au répertoire racine du projet, puis exécutez les commandes suivantes :
L’application serveur devrait être accessible à l’adresse http://localhost:50051 :
Le client
Ouvrez une nouvelle fenêtre de terminal, accédez au dossier client depuis le répertoire racine de votre application, puis exécutez les commandes suivantes :
L’application devrait être accessible à l’adresse http://localhost:50050 :
Pour tester, accédez à localhost:50050 dans votre navigateur ou utilisez un outil de test d’API comme Postman. Vous devriez voir l’événement par défaut que nous avons ajouté initialement à notre tableau d’événements. La réponse devrait être identique à la capture d’écran ci-dessous :

Authentifier et sécuriser l’API gRPC
Le protocole gRPC prend en charge différents mécanismes d’authentification, ce qui facilite son adaptation aux systèmes nouveaux ou existants. Pour mettre en œuvre l’authentification dans les communications client-serveur gRPC, nous pouvons utiliser des mécanismes recommandés comme SSL et TLS, avec ou sans authentification par jeton Google. Nous pouvons également créer une authentification personnalisée en étendant simplement la fonction d’authentification intégrée à gRPC.
Par défaut, gRPC intègre les mécanismes d’authentification suivants :
SSL et TLS pour authentifier le serveur et chiffrer les données échangées entre le client et le serveur
ALTS (un protocole de transport et d’authentification mutuelle conçu par Google) pour sécuriser les communications RPC des applications exécutées sur Google Cloud Platform (GCP)
Un mécanisme générique d’authentification par jeton qui associe des identifiants basés sur des métadonnées aux requêtes et aux réponses
Comme indiqué dans l’introduction du tutoriel, nous allons mettre en œuvre l’authentification avec SSL, puis modifier nos fichiers client/app.js et server/index.js pour prendre en charge cette nouvelle configuration.
Générer un certificat SSL avec OpenSSL
Commençons par générer un certificat SSL avec OpenSSL. Vous devez avoir OpenSSL installé et disposer des autorisations nécessaires pour exécuter des scripts bash. Ces conditions sont indispensables pour éviter les erreurs d’autorisation.
Dans la structure de dossiers de notre projet, créez un dossier scripts, puis un fichier appelé generate-certs.sh à l’intérieur. Collez-y l’extrait de code suivant :
Le code ci-dessus génère les certificats SSL nécessaires pour établir une connexion sécurisée et chiffrée entre les applications serveur et client. Lors de son exécution, il crée un dossier certs, génère avec OpenSSL les certificats SSL du serveur et du client, puis les enregistre dans le dossier certs. Pour en savoir plus sur ces configurations et leur rôle, consultez le site Web d’OpenSSL.
Générer un certificat SSL pour l’application avec npm
Utilisez maintenant le script pour générer un certificat SSL pour votre application. Dans le terminal, exécutez les commandes suivantes depuis le répertoire racine de l’application.
Cette opération crée un dossier certs contenant les certificats SSL générés.
Notez que des privilèges d’administrateur sont nécessaires. Si vous obtenez une erreur d’autorisation en exécutant le script, utilisez les commandes suivantes pour lui accorder le privilège d’exécution, puis réessayez.
Le résultat suivant devrait s’afficher dans votre terminal :
Mettre à jour les fichiers client/app.js et server/index.js
Nous avons généré les certificats SSL nécessaires à l’authentification de nos API gRPC. Nous allons maintenant modifier les fichiers client/index.js et server/index.js pour utiliser ces certificats.
Dans le fichier client/app.js mis à jour ci-dessous, nous avons ajouté le module fs pour lire les certificats générés. Nous avons ensuite utilisé ces certificats pour créer des identifiants SSL gRPC, puis les avons appliqués au service gRPC.
Dans le fichier server/index.js mis à jour ci-dessous, nous avons également ajouté le module fs pour lire les certificats générés. Nous les avons ensuite utilisés pour créer des identifiants SSL gRPC et les avons appliqués au serveur.
Exécuter les applications serveur et client
Nous avons mis en place avec succès une solution de gestion des événements conforme aux spécifications gRPC. Pour tester les points de terminaison, démarrez l’application depuis le terminal en suivant les étapes ci-dessous.
Le serveur
Dans le terminal, accédez au répertoire racine du projet et exécutez les commandes suivantes :
Une fois ces commandes exécutées, l’application serveur devrait être accessible à l’adresse http://0.0.0.0:50051 :
Le client
Ouvrez une nouvelle fenêtre de terminal, accédez au dossier client depuis le répertoire racine de votre application, puis exécutez les commandes suivantes :
Une fois ces commandes exécutées, l’application cliente devrait être accessible à l’adresse http://localhost:50050 :
Pour tester l’application, accédez à localhost:50050 dans votre navigateur ou utilisez un outil de test d’API comme Postman. Vous devriez voir l’événement par défaut que nous avons ajouté initialement à notre tableau d’événements. Le résultat devrait être identique à la capture d’écran ci-dessous :

Vous pouvez ensuite tester les autres points de terminaison ajoutés à l’application pour vérifier que tout fonctionne comme prévu.
Vous avez créé une API sécurisée avec gRPC !
Dans ce tutoriel, nous avons créé une API simple avec gRPC et Node.js, en présentant son fonctionnement et ses nombreux avantages, comme HTTP/2 et SSL/TLS, qui assurent l’authentification et le chiffrement de bout en bout afin de renforcer la sécurité des API.
Malgré ces avantages, gRPC présente aussi des inconvénients : prise en charge limitée par les navigateurs, format de données non lisible par l’humain, courbe d’apprentissage abrupte et prise en charge limitée de la mise en cache en périphérie. Malgré ces limites, gRPC reste le meilleur choix pour la communication entre microservices internes, grâce à ses performances inégalées et à sa prise en charge de plusieurs langages de programmation. Le protocole gRPC est impressionnant et s’est largement imposé dans le secteur depuis sa première publication en août 2016. Son adoption devrait continuer à progresser.
gRPC offre de nombreuses autres possibilités. L’exemple de ce tutoriel ne représente qu’une infime partie de ce qu’il permet de faire. Consultez la documentation pour approfondir vos connaissances de gRPC et améliorer les processus de communication de votre application ainsi que vos stratégies de sécurisation de gRPC.
