
Partager:
Julia s'engage à aider ses collègues développeurs en créant des tutoriels, des guides et des ressources pratiques. Grâce à son expérience en matière de sensibilisation et d'éducation, elle vise à rendre la technologie plus accessible et à améliorer l'expérience globale des développeurs. Vous pouvez souvent la trouver lors d'événements communautaires locaux.
cURL, HTTPS et l'API SMS de Nexmo - Derrière les coulisses
Envoyer un SMS avec l'API Nexmo est aussi simple que d'initier une requête à l'URL : https://rest.nexmo.com/sms/json. Mais vous êtes-vous déjà demandé ce qui se passe en coulisses ? Lorsque vous demandez des informations sur Internet, que fait votre ordinateur ? Que fait le serveur ?
Ce sont les questions auxquelles nous tenterons de répondre ci-dessous, alors suivez-nous si vous voulez en avoir le cœur net.
Avant de commencer
Avant de commencer, tu auras besoin de quelques éléments :
Le cURL pour envoyer et recevoir des données.
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
Effectuer la requête https avec cURL
L'envoi d'une https à l'API SMS de Nexmo est simple. Il suffit de remplacer les variables suivantes dans l'exemple ci-dessous, et le message devrait être envoyé.
| KEY | DESCRIPTION |
|---|---|
NEXMO_KEY |
Your Nexmo API key, shown in your account overview. |
NEXMO_SECRET |
Your Nexmo API secret, shown in your account overview. |
TO_NUMBER |
The number you are sending the SMS to in E.164 format. For example 447401234567. |
SENDER_ID |
The number or text shown on a handset when it displays your message. You can set a custom Alphanumeric SENDER_ID to represent your brand better if this feature is supported in your country. |
Vous pouvez invoquer curl avec options de ligne de commande accompagnant la ou les URL. Ces options transmettent à curl des informations sur la manière dont vous souhaitez qu'il se comporte.
La documentation Nexmo utilise -d pour envoyer des chaînes de données dans une requête POST à un serveur, et nous ajoutons -v/--verbose pour activer le mode verbeux.
Ce dernier nous permet de voir les informations supplémentaires fournies par les internes de curl, ainsi que tous les en-têtes qu'il envoie et reçoit. Nous avons également ajouté --trace-time pour que cURL fasse précéder toutes les sorties verbeuses d'une horloge haute résolution indiquant le moment où la ligne est imprimée.
Jetons maintenant un coup d'œil sur le résultat :
L'effondrement
Si vous êtes comme moi, et que vous avez peut-être un "ami" qui a possédé l'identifiant GitHub pendant un certain temps, il se peut que vous ayez besoin d'un second regard sur cette sortie. commandLineMyNemesis GitHub pendant un certain temps, vous pourriez avoir besoin d'un second regard sur cette sortie. Décomposons-la en plusieurs étapes et voyons ce que fait chacune d'entre elles.
Recherche DNS
Le protocole HTTPS que nous avons utilisé utilise le protocole TCP (Transmission Control Protocol). Avec TCP, cURL doit d'abord trouver l'adresse IP de l'hôte demandé : Trying 173.193.199.22...puis s'y connecter : Connected to rest.nexmo.com (173.193.199.22) port 443 (#0). Ce faisant, il effectue une poignée de main du protocole TCP.
La partie '(#0)' indique le numéro interne que cURL a attribué à cette connexion.
TCP_NODELAY est set par défaut, qui active la mise en mémoire tampon des segments afin que les données puissent être envoyées le plus rapidement possible. Il est généralement utilisé pour augmenter l'utilisation du réseau.
Connexion TLS
HTTPS signifie "Secure HTTP", c'est-à-dire que la couche de transport TCP est améliorée pour offrir l'authentification, le cryptage et l'intégrité des données, en utilisant TLS (Transport Layer Security).
La connexion TLS commence par une "poignée de main", une négociation entre le client (cURL exécuté sur votre PC) et le serveur qui règle les détails de la procédure. La poignée de main détermine la suite de chiffrement qui sera utilisée, vérifie le serveur et s'assure qu'une connexion sécurisée est établie avant de commencer le transfert de données proprement dit.
Nous sommes informés que Nexmo a choisi “TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256” parmi les suites de chiffrement que nous avons proposées. Cela signifie que le ECDHE a été choisi, il utilisera l'algorithme à clé publique RSA algorithme à clé publique pour vérifier les signatures des certificats et échanger les clés, l'algorithme de AES l'algorithme GCM pour chiffrer les données, et l'algorithme SHA256 pour vérifier le contenu des messages.
Certificats de serveur
Il est tout aussi important d'être certain de communiquer avec le bon hôte que d'avoir une connexion sécurisée. Au cours de l'échange TLS, cURL obtient le certificat du serveur distant et vérifie sa signature en le comparant à son propre magasin de certificats d'autorité de certification. Cela permet de s'assurer que nous communiquons avec le bon serveur TLS - ainsi, le serveur Nexmo est bien le serveur Nexmo.
Demande POST
Une requête HTTP envoyée par un client commence par une ligne de requête : POST /sms/json HTTP/1.1suivie d'en-têtes et éventuellement d'un corps, séparé des en-têtes par une ligne vide.
Les en-têtes de la requête contiennent des informations sur le serveur auquel nous nous adressons, la version de notre logiciel, les types de contenu que nous pouvons comprendre et le contenu du corps de la requête.
En-têtes de réponse
La requête que nous avons envoyée reçoit une réponse HTTP correspondante du serveur. Elle contient un ensemble d'en-têtes et un corps de réponse, séparés par une ligne vide.
La première ligne indique un code d'étatdans ce cas, 200 OKqui nous indique que la demande a abouti.
Les en-têtes contiennent des métadonnées du serveur Nexmo, nous indiquant qu'il utilise nginx comme plateforme de serveur web, qu'il renvoie le contenu dans un format JSON, et que le contenu est découpé en morceaux, de sorte que nous ne devrions pas nous attendre à un en-tête Content-Length (comme cURL l'a fait dans l'en-tête de la requête).
La partie Connection: keep-alive nous permet de savoir que la fonction keepalive est utilisée. cURL le fait par défaut, de sorte que des "trames ping" sont envoyées dans les deux sens lorsque la connexion est totalement inactive. Cela permet aux connexions inactives de détecter les ruptures même en l'absence de trafic et aux systèmes intermédiaires de comprendre que la connexion est toujours vivante.
Il y a également quelques en-têtes liés à la sécurité, X-Frame-Options: deny ne permet pas à un navigateur de rendre cette URL dans une <frame>, <iframe> ou <object>. Nexmo utilise ceci pour éviter les attaques par détournement de clics, en s'assurant que leur contenu n'est pas intégré dans d'autres sites. X-XSS-Protection: 1; mode=block; active le filtrage XSS, de sorte que le navigateur empêche le rendu de la page si une attaque est détectée.
La dernière ligne est vide, c'est le marqueur utilisé par le protocole HTTP pour signaler la fin des en-têtes.
Organe de réponse
Le corps de la réponse contient des informations sur le texte que nous avons envoyé, en commençant par le nombre de messages : "message-count": "1"suivi d'un "messages": un tableau d'objets contenant des détails sur chaque message. Les éléments de ce tableau sont les suivants : le numéro auquel le message a été envoyé, l'ID du message, le statut du message, le solde restant sur le compte Nexmo, le coût du message et l'ID du réseau du destinataire.
Connection #0 to host rest.nexmo.com left intact nous permet de savoir que la connexion n'est pas fermée à la suite du transfert. En revanche, dès que cURL retournera à la ligne de commande, elle sera fermée.
Conclusion
Même s'il a fallu moins de 2 secondes pour envoyer un SMS, il se passe beaucoup de choses au-delà de ce que l'on voit au premier abord. J'espère que j'ai réussi à vous éclairer sur le fonctionnement interne, et que vous avez maintenant une meilleure compréhension de ce qui se passe réellement lors d'une requête HTTPS vers l'API SMS de Nexmo. Si vous avez encore des questions qui sont restées sans réponse, n'hésitez pas à me contacter sur twitter.
Quelle est la prochaine étape ?
Si vous souhaitez approfondir les technologies mentionnées, n'hésitez pas à consulter les ressources suivantes Les premières millisecondes d'une connexion HTTPS, En-têtes HTTP, HTTP sur TLS, Le protocole TLS, Tout sur cURL et l'API Nexmo SMS API.
Partager:
Julia s'engage à aider ses collègues développeurs en créant des tutoriels, des guides et des ressources pratiques. Grâce à son expérience en matière de sensibilisation et d'éducation, elle vise à rendre la technologie plus accessible et à améliorer l'expérience globale des développeurs. Vous pouvez souvent la trouver lors d'événements communautaires locaux.
