
Compartilhar:
Julia está empenhada em capacitar outros desenvolvedores por meio da criação de tutoriais, guias e recursos práticos. Com experiência em divulgação e educação, ela busca tornar a tecnologia mais acessível e aprimorar a experiência geral dos desenvolvedores. É comum encontrá-la em eventos da comunidade local.
cURL, HTTPS e a SMS API da Nexmo – Nos bastidores
Enviar um SMS com a API da Nexmo é tão fácil quanto enviar uma solicitação para a URL: https://rest.nexmo.com/sms/json. Mas você já se perguntou o que acontece nos bastidores? Quando você faz uma solicitação pela Internet, o que seu computador faz? O que o servidor faz?
Essas são as perguntas que pretendemos responder a seguir; então, acompanhe se quiser conferir por conta própria.
Antes de começarmos
Antes de começarmos, você vai precisar de algumas coisas:
O cURL é uma ferramenta de linha de comando para enviar e receber dados.
Fazendo a solicitação HTTPS com o cURL
O envio de uma https solicitação para a SMS API da Nexmo é bem simples. Basta substituir as variáveis a seguir no exemplo abaixo, e a mensagem já estará a caminho.
| 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. |
Você pode executar o curl com opções de linha de comando para acompanhar a(s) URL(s). Essas opções fornecem informações ao curl sobre como você deseja que ele se comporte.
A documentação da Nexmo utiliza -d para enviar sequências de dados em uma solicitação POST a um servidor, e estamos adicionando -v/--verbose para ativar o modo detalhado.
Isso nos permite ver as informações adicionais fornecidas pelo mecanismo interno do curl, juntamente com todos os cabeçalhos que ele envia e recebe. Além disso, ao adicionar --trace-time para que o cURL anteponha a todas as saídas detalhadas um temporizador de alta resolução indicando o momento em que a linha foi impressa.
Agora, vamos dar uma olhada no resultado:
A Análise
Se você for como eu e talvez tenha um “amigo” que já teve o commandLineMyNemesis nome de usuário no GitHub por um tempo, talvez precise dar uma olhada melhor nesse resultado. Vamos dividir isso em etapas e ver o que cada uma delas faz.
Pesquisa de DNS
O protocolo HTTPS que usamos utiliza o TCP (Protocolo de Controle de Transmissão). Com o TCP, o cURL precisa primeiro descobrir o endereço IP do host solicitado: Trying 173.193.199.22..., e, em seguida, se conectar a ele: Connected to rest.nexmo.com (173.193.199.22) port 443 (#0). Ao fazer isso, ele realiza um handshake do protocolo TCP.
A parte '(#0)' indica qual número interno o cURL atribuiu a essa conexão.
TCP_NODELAY é set por padrão, o que habilita o buffer de segmentos para que os dados possam ser enviados o mais rápido possível. Geralmente é usado para aumentar a utilização da rede.
Conexão TLS
HTTPS significa “HTTP Seguro”, o que significa que a camada de transporte TCP foi aprimorada para oferecer autenticação, criptografia e integridade dos dados, utilizando o TLS (Transport Layer Security).
A conexão TLS começa com um “handshake”, uma negociação entre o cliente (o cURL em execução no seu PC) e o servidor que define os detalhes de como a conexão será estabelecida. O handshake determina qual conjunto de criptografia será usado, Verify o servidor e garante que uma conexão segura seja estabelecida antes do início da transferência de dados propriamente dita.
Fomos informados de que a Nexmo escolheu “TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256” entre os conjuntos de criptografia que oferecemos. Isso significa que, ECDHE protocolo foi escolhido; ele utilizará o RSA algoritmo de chave pública para verificar assinaturas de certificados e trocar chaves, e o AES algoritmo para GCM para criptografar dados, e o SHA256 para verificar o conteúdo das mensagens.
Certificados de servidor
Ter certeza de que você está se comunicando com o servidor correto é tão importante quanto ter uma conexão segura. Durante o handshake TLS, o cURL obtém o certificado do servidor remoto e Verify sua assinatura, comparando-a com seu próprio repositório de certificados de autoridade certificadora (CA). Isso é feito para garantir que nos comunicamos com o servidor TLS correto — ou seja, que o servidor da Nexmo é de fato o servidor da Nexmo.
Solicitação POST
Uma solicitação HTTP enviada por um cliente começa com uma linha de solicitação: POST /sms/json HTTP/1.1, seguida pelos cabeçalhos e, opcionalmente, por um corpo, separado dos cabeçalhos por uma linha em branco.
Os cabeçalhos da solicitação contêm informações sobre o servidor com o qual estamos nos comunicando, a versão do nosso software, os tipos de conteúdo que podemos processar e sobre o conteúdo do corpo da solicitação.
Cabeçalhos de resposta
A solicitação que enviamos está recebendo uma resposta HTTP correspondente do servidor. Ela contém um conjunto de cabeçalhos e um corpo de resposta, separados por uma linha em branco.
A primeira linha mostra um código de status, neste caso, 200 OK, o que nos indica que a solicitação foi bem-sucedida.
Os cabeçalhos contêm metadados do servidor Nexmo, indicando que ele utiliza o nginx como plataforma de servidor web, que está enviando conteúdo no formato JSON e que o conteúdo é fragmentado; portanto, não devemos esperar um Content-Length cabeçalho (como o que o cURL enviou no cabeçalho da solicitação).
A Connection: keep-alive parte nos indica que o recurso do TCP keepalive está sendo usado. O cURL faz isso por padrão, de modo que “quadros de ping” são enviados de um lado para o outro quando a conexão, de outra forma, estaria totalmente ociosa. Isso ajuda conexões ociosas a detectar falhas mesmo na ausência de tráfego e ajuda os sistemas intermediários a entender que a conexão ainda está ativa.
Existem também alguns cabeçalhos relacionados à segurança ali, X-Frame-Options: deny não permitindo que um navegador exiba essa URL em um <frame>, <iframe> ou <object>. A Nexmo usa isso para evitar ataques de clickjacking, garantindo que seu conteúdo não seja incorporado a outros sites. X-XSS-Protection: 1; mode=block; Habilita a filtragem de XSS, de modo que o navegador impedirá a exibição da página caso seja detectado um ataque.
A última linha está vazia; esse é o marcador usado pelo protocolo HTTP para indicar o fim dos cabeçalhos.
Corpo da resposta
O corpo da resposta contém informações sobre o texto que enviamos, começando pelo número de mensagens: "message-count": "1", seguido por uma "messages": matriz de objetos com detalhes sobre cada mensagem individual. Os elementos dessa matriz são os seguintes: o número para o qual a mensagem foi enviada, o ID da mensagem, o status da mensagem, o saldo restante na conta da Nexmo, o custo da mensagem e o ID da rede do destinatário.
Connection #0 to host rest.nexmo.com left intact isso nos indica que a conexão não está sendo encerrada como consequência da transferência. No entanto, assim que o cURL retornar à linha de comando, ela será encerrada.
Conclusão
Embora tenha levado menos de 2 segundos para enviar um SMS, há muito acontecendo além do que parece à primeira vista. Espero ter conseguido esclarecer um pouco sobre o funcionamento interno e que, a esta altura, você já tenha uma compreensão melhor do que realmente acontece durante uma solicitação HTTPS à SMS API da Nexmo. Se ainda tiver alguma dúvida que não tenha sido esclarecida, fique à vontade para me contatar no Twitter.
E agora?
Se você quiser se aprofundar ainda mais nas tecnologias mencionadas, não deixe de conferir estes recursos sobre Os primeiros milissegundos de uma conexão HTTPS, Cabeçalhos HTTP, HTTP sobre TLS, O Protocolo TLS, Tudo sobre o cURL e a SMS API da Nexmo.
Compartilhar:
Julia está empenhada em capacitar outros desenvolvedores por meio da criação de tutoriais, guias e recursos práticos. Com experiência em divulgação e educação, ela busca tornar a tecnologia mais acessível e aprimorar a experiência geral dos desenvolvedores. É comum encontrá-la em eventos da comunidade local.