Communication privée par SMS

Il arrive que vous souhaitiez que deux parties échangent des SMS sans révéler leur numéro de téléphone réel.

Par exemple, si vous exploitez un service de réservation de taxis, vous souhaitez que vos clients et vos chauffeurs puissent communiquer pour coordonner les heures et les lieux de prise en charge, etc. Mais vous ne voulez pas que votre chauffeur connaisse le numéro de téléphone de votre client, afin de protéger sa vie privée. Mais vous ne voulez pas que votre chauffeur connaisse le numéro de téléphone de votre client, afin de protéger sa vie privée. Et, inversement, vous ne voulez pas que votre client connaisse le numéro de téléphone du chauffeur et puisse réserver des services de taxi directement, sans passer par votre application.

Dans ce tutoriel

Ce tutoriel est basé sur le cas d'utilisation d'un SMS privé. Il vous apprend à construire un système de proxy SMS à l'aide de Node.js et du SDK Node Server, en utilisant un numéro de téléphone virtuel pour masquer les numéros réels des participants.

Pour créer l'application, vous devez suivre les étapes suivantes :

Conditions préalables

Pour réaliser ce tutoriel, vous avez besoin de :

  • A Account Vonage - pour votre clé et votre secret API et pour louer des Numbers virtuels.
  • A Numéro Vonage - pour cacher le numéro réel de chaque utilisateur. Vous pouvez louer un numéro dans la rubrique tableau de bord du développeur.
  • Les code source sur GitHub - les instructions d'installation se trouvent dans la section LISEZ-MOI.
  • Node.js installé et configuré.
  • ngrok - (facultatif) pour rendre votre serveur web de développement accessible aux serveurs de Vonage sur Internet.
  • Tous les clients basés aux États-Unis doivent enregistrer une marque et une campagne afin de se conformer à la législation européenne. 10 lignes directrices DLC.

Créer l'application web de base

Cette application utilise le Express cadre pour le routage et la SDK du serveur Node pour l'envoi et la réception de SMS. Nous utilisons dotenv afin que nous puissions configurer l'application dans une .env fichier texte.

En server.js nous initialisons les dépendances de l'application et démarrons le serveur web. Nous fournissons un gestionnaire de route pour la page d'accueil de l'application (/) afin que vous puissiez tester le fonctionnement du serveur en visitant la page 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');
})

Notez que nous instancions un objet de la classe SmsProxy pour gérer l'acheminement des messages envoyés à votre numéro virtuel vers le numéro réel du destinataire. Nous couvrons le processus de procuration proprement dit dans la section proxy le SMSmais pour l'instant, sachez que cette classe initialise nexmo à l'aide de la clé et du secret de l'API que vous configurerez à l'étape suivante. Cela permet à votre application d'envoyer et de recevoir des 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
            });
    }
    ...

Configurer l'application

Copier le example.env fourni à l .env et modifiez-le pour y inclure la clé et le secret de l'API de Vonage ainsi que votre numéro Vonage. Vous trouverez ces informations dans la section tableau de bord du développeur:

VONAGE_API_KEY=YOUR_VONAGE_API_KEY
VONAGE_API_SECRET=YOUR_VONAGE_API_SECRET
VONAGE_NUMBER=YOUR_VONAGE_NUMBER

Créer un chat

Pour utiliser l'application, vous faites un POST à l'adresse suivante /chat en transmettant les numéros de téléphone réels de deux utilisateurs. (Vous pouvez voir un exemple de requête dans démarrer le chat).

Le gestionnaire d'itinéraire pour /chat est indiqué ci-dessous :

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');

});

L'objet "chat" est créé dans le fichier createChat() de la méthode smsProxy classe. Elle stocke le numéro réel de chaque utilisateur :

createChat(userANumber, userBNumber) {
    this.chat = {
        userA: userANumber,
        userB: userBNumber
    };

    this.sendSMS();
}

Maintenant que nous avons créé un chat, nous devons indiquer à chaque utilisateur comment il peut contacter l'autre.

Présenter les utilisateurs

Note: Dans ce tutoriel, chaque utilisateur reçoit le numéro virtuel via un SMS. Dans les systèmes de production, ce numéro pourrait être fourni à l'aide d'un email, de notifications in-app ou en tant que numéro prédéfini.

Dans le cadre de la sendSMS() de la méthode smsProxy nous utilisons la classe sendSms() pour envoyer deux messages au numéro virtuel à partir du numéro réel de chaque utilisateur.

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');
}

Nous devons maintenant intercepter ces messages entrants sur le numéro virtuel et les envoyer par procuration au numéro réel du destinataire.

Recevoir des SMS entrants

Lorsqu'un utilisateur envoie un message à l'autre, il l'envoie au numéro virtuel de l'application au lieu du numéro réel de l'utilisateur cible. Lorsque Vonage reçoit un SMS entrant sur le numéro virtuel, il envoie une requête HTTP au point de terminaison webhook associé à ce numéro :

En server.jsnous fournissons un gestionnaire de route pour le /webhooks/inbound-sms demande que les serveurs de Vonage adressent à votre application lorsque votre numéro virtuel reçoit un SMS. Nous utilisons un POST ici, mais vous pouvez également utiliser GET ou POST-JSON. Ceci est configurable dans le tableau de bord, comme décrit dans la section exposer votre application à l'internet.

Nous récupérons le from et text de la requête entrante et les transmet à la fonction SmsProxy pour déterminer le numéro réel auquel l'envoyer :

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);
});

Nous renvoyons un 204 statut (No content) pour indiquer que le message a bien été reçu. Il s'agit d'une étape importante, car si nous n'accusons pas réception du message, les serveurs de Vonage tenteront à plusieurs reprises de le délivrer.

Déterminer comment acheminer le SMS

Maintenant que vous connaissez le numéro réel de l'utilisateur qui envoie le SMS, vous pouvez transférer le message au numéro réel de l'autre utilisateur. Cette logique est mise en œuvre dans la fonction getDestinationRealNumber() de la méthode SmsProxy classe :

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;
}

Maintenant que vous pouvez déterminer à quel utilisateur envoyer le message, il ne vous reste plus qu'à l'envoyer !

Proxy du SMS

Envoyer le SMS par procuration au numéro de téléphone réel du destinataire. Le from est toujours le numéro virtuel (pour préserver l'anonymat de l'utilisateur), le numéro to est le numéro de téléphone réel de l'utilisateur.

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);
}

Essayez-le

Exposez votre application à l'Internet

Lorsque l'API SMS reçoit un SMS destiné à votre numéro virtuel, elle avertit votre application par l'intermédiaire d'un webhook. Le webhook fournit un mécanisme permettant aux serveurs de Vonage de communiquer avec les vôtres.

Pour que votre application soit accessible aux serveurs de Vonage, elle doit être publiquement disponible sur Internet. Une façon d'y parvenir pendant le développement et les essais est d'utiliser la fonction ngrokUn service qui expose les serveurs locaux à l'Internet public par le biais de tunnels sécurisés. Voir aussi cet article de blog pour plus de détails.

Télécharger et installer ngrokpuis démarrez-le avec la commande suivante :

ngrok http 3000

Cela crée des URL publiques (HTTP et HTTPS) pour tout site web fonctionnant sur le port 3000 de votre machine locale.

Utiliser le ngrok à l'interface web à l'adresse http://localhost:4040 et notez les URL que ngrok fournit.

Accédez à votre Paramètres du compte et saisissez l'URL complète de votre point de terminaison webhook dans la zone de texte "Messages entrants". Par exemple, si vous utilisez ngrok votre URL pourrait ressembler à ce qui suit :

https://33ab96a2.ngrok.io/webhooks/inbound-sms

Veillez à sélectionner POST dans la liste déroulante "Méthode HTTP" afin que Vonage sache que votre application s'attend à ce que les détails du message soient livrés via une méthode POST demande.

Démarrer le chat

Faire un POST à la demande de votre application. /chat en indiquant les numéros réels de vos utilisateurs comme paramètres de la requête.

Vous pouvez utiliser Facteur pour cela, ou un curl similaire à la suivante, en remplaçant USERA_REAL_NUMBER et USERB_REAL_NUMBER avec les chiffres réels de vos utilisateurs :

curl -X POST \ 'http://localhost:3000/chat?userANumber=USERA_REAL_NUMBER&userBNumber=USERB_REAL_NUMBER'

Poursuivre la discussion

Chaque utilisateur doit recevoir un texte provenant du numéro virtuel de l'application. Lorsqu'un utilisateur répond à ce numéro, le message est envoyé au numéro réel de l'autre utilisateur, mais semble provenir du numéro virtuel.

Conclusion

Dans ce tutoriel, vous avez appris à construire un proxy SMS pour permettre à deux utilisateurs d'échanger des SMS sans que l'un ou l'autre ne voie le numéro réel de l'autre.

Quelle est la prochaine étape ?

Vous pouvez étendre cet exemple d'application afin d'utiliser le même numéro virtuel pour héberger plusieurs chats en utilisant l'option SmsProxy.createChat() d'instancier et de faire persister un chat pour différentes paires d'utilisateurs. Ainsi, par exemple, vous pourriez avoir un objet chat objet pour userA et userB pour converser et un autre pour userC et userD.

Vous pouvez créer des itinéraires qui vous permettent de voir toutes les discussions en cours et de mettre fin à une discussion lorsqu'elle est terminée.

Les ressources suivantes vous aideront à en savoir plus sur ce que vous avez appris dans ce tutoriel :