https://a.storyblok.com/f/270183/275293/94be11af22/2fa-ms-bot.png

NexmoのVerify APIを使ってMicrosoftボットに2FAを追加する

最終更新日 May 3, 2021

所要時間:1 分

2FA(二要素認証)は、アプリケーション内のセキュリティを高めるためにますます使用されるようになっています。このデモでは、Nexmo Verify APIとMicrosoft Bot Frameworkの使い方を紹介します。

前提条件

この記事では、ボット作成の詳細については説明しません。ボット・プロジェクトを作成するためのVisual Studioのセットアップ方法を知っていることを前提としています。Microsoft Botフレームワークについてよく知らない場合は ドキュメントを参照してください。.

Bot Builder SDK for .NETは現在C#をサポートしています。Mac用のVisual Studioはサポートされていません。このデモを実行するにはWindowsマシンが必要です。

2FAを設定するには NexmoベリファイAPINexmo C#クライアント・ライブラリ

どのように機能するのか?

このシナリオでは、サインアップ時に二要素認証をボットに追加します。初めてのユーザーは、名前や電話番号など、プロフィールを完成させるためにちょっとした情報を提供する必要があります。

次に、ボットはNexmo Verify APIを使ってPINを送信し、その電話番号を確認しようとします。次のステップは、PINを収集し、それをチェックすることです。

ボットプロジェクトの設定

ボットで2FAを設定するために最初にすべきことは、ボットを作成することです。理にかなっているだろう?Visual Studioで、「ボット・アプリケーション」タイプの新しいプロジェクトを作成する: ファイル-->新規-->プロジェクト-->ボット・アプリケーション

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

ボットでNexmoを使う

ボットアプリケーションでNexmo APIを使用する方法は、他の.NetプロジェクトでAPIを使用する方法と変わりません。

Install-Package Nexmo.Csharp.Client -Version 3.0.1

プロフィールフォームの作成

サインアップ時にユーザーの電話番号を確認するため、ユーザーのプロフィールを作成するための情報を少し収集します。

Microsoft Bot Frameworkでは、会話の流れを管理し、ダイアログを構築する方法がいくつかあります。今回は フォームフローを使います。

typing a message and getting alert to verify identity2fa Typing message

UserProfile' クラスをプロジェクトに追加します。このクラスには、プロフィールの作成に役立つプロパティと、フォームの作成と簡単なウェルカムメッセージの定義に 'FormBuilder' を使用する 'BuildForm()' メソッドが含まれています。

FormFlowを使えるようにするために、必ず名前空間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();
        }
    }
}

フォームを使う

プロファイルフォームができたので、実際に使えるようにするためにフレームワークに接続する必要があります。これは、コントローラ 'MessagesController.cs' に 'MakeRootDialog()' メソッドで追加することで行います。

'MakeRootDialog()'の返り値として'FormDialog.FromForm'メソッドを呼び出し、ユーザープロファイルフォームを作成します。ユーザー・プロフィールが完成すると、ボットはユーザーが提供した電話番号に認証コードを送信します。

わかりやすくするために、検証に関するメソッド(送信とチェック)を「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()'はConversation.SendAsync()'メソッドから呼び出されます。

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

コードが送信されたので、次のステップは、ユーザーがそれをボットに提供したら、それをVerifyすることである。

verify setup with user provided input to the botVerify Code

これは「VerifyHelper.cs」の「CheckVerificationCode」メソッドによって行われる。

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

おわかりのように、このメソッドは文字列を返します。この文字列を使って、ボット経由でユーザーと通信したいからです。これは、チェックするVerifyリクエストの識別子です。検証コードを送信するときには、この識別子を格納するだけです。

さて、ボットの話に戻りましょう。フォームを作成するのは 'MessageController.cs' の中だと書きました。これは、'MessageController.cs' 内の 'Post' メソッドがユーザーからのメッセージを受け取り、ルートダイアログを呼び出す役割を担っているからです。

そのため、ユーザーが認証コードを入力しても、ボットはユーザープロフィール情報と同様に、投稿メソッドでそのメッセージを傍受します。そのため、次に行うべき正しいアクションをボットに伝える方法が必要です。UserProfile.cs'のBuildFormメソッドをよく見ると、完了時にbool ProfileCompleteをtrueに設定していることに気づくでしょう。

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

つまり、ユーザーが何かを入力するたびに、ProfileCompleteがtrueに設定されているかどうかをチェックします。もしプロファイルが完全であれば、ユーザーが認証コードを入力したと仮定し、そのコードが有効かどうかをチェックします。

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

一言で言えば

このデモの目的は、サインアップ時にNexmo Verify APIを使用してMicrosoft Botアプリケーションに2FAを追加する方法を説明することです。

ユーザー・プロフィール・フォームを作成し、ユーザーから提供された電話番号に認証コードを送信します。ユーザーが送信されたコードを入力すると、Verifyが行われます。Microsoft Bot FrameworkでNexmo APIを使用する方法について、より多くのサンプルやシナリオを見るには、私たちのブログをご覧ください。

シェア:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Rabeb Othmaniヴォネージの卒業生

RabebはNexmoのデベロッパー・アドボケイトとして、クラウド通信APIに焦点を当て、開発者がアプリを構築する際に可能な限り最高のエクスペリエンスを得られるよう支援していた。生活のためにコードを書く以外に、ラベブはより多くの女性やマイノリティを技術に取り込むことを提唱しており、Women Who Codeやさまざまな技術コミュニティに参加している。彼女はブリストルのWomen Who Code Networkを率いている。