https://d226lax1qjow5r.cloudfront.net/blog/blogposts/add-two-factor-authentication-to-a-microsoft-bot-with-nexmos-verify-api-dr/2FA-MS-BOT.png

Ajouter 2FA à un bot Microsoft avec l'API Verify de Nexmo

Publié le May 3, 2021

Temps de lecture : 4 minutes

L'authentification à deux facteurs (2FA) est de plus en plus utilisée pour renforcer la sécurité au sein des Applications. Les bots devenant de plus en plus populaires, les développeurs devront réfléchir à la manière d'intégrer le 2FA à leurs bots Dans cette démo, nous verrons comment utiliser l'API Verify de Nexmo avec Microsoft Bot Framework.

Conditions préalables

Dans ce billet, nous n'entrerons pas dans les détails de la création d'un robot. Nous supposons que vous savez comment configurer Visual Studio pour créer des projets de robots. Si vous n'êtes pas familier avec le cadre Microsoft Bot, vous pouvez visiter la page de documentation page de documentation ici.

Le SDK Bot Builder pour .NET supporte actuellement C#. Visual Studio pour Mac n'est pas supporté. Vous aurez besoin d'une machine Windows pour pouvoir exécuter cette démo.

Pour mettre en place le 2FA, nous utilisons Nexmo Verify API de Nexmo Verify et la Nexmo C# Client Library

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.

Comment cela fonctionne-t-il ?

Dans notre scénario, nous allons ajouter une authentification à deux facteurs à un bot lors de l'inscription. En tant que premier utilisateur, vous devez fournir quelques informations pour compléter votre profil comme votre nom et votre numéro de téléphone.

Ensuite, le robot essaiera de vérifier ce numéro de téléphone en envoyant un code PIN à l'aide de l'API Verify de Nexmo. L'étape suivante consiste à collecter le code PIN et à le vérifier.

Mise en place du projet bot

La première chose à faire pour configurer 2FA avec un robot est de créer un robot. C'est logique, n'est-ce pas ? Dans Visual Studio, créez un nouveau projet de type "Bot Application" : Fichier--> Nouveau--> Projet--> Application Bot

screenshot showing set up and saving bot projectCreating and Saving new project

Utilisation de Nexmo avec le robot

L'utilisation des API Nexmo avec une Bot Application n'est pas différente de l'utilisation des API avec n'importe quel autre projet .Net. Installez la bibliothèque Nexmo C# Client Library via la console NuGet Package Manager.

Install-Package Nexmo.Csharp.Client -Version 3.0.1

Création du formulaire de profil

Afin de vérifier le numéro de téléphone de l'utilisateur lors de l'inscription, nous allons collecter quelques informations pour établir le profil de l'utilisateur.

Avec le Microsoft Bot Framework, il y a plusieurs façons de gérer le flux de la conversation et de construire des dialogues. Dans ce cas, nous allons utiliser FormFlow car il simplifie le processus de gestion d'une conversation guidée comme la nôtre.

typing a message and getting alert to verify identity2fa Typing message

Ajoutez une classe "UserProfile" au projet, cette classe définit le formulaire. La classe comprend quelques propriétés pour nous aider à construire le profil et une méthode "BuildForm()" qui utilise "FormBuilder" pour créer le formulaire et définir un simple message de bienvenue.

Veillez à importer l'espace de noms FormFlow pour pouvoir utiliser FormFlow.

Microsoft.Bot.Builder.FormFlow
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.FormFlow;
using System;

namespace _2FABotDemo
{
    [Serializable]
    public class UserProfile
    {
        [Prompt("What's your first name?")]
        public string FirstName;
        [Prompt("How about your last name?")]
        public string LastName;
        [Prompt("I now need your phone number in its international format but without '+' or '00'. I will send you a verification code shortly.")]
        public string PhoneNumber;
        public static IForm<UserProfile> BuildForm()
        {
            return new FormBuilder<UserProfile>().Message("Welcome! Before I'm of any use to you, I will need to verify your identity. Please answer the following questions.")
                .OnCompletion(async (context, UserProfile) => {
                    context.PrivateConversationData.SetValue<bool>("ProfileComplete", true);
                    await context.PostAsync("Your profile is complete.");
                })
                .Build();
        }
    }
}

En utilisant le formulaire

Maintenant que nous avons un formulaire de profil, nous devons le connecter au framework pour pouvoir l'utiliser. Pour ce faire, nous l'ajoutons au contrôleur "MessagesController.cs" via la méthode "MakeRootDialog()".

MakeRootDialog()" appelle en retour la méthode "FormDialog.FromForm" pour créer le formulaire de profil de l'utilisateur. Une fois le profil de l'utilisateur complété, le robot procède à l'envoi d'un code de vérification au numéro de téléphone fourni par l'utilisateur.

Par souci de clarté, nous regroupons les méthodes liées à la vérification (c'est-à-dire à l'envoi et à la vérification) dans une classe d'aide appelée "VerifyHelper.cs".

public  string RequestId { get; set; }
public Client Client { get; set; }

public VerifyHelper()
{
    Client = new Client(creds: new Nexmo.Api.Request.Credentials
    {
         ApiKey = "NEXMO_API_KEY",
         ApiSecret = "NEXMO_API_SECRET"
    });
}

public  void SendVerificationCode(string phoneNumber)
{
     var result = Client.NumberVerify.Verify(new NumberVerify.VerifyRequest
     {
          number = phoneNumber,
          brand = "NexmoQS"
     });

     RequestId = result.request_id;
}
internal static IDialog<UserProfile> MakeRootDialog() => Chain.From(() => FormDialog.FromForm(UserProfile.BuildForm))
                .Do(async (context, userprofile) =>
                {
                    SetVerify(new VerifyHelper());
                    try
                    {
                        var completed = await userprofile;
                        GetVerify().SendVerificationCode(completed.PhoneNumber);
                        await context.PostAsync("All Done! I sent a verification code to the phone number you provided. Could you please tell me the code once you receive it?");
                    }
                    catch (FormCanceledException<UserProfile> e)
                    {
                        string reply;
                        if (e.InnerException == null)
                        {
                            reply = $"You quit on {e.Last} -- maybe you can finish next time!";
                        }
                        else
                        {
                            reply = "Sorry, I've had a short circuit. Please try again.";
                        }
                        await context.PostAsync(reply);
                    }
                });

MakeRootDialog()' est appelé par la méthode Conversation.SendAsync()'.

await Conversation.SendAsync(activity, () => MakeRootDialog());

Maintenant que le code est envoyé, l'étape suivante consiste à le vérifier une fois que l'utilisateur le fournit au bot.

verify setup with user provided input to the botVerify Code

Cette opération s'effectue via la méthode "CheckVerificationCode" de "VerifyHelper.cs".

public  string CheckVerificationCode(string code)
{
     var result = Client.NumberVerify.Check(new NumberVerify.CheckRequest
     {
          request_id = RequestId,
          code = code
     });

     if (result.status == "0")
     {
         return "Verification Sucessful";
     }
     else
     {
          return result.error_text;
     }
}

Comme vous pouvez le voir, cette méthode renvoie une chaîne, car nous voulons utiliser cette chaîne pour communiquer avec l'utilisateur via le robot. l'autre élément à noter ici est 'RequestId'. Il s'agit de l'identifiant de la demande de vérification à contrôler. Lorsque nous envoyons le code de vérification, nous stockons simplement cet identifiant.

Revenons maintenant au bot, nous avons mentionné que nous créons le formulaire dans "MessageController.cs". En effet, la méthode "Post" de "MessageController.cs" est responsable de la réception de tout message de l'utilisateur et de l'invocation de la boîte de dialogue racine.

Ainsi, lorsque l'utilisateur saisit le code de vérification, le robot intercepte toujours ce message dans la méthode de publication, tout comme les informations relatives au profil de l'utilisateur. C'est pourquoi nous avons besoin d'un moyen pour indiquer au robot quelle est la bonne action à effectuer ensuite. Si vous regardez de près la méthode BuildForm dans UserProfile.cs, vous remarquerez que nous définissons un bool ProfileComplete à true à la fin du processus.

.OnCompletion(async (context, UserProfile) => {
                    context.PrivateConversationData.SetValue<bool>("ProfileComplete", true);

Ainsi, à chaque fois que l'utilisateur tape quelque chose, nous vérifions si ProfileComplete a la valeur true ou non. Si le profil est complet, nous supposons que l'utilisateur a saisi le code de vérification et nous vérifions si ce code est valide ; si ce n'est pas le cas, nous continuons à remplir le profil dans la boîte de dialogue racine.

StateClient sc = activity.GetStateClient();
                BotData userData = sc.BotState.GetPrivateConversationData(
                    activity.ChannelId, activity.Conversation.Id, activity.From.Id);

var boolProfileComplete = userData.GetProperty<bool>("ProfileComplete");

if (!boolProfileComplete)
{
   await Conversation.SendAsync(activity, () => MakeRootDialog());
}
else
{
   ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
   Activity replyMessage = activity.CreateReply(GetVerify().CheckVerificationCode(activity.Text));
   await connector.Conversations.ReplyToActivityAsync(replyMessage);
}

En bref

L'objectif de cette démo est de vous expliquer comment ajouter 2FA à vos applications Microsoft Bot en utilisant l'API Verify de Nexmo lors de l'inscription.

Nous avons créé un formulaire de profil d'utilisateur puis envoyé un code de vérification au numéro de téléphone fourni par l'utilisateur. Une fois que l'utilisateur saisit le code qui lui a été envoyé, nous le vérifions. Consultez notre blog pour voir plus d'exemples et de scénarios sur la façon d'utiliser les API Nexmo avec Microsoft Bot Framework.

Partager:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Rabeb OthmaniAnciens de Vonage

Rabeb était un défenseur des développeurs chez Nexmo, se concentrant sur les API de communication dans le nuage et aidant les développeurs à obtenir la meilleure expérience possible lors de la création de leurs applications. Outre le fait d'écrire du code pour gagner sa vie, Rabeb milite pour que davantage de femmes et de minorités accèdent à la technologie, d'où son engagement auprès de Women Who Code et de différentes communautés technologiques. Elle dirige le réseau Women Who Code à Bristol.