Faça a autenticação de 2 fatores com a API de Voz Zenvia

Faça a autenticação de 2 fatores com a API de Voz Zenvia

Uma quantidade significativa de  informações financeiras, pessoais e confidenciais são mantidas em contas online. Devido ao aumento das ameaças cibernéticas, é preciso  tomar medidas contra a violação de dados, tanto de empresas quanto de seus clientes. Quando se trata de malwares financeiros, o Brasil foi o 4º país mais atacado em 2019.

Muitas organizações utilizam a autenticação de dois fatores (2FA) como procedimento de segurança em suas transações online (compra, venda ou transferência).  Esse recurso adiciona uma camada de segurança para o processo de login da conta, solicitando que o usuário forneça duas formas de autenticação.

A primeira forma normalmente é a sua senha ou número PIN cadastrado no sistema. Já o segundo fator varia dependendo do serviço, sendo os mais comuns SMS, código  enviado por e-mail ou mensagem de voz.

Tomando por base a realização de uma verificação de 2 fatores, neste artigo vamos desenvolver uma API em Node.js capaz de enviar um código numérico por meio de uma ligação telefônica. 

Imagine uma loja virtual que possui um sistema de autenticação de 2 fatores ao efetuar o login. Para ter um nível de segurança maior, esta loja decidiu que o código para a autenticação deveria enviado por meio de voz em uma ligação ao número do cliente cadastrado no site loja. 

Para a construção desta aplicação, iremos utilizar  a API de áudio da Zenvia, para realizar o envio do torpedo de voz ao cliente.

Você pode acessar o projeto final da aplicação produzida neste tutorial no nosso repositório do github.

Para criar a conta de acesso à API da Zenvia, basta entrar neste site, preencher as informações e clicar em "CRIAR". Após criar a conta, é preciso confirmar o número de celular e o endereço de e-mail para ter acesso ao painel. Após confirmar suas informações é possível acessar o painel e adquirir o Access Token para se autenticar nas requisições à API, você precisará desta informação mais tarde.

Iremos utilizar o recurso TTS (Text To Speech) e as informações sobre os endpoints da API estão disponíveis na documentação.

Text to Speech

A funcionalidade de TTS (Text to Speech) da API de voz da Zenvia nos permite enviar uma uma mensagem de texto e ela transforma o texto em áudio falado e reproduz em uma ligação telefônica para o número indicado na chamada. Assim, quando o número destino atende o mesmo irá escutar uma voz falando a mensagem escrita.

Também podem ser enviadas algumas opções adicionais, tais como aguardar uma resposta do usuário, gravar o áudio da ligação ou colocar um número bina que aparecerá no momento da ligação. Para fins didáticos, vamos utilizar apenas o básico do recurso.

O acesso à API está disponível em Node.js através de uma dependência chamada totalvoice-node, porém ela não tem suporte a typescript e para fins didáticos e para que este tutorial possa ajudar as pessoas que não utilizam Node.js, vamos fazer as chamadas através de requisições http (Hypertext Transfer Protocol).

Como funcionam as chamadas para esta API

A API recebe as requisições através do URL (Uniform Resource Locator) base https://api2.totalvoice.com.br e vamos utilizar o endpoint /tts para acessar o recurso Text to Speech.

Para que a API reconheça o que queremos e quem está solicitando, precisamos enviar uma requisição POST com os seguintes headers:

Content-Type: application/json
access-token: <SEU_ACCESS_TOKEN_DISPONÍVEL_NO_PAINEL>
>

E um JSON no corpo da requisição neste modelo:

{
    "numero_destino": "11999999999",
    "mensagem": "Mensagem que deseja ser dita no torpedo de voz."
}

Criando a aplicação Node.js

1- Instale o Node.js no seu computador (de preferência a versão LTS);

1.1- opcional - Instale o yarn. O Node.js possui um gerenciador de pacotes padrão chamado npm (Node Package Manager), porém existe um gerenciador diferente chamado yarn. No restante deste artigo, haverão as opções de instalação para ambos gerenciadores de pacote como no passo a seguir.

2- Inicie o projeto criando o package.json com o seguinte comando no terminal:

npm init -y

yarn init -y

3- Instale o ts-node, ts-node-dev e o typescript como dependências de desenvolvimento:

npm i ts-node ts-node-dev typescript -D

yarn add ts-node ts-node-dev typescript -D

3.1 - Instale o arquivo de configuração do typescript:

npx typescript --init

4- Crie um arquivo index.ts na pasta raiz para testarmos a aplicação:

console.log('Hello World!')

5- Abra o arquivo package.json e insira o script para iniciar o servidor assim como na área grifada em cinza:

{
  "name": "zenvia-voice",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "dev": "ts-node-dev --transpile-only --ignore-watch node_modules --respawn index.ts"
  },
  "devDependencies": {
    "ts-node": "^9.1.1",
   
"ts-node-d": "^1.1.1",
   
"typescript": "^4.1.3"
  }
}

5.1- Sempre que você quiser executar a aplicação basta executar no terminal:

npm run dev

yarn dev

6- Instale o Express e o dotenv para criarmos nossa API:

npm i express dotenv && npm i --save-dev @types/express

yarn add express dotenv  && yarn add @types/express -D

7- Instale o Axios para realizarmos as requisições http:

npm i axios

yarn add axios

8- Vamos começar criando o arquivo de configuração do Axios config/api.ts:

import axios from 'axios'

const api = axios.create({
    baseURL: 'https://api2.totalvoice.com.br',
})

export default api

9- Crie um arquivo chamado .env, nele conterá seu token de acesso em uma variável de ambiente, coloque seu token logo após o sinal de =:

VOICE_TOKEN=

10- Vamos voltar no nosso arquivo index.ts e criarmos nossa API:

import express from 'express'
import { handleSendCode } from './total-voice/index'

const app = express()

app.get('/sendCode/:phone', handleSendCode)

app.listen(4000, () => console.log('Servidor rodando na porta 4000.'))

Acabamos de criar uma API terá a rota /sendCode que aceita o envio do número de destino no seu URL, exemplo: http://localhost:4000/sendCode/11999999999.

11- Crie uma pasta chamada total-voice e dentro dela crie o arquivo index.ts, que conterá a função handleSendCode importada no index.ts e que lida com o envio do código de autenticação:

import { Request, Response } from 'express'
import { config } from 'dotenv'
import callToUser from '../functions/callToUser'
import { generateVerificationCode } from '../functions/generateVerificationCode'

// Inicializa o dotenv para podermos acessar informações do arquivo .env
config()

// Chama a função que gera um código aleatório de 4 dígitos e armazena em uma variável
const generatedCode = generateVerificationCode()

// Divide o código com vírgulas para melhorar a reprodução do áudio
const splittedCode = generatedCode.split('')
const code = `${splittedCode[0]}, ${splittedCode[1]}, ${splittedCode[2]}, ${splittedCode[3]}`

// Armazena a mensagem que será reproduzida em uma variável
const message = `Olá, tudo bem? Eu sou a Vitoria da Loja Prensa e estou te ligando para lhe dizer o código de autenticação de 2 fatores para o login na plataforma. Pegue algo para anotar o código que lhe direi, fique tranquilo pois repetirei o código. Lá vai: ${code}. Repetindo: ${code}. Última vez: ${code}. Agora basta inserir este código de login e pronto. Até mais.`

// Declaração da função que lida com o envio do código
export const handleSendCode = (request: Request, response: Response) => {
    // Armazena o telefone passado no URL da nossa API em uma variável
    const { phone } = request.params

    // Exibe um status no console da nossa aplicação
    console.log('Efetuando a chamada')

    // Chama a função que faz a chamada à API da Zenvia
    
callToUser(message, phone, response)
}

12- Crie a função generateVerificationCode que gera um código aleatório dentro do arquivo generateVerificationCode.ts dentro da pasta que você criará agora chamada functions:

export const generateVerificationCode = () => {
    return Math.floor(Math.random() * 10000).toString()
}

13- Crie a função callToUser, que faz a chamada à API da Zenvia no arquivo functions/callToUser.ts:

import { Response } from 'express'
import { config } from 'dotenv'
import api from '../config/api'

// Inicializa o dotenv para podermos acessar informações do arquivo .env
config()

const callToUser = (mensagem: string, numero_destino: string, response: Response) => {
    
api
        .post(
            
'/tts',
            {
                
numero_destino,
                
mensagem,
            },
            {
                
headers: {
                    
'Content-Type': 'application/json',
                    
'access-token': `${process.env.VOICE_TOKEN}`,
                },
            }
        )
        .
then((res: any) => {
            // Armazena o campo sucesso da resposta da API de voz
            
const { sucesso } = res.data

            // Verifica se o sucesso é verdadeiro
            
if (sucesso === true) {
                // Se sim, exibe status de sucesso no console da aplicação
                
console.log('Sucesso! A chamada está sendo realizada.')

                // Retorna uma resposta de sucesso para quem chamou nossa API
                
response.send(
                    
`Sucesso, resposta da API de torpedos de voz: ${JSON.stringify(
                        
res.data,
                        
null,
                        
4
                    )}`
                )
            }
else {
                // Se não, exibe status de erro no console da aplicação
                
console.log('Erro na chamada.')

                // Retorna uma resposta de erro para quem chamou nossa API
                
response.send(
                    
`Erro na chamada para a API de torpedos de voz: ${JSON.stringify(
                        
res.data,
                        
null,
                        
4
                    )}`
                )
            }
        })
        .
catch((error: any) => {
            // Caso não seja possível chamar a API de voz, exibe um status de erro no console
            
console.log('Error:', error)

            // Retorna uma resposta de erro para quem chamou nossa API
            
response.send('Erro desconhecido ao chamar a API de voz.')
        })
}

export default callToUser

 

O objetivo de uma API é justamente a troca de dados entre diferentes sistemas e aplicativos, o que acaba por automatizar muitos processos manuais e acelera a criação de novas funcionalidades, sendo consideradas capacitadoras de eficiência e inovação em muitas empresas. 

Todos os setores de uma organização podem ser beneficiados através da adoção de APIs. Os benefícios não apenas agregam valor para a equipe interna, mas também mais qualidade à experiência do usuário final. 

Com um mercado cada vez mais concorrente, conectar marcas e consumidores é fundamental. APIs de comunicação como a de Voz proporcionam uma série de facilidades a empresa e ao cliente. 

A partir da API de Voz, o desenvolvedor consegue criar interações e construir soluções com chamadas ou torpedos de voz conectadas à sua aplicação.

Além da autenticação de 2 fatores, esta API permite envio de mensagem de voz, checagem de números de telefone, a construção de uma central PABX na nuvem e acesso a relatórios em tempo real para conhecer o status das chamadas. 

Para usar a API de Voz Zenvia, após criar sua conta na plataforma, é preciso utilizar o access-token e informar os números de origem e destino. Com isso o usuário pode fazer sua primeira ligação.

 

Amplie sua estratégia de comunicação! Crie sua conta agora e comece a testar a API de Voz Zenvia.

Topo