Comunicación SMS privada
A veces quieres que dos partes intercambien SMS sin revelar sus números de teléfono reales.
Por ejemplo, si gestiona un servicio de reserva de taxis, querrá que sus clientes y conductores puedan comunicarse para coordinar las horas de recogida, las ubicaciones, etc. Pero no quiere que el conductor conozca el número de teléfono del cliente para proteger su intimidad. Y, a la inversa, no quiere que su cliente conozca el número del conductor y pueda reservar servicios de taxi directamente, saltándose su aplicación.
En este tutorial
Este tutorial se basa en el caso de uso de SMS privados. Te enseña a construir un sistema proxy de SMS usando Node.js y el SDK Node Server, utilizando un número de teléfono virtual para enmascarar los números reales de los participantes.
Para crear la aplicación, siga estos pasos:
- Crear la aplicación web básica - construir el marco básico de la aplicación
- Configurar la aplicación - para utilizar su clave y secreto API y el número virtual que ha proporcionado
- Crear un chat - crear una correspondencia entre los números reales de los usuarios y los virtuales
- Recibir SMS entrantes - captura los SMS entrantes en tu número virtual y reenvíalos al número real del usuario de destino
Requisitos previos
Para completar este tutorial, necesitas:
- A Account de Vonage - para su clave y secreto API y para alquilar números virtuales.
- A Número de Vonage - para ocultar el número real de cada usuario. Puede alquilar un número en la sección panel de control para desarrolladores.
- En código fuente en GitHub - las instrucciones de instalación se encuentran en la sección LÉAME.
- Node.js instalado y configurado.
- ngrok - (opcional) para que tu servidor web de desarrollo sea accesible a los servidores de Vonage a través de Internet.
- Todos los clientes con sede en EE.UU. deben registrar una marca y una campaña para cumplir con 10 directrices DLC.
Crear la aplicación web básica
Esta aplicación utiliza el Express marco para el enrutamiento y la SDK de servidor de nodos para enviar y recibir SMS. Utilizamos dotenv para que podamos configurar la aplicación en un .env archivo de texto.
En server.js inicializamos las dependencias de la aplicación e iniciamos el servidor web. Proporcionamos un manejador de rutas para la página de inicio de la aplicación (/) para que pueda comprobar que el servidor está funcionando visitando http://localhost:3000:
require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const SmsProxy = require('./SmsProxy');
const app = express();
app.set('port', (process.env.PORT || 3000));
app.use(bodyParser.urlencoded({ extended: false }));
app.listen(app.get('port'), function () {
console.log('SMS Proxy App listening on port', app.get('port'));
});
const smsProxy = new SmsProxy();
app.get('/', (req, res) => {
res.send('Hello world');
})
Tenga en cuenta que estamos instanciando un objeto del tipo SmsProxy para gestionar el enrutamiento de los mensajes enviados a su número virtual al número real del destinatario. Cubrimos el proceso de proxy real en proxy el SMSpero por ahora ten en cuenta que esta clase inicializa nexmo utilizando la clave y el secreto de la API que configurará en el paso siguiente. De este modo, tu aplicación podrá enviar y recibir SMS:
const Nexmo = require('nexmo');
class SmsProxy {
constructor() {
this.nexmo = new Nexmo({
apiKey: process.env.VONAGE_API_KEY,
apiSecret: process.env.VONAGE_API_SECRET
}, {
debug: true
});
}
...
Configurar la aplicación
Copie el example.env proporcionado a .env y modifícalo para incluir tu clave y secreto de API de Vonage y tu número de Vonage. Puedes encontrar esta información en panel de control para desarrolladores:
VONAGE_API_KEY=YOUR_VONAGE_API_KEY
VONAGE_API_SECRET=YOUR_VONAGE_API_SECRET
VONAGE_NUMBER=YOUR_VONAGE_NUMBER
Crear un chat
Para utilizar la aplicación, haga clic en POST solicitud a la /chat pasando los números de teléfono reales de dos usuarios. (Puede ver un ejemplo de solicitud en iniciar el chat).
El gestor de rutas para /chat se muestra a continuación:
app.post('/chat', (req, res) => {
const userANumber = req.body.userANumber;
const userBNumber = req.body.userBNumber;
smsProxy.createChat(userANumber, userBNumber, (err, result) => {
if (err) {
res.status(500).json(err);
}
else {
res.json(result);
}
});
res.send('OK');
});
El objeto de chat se crea en el createChat() método del smsProxy clase. Almacena el número real de cada usuario:
createChat(userANumber, userBNumber) {
this.chat = {
userA: userANumber,
userB: userBNumber
};
this.sendSMS();
}
Ahora que hemos creado un chat, necesitamos que cada usuario sepa cómo puede ponerse en contacto con el otro.
Presentar a los usuarios
Nota: En este tutorial, cada usuario recibe el número virtual a través de un SMS. En los sistemas de producción se podría suministrar mediante correo electrónico, notificaciones in-app o como un número predefinido.
En el sendSMS() método del smsProxy utilizamos la clase sendSms() para enviar dos mensajes al número virtual desde el número real de cada usuario.
sendSMS() {
/*
Send a message from userA to the virtual number
*/
this.nexmo.message.sendSms(process.env.VIRTUAL_NUMBER,
this.chat.userA,
'Reply to this SMS to talk to UserA');
/*
Send a message from userB to the virtual number
*/
this.nexmo.message.sendSms(process.env.VIRTUAL_NUMBER,
this.chat.userB,
'Reply to this SMS to talk to UserB');
}
Ahora tenemos que interceptar estos mensajes entrantes en el número virtual y enviarlos por proxy al número real del destinatario.
Recibir SMS entrantes
Cuando un usuario envía un mensaje al otro, lo está enviando al número virtual de la aplicación en lugar de al número real del usuario de destino. Cuando Vonage recibe un SMS entrante en el número virtual, realiza una solicitud HTTP al punto final de webhook asociado con ese número:
En server.jsproporcionamos un gestor de rutas para /webhooks/inbound-sms solicitud que los servidores de Vonage hacen a tu aplicación cuando tu número virtual recibe un SMS. Estamos usando un POST pero también puede utilizar GET o POST-JSON. Esto se puede configurar en el cuadro de mandos, como se describe en exponga su aplicación a internet.
Recuperamos el from y text de la solicitud entrante y páselos a la aplicación SmsProxy para determinar a qué número real debe enviarse:
app.get('/webhooks/inbound-sms', (req, res) => {
const from = req.query.msisdn;
const to = req.query.to;
const text = req.query.text;
// Route virtual number to real number
smsProxy.proxySms(from, text);
res.sendStatus(204);
});
Devolvemos un 204 estado (No content) para indicar que el mensaje se ha recibido correctamente. Este es un paso importante, porque si no acusamos recibo los servidores de Vonage harán repetidos intentos de entregarlo.
Determinar cómo enrutar el SMS
Ahora que conoces el número real del usuario que envía el SMS, puedes reenviar el mensaje al número real del otro usuario. Esta lógica se implementa en el getDestinationRealNumber() método del SmsProxy clase:
getDestinationRealNumber(from) {
let destinationRealNumber = null;
// Use `from` numbers to work out who is sending to whom
const fromUserA = (from === this.chat.userA);
const fromUserB = (from === this.chat.userB);
if (fromUserA || fromUserB) {
destinationRealNumber = fromUserA ? this.chat.userB : this.chat.userA;
}
return destinationRealNumber;
}
Ahora que ya puedes determinar a qué usuario enviar el mensaje, lo único que tienes que hacer es enviarlo.
Proxy del SMS
Proxy del SMS al número de teléfono real del destinatario. La dirección from es siempre el número virtual (para preservar el anonimato del usuario), el número to es el número de teléfono real del usuario.
proxySms(from, text) {
// Determine which real number to send the SMS to
const destinationRealNumber = this.getDestinationRealNumber(from);
if (destinationRealNumber === null) {
console.log(`No chat found for this number);
return;
}
// Send the SMS from the virtual number to the real number
this.nexmo.message.sendSms(process.env.VIRTUAL_NUMBER,
destinationRealNumber,
text);
}
Pruébalo
Exponga su aplicación a Internet
Cuando la SMS API recibe un SMS destinado a su número virtual, alerta a su aplicación a través de un mensaje webhook. El webhook proporciona un mecanismo para que los servidores de Vonage se comuniquen con los tuyos.
Para que tu aplicación sea accesible para los servidores de Vonage, debe estar disponible públicamente en Internet. Una forma de lograr esto durante el desarrollo y las pruebas es utilizar ngrokServicio que expone los servidores locales a la Internet pública a través de túneles seguros. Véase esta entrada del blog para más detalles.
Descargar e instalar ngroke inícielo con el siguiente comando:
Esto crea URLs públicas (HTTP y HTTPS) para cualquier sitio web que se esté ejecutando en el puerto 3000 en su máquina local.
Utiliza el ngrok interfaz web en http://localhost:4040 y anote las URL que ngrok proporciona.
Vaya a su configuración de la Account e introduzca la URL completa de su punto final de webhook en el cuadro de texto "Mensajes entrantes". Por ejemplo, si utiliza ngrok entonces su URL podría parecerse a la siguiente:
https://33ab96a2.ngrok.io/webhooks/inbound-sms
Asegúrese de seleccionar POST de la lista desplegable "Método HTTP" para que Vonage sepa que tu aplicación espera que los detalles del mensaje se entreguen mediante un POST solicitud.
Iniciar el chat
Hacer un POST de su aplicación /chat pasando los números reales de sus usuarios como parámetros de la solicitud.
Puede utilizar Cartero para esto, o un curl similar al siguiente, sustituyendo USERA_REAL_NUMBER y USERB_REAL_NUMBER con los números reales de tus usuarios:
Continuar el chat
Cada usuario debe recibir un texto del número virtual de la aplicación. Cuando un usuario responde a ese número, se envía al número real del otro usuario, pero parece proceder del virtual.
Conclusión
En este tutorial has aprendido a crear un proxy de SMS para que dos usuarios puedan intercambiar SMS sin que ninguno de ellos vea el número real del otro.
¿Y ahora qué?
Puede ampliar esta aplicación de ejemplo para utilizar el mismo número virtual para alojar varios chats utilizando SmsProxy.createChat() para instanciar y luego persistir un chat para diferentes pares de usuarios. Así, por ejemplo, podrías tener un chat objeto para userA y userB para conversar y otro para userC y userD.
Puedes crear rutas que te permitan ver todos los chats en curso y también finalizar un chat cuando haya terminado.
Los siguientes recursos le ayudarán a obtener más información sobre lo aprendido en este tutorial: