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

Añadir 2FA a un bot de Microsoft con Verify API de Nexmo

Publicado el May 3, 2021

Tiempo de lectura: 4 minutos

2FA (Two Factor Authentication) se utiliza cada vez más para aumentar la seguridad dentro de las Applications. A medida que los bots se hacen cada vez más populares, los desarrolladores tendrán que considerar cómo integrar 2FA con sus bots En esta demo, veremos cómo utilizar Nexmo Verify API con Microsoft Bot Framework.

Requisitos previos

En este post, no vamos a entrar en los detalles de la creación de un bot. Asumimos que sabes cómo configurar Visual Studio para crear proyectos bot. Si no estás familiarizado con Microsoft Bot framework, puedes visitar la página de documentación página de documentación aquí.

El SDK de Bot Builder para .NET es compatible actualmente con C#. Visual Studio para Mac no es compatible. Necesitarás una máquina Windows para poder ejecutar esta demo.

Para configurar 2FA, estamos utilizando Nexmo Verify API y la Biblioteca Cliente Nexmo C#

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.

¿Cómo funciona?

En nuestro escenario, vamos a añadir autenticación de dos factores a un bot en el registro. Como usuario por primera vez, se le pide que proporcione un poco de información para completar su perfil como su nombre y número de teléfono.

A continuación, el bot intentará verificar ese número de teléfono enviando un PIN mediante la API Nexmo Verify. El siguiente paso es recoger el PIN y comprobarlo.

Configuración del proyecto bot

Lo primero que hay que hacer para configurar 2FA con un bot, es crear un bot. Tiene sentido, ¿verdad? En Visual Studio, crea un nuevo proyecto del tipo "Aplicación Bot": Archivo--> Nuevo--> Proyecto--> Aplicación Bot

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

Uso de Nexmo con el bot

El uso de las APIs de Nexmo con una Aplicación Bot no difiere del uso de las APIs con cualquier otro Proyecto .Net. instale la Librería Cliente Nexmo C# a través de la Consola del Gestor de Paquetes NuGet.

Install-Package Nexmo.Csharp.Client -Version 3.0.1

Creación del formulario de perfil

Con el fin de verificar el número de teléfono del usuario en el registro, vamos a recoger un poco de información para la construcción de un perfil de usuario.

Con Microsoft Bot Framework, hay algunas maneras de gestionar el flujo de conversación y construir diálogos. En este caso, vamos a utilizar FormFlow ya que simplifica el proceso de gestión de una conversación guiada como la nuestra.

typing a message and getting alert to verify identity2fa Typing message

Añade una clase 'UserProfile' al proyecto, esta clase define el formulario. La clase incluye algunas propiedades para ayudarnos a construir el perfil y un método 'BuildForm()' que utiliza 'FormBuilder' para crear el formulario y definir un simple mensaje de bienvenida.

Asegúrese de importar el espacio de nombres FormFlow para poder utilizar 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();
        }
    }
}

Utilizando el formulario

Ahora que tenemos un formulario de perfil, necesitamos conectarlo al framework para poder usarlo realmente. Esto se hace añadiéndolo al controlador 'MessagesController.cs' a través del método 'MakeRootDialog()'.

'MakeRootDialog()' a su vez llama al método 'FormDialog.FromForm' para crear el formulario de perfil de usuario. Una vez completado el perfil de usuario, el bot procederá a enviar un código de verificación al número de teléfono proporcionado por el usuario.

En aras de la claridad, estamos agrupando los métodos relacionados con la verificación (es decir, para el envío y la comprobación) en una clase helper llamada '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()' es llamado por el método Conversation.SendAsync()'.

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

Ahora que ya se ha enviado el código, el siguiente paso es verificarlo una vez que el usuario se lo proporciona al bot.

verify setup with user provided input to the botVerify Code

Esto se hace a través del método 'CheckVerificationCode' en '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;
     }
}

Como puedes ver, este método devuelve una cadena porque queremos usar esa cadena para comunicarnos con el usuario a través del bot. la otra cosa a tener en cuenta aquí es 'RequestId'. Este es el identificador de la solicitud de Verify a comprobar. Cuando enviamos el código de verificación, simplemente almacenamos este identificador.

Ahora volvamos al bot, hemos mencionado que estamos creando el formulario en 'MessageController.cs'. Esto es porque el método 'Post' dentro de 'MessageController.cs' es responsable de recibir cualquier mensaje del usuario e invoca el diálogo raíz.

Así que cuando el usuario escriba el código de verificación, el bot seguirá interceptando ese mensaje en el método de publicación al igual que la información del perfil del usuario. Por lo tanto, necesitamos una manera de decirle al bot qué acción correcta hacer a continuación. Si observas detenidamente el método BuildForm en 'UserProfile.cs', te darás cuenta de que estamos estableciendo un bool ProfileComplete a true al finalizar.

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

Lo que ocurre es que cada vez que el usuario teclea algo, comprobamos si ProfileComplete es verdadero o no. Si el perfil está completo entonces se asume que el usuario ha introducido el código de verificación y se procede a comprobar si ese código es válido; en caso contrario se sigue rellenando el perfil en el diálogo raíz.

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 pocas palabras

El objetivo de esta demostración es guiarle a través de cómo agregar 2FA a sus aplicaciones de Microsoft Bot utilizando Nexmo Verify API en el registro.

Hemos creado un formulario de perfil de usuario y, a continuación, enviamos un código de verificación al número de teléfono facilitado por el usuario. Una vez que el usuario introduzca el código enviado, lo verificaremos. Echa un vistazo a nuestro blog para ver más ejemplos y escenarios sobre cómo utilizar las API Nexmo con Microsoft Bot Framework.

Compartir:

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

Rabeb fue defensora de los desarrolladores en Nexmo, centrándose en las API de comunicación en la nube y ayudando a los desarrolladores a obtener la mejor experiencia posible al crear sus aplicaciones. Además de escribir código para ganarse la vida, Rabeb aboga por atraer a más mujeres y minorías a la tecnología, de ahí su participación en Women Who Code y en diferentes comunidades tecnológicas. Dirige la red Women Who Code en Bristol.