🔑

Azure AI Bot Service に認証を実装する

2024/08/21に公開

はじめに

組織内でボットを公開するときに、外部からのアクセスを制限するために、認証したいという要望があります。Azure AI Bot Service で認証を実装する方法として 2 つの方法が考えられます。

  • ボットそのものに認証を実装する (OAuthPrompt の使用)
  • Direct Line (Web チャット) でボットを表示するサイトに認証を実装する

これは認証を実装するレイヤーが異なるので、どちらかやればよいというものではありません。片方を対応すればいい場合もありますし、両方を対応しなければならない場合もあります。

ボットに認証を実装する

さまざまなチャンネルに対して公開されるボットで認証する場合や、ボットが Microsoft Graph などの API にアクセスする場合が考えられます。方法については Microsoft のドキュメントのドキュメントを参照してください。

https://learn.microsoft.com/ja-jp/azure/bot-service/bot-builder-authentication?WT.mc_id=M365-MVP-5002941

ボットは会話の最初に OAuthPrompt を使うことで、あらかじめ Azure AI Bot Service に設定した接続先へ認証できます。ボットにはトークンが渡されるので、Microsoft Graph やその他の API を呼び出すことができます。

サイトに認証を実装する

Direct Line (Web チャット) の場合は、ボットと表示するサイトに認証を組み込むことで、ボットを保護するという方法が考えられます。ただし、ボットを埋め込むときにはシークレットを埋め込む必要があり、サイトを保護しただけではシークレットの漏洩は防げないという点には注意しなければなりません。これに対応するため、シークレットはサーバーで管理し、ユーザーからの要求に対してトークンを発行する API を作成する方法があります。合わせて API は Entra ID で保護します。

  • Azure App Service 認証または MSAL を使ってサイトを保護する
  • サイトにログインしたときのアクセス トークン で API を呼び出し ボットのアクセス トークン を取得する
  • ボットのアクセス トークン でボットを開始する

https://learn.microsoft.com/ja-jp/azure/bot-service/bot-service-channel-connect-webchat?WT.mc_id=M365-MVP-5002941

この方法では、ボットはトークンを受け取っていないので、Microsoft Graph などの API を呼び出すことはできません。

サイトとボットのシングル サインオンを実装する

Direct Line (Web チャット) でボットが Microsoft Graph などの API を呼び出したい場合は、上記の対応を両方とも実装することになります。しかし、そのままでは、ユーザーはサイトとボットのそれぞれに対してログインしなければなりません。これに対応するため、OAuthPrompt がクライアントに送信されたことをインターセプトし、自動的にトークンを返すという方法をとる必要があります。

https://learn.microsoft.com/ja-jp/azure/bot-service/bot-builder-concept-sso?WT.mc_id=M365-MVP-5002941

具体的な実装例は GitHub に公開されています。

https://github.com/microsoft/BotFramework-WebChat/blob/master/samples/07.advanced-web-chat-apps/e.sso-on-behalf-of-authentication/app/src/ui/WebChat/index.js

ボットからのメッセージが application/vnd.microsoft.card.oauth のときに signin をディスパッチします。これは toastMiddleware が受け取って処理します。

https://github.com/microsoft/BotFramework-WebChat/blob/master/samples/07.advanced-web-chat-apps/e.sso-on-behalf-of-authentication/app/src/ui/WebChat/Notifications/BotSignInToast.js

toastMiddleware から呼び出される処理では、postActivity でサイトから取得したトークンを返します。

おわりに

Microsoft Teams の場合はシングル サインオンを Teams クライアントがやってくれます。合わせて参考にしてください。

https://learn.microsoft.com/ja-jp/microsoftteams/platform//bots/how-to/authentication/bot-sso-overview?WT.mc_id=M365-MVP-5002941

Discussion