🔑

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

に公開

はじめに

組織内でボットを公開する際、外部からのアクセスを制限するために認証を実装したいという要望があります。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