OAuth 2.0 に基づく Teams SDK 認証を使用して、ユーザーに代わってリソース (メール サービスなど) にアクセスするボットを Microsoft Teams で作成できます。 この方法により、ユーザーの資格情報に基づいて認証トークンを使用できるボットを簡単に開発できます。 重要なのは、 ID プロバイダーの使用です。
OAuth 2.0 は、Microsoft Entra ID やその他の多くの ID プロバイダーで使用される認証と承認のオープン標準です。 OAuth 2.0 の基本的な解釈は、Teams で認証を操作するための前提条件です。
基本的な理解については、OAuth 2 Simplifiedを参照してください。完全な仕様については、OAuth 2.0 を参照してください。
この記事では、以下について説明します。
- 認証対応ボットを作成する方法: cs-auth-sample を使用して、ユーザーのサインイン資格情報を処理し、認証トークンを生成します。
- ボットを Azure にデプロイして ID プロバイダーに関連付ける方法: プロバイダーは、ユーザーのサインイン資格情報に基づいてトークンを発行します。 ボットはトークンを使用して、認証を必要とするメール サービスなどのリソースにアクセスできます。
- ボットを Microsoft Teams 内に統合する方法: ボットが統合されたら、サインインしてチャットでメッセージを交換できます。
前提条件
Azure と OAuth 2.0 の開発に関する知識。
Microsoft Visual Studio と Git の最新バージョン。
Azure アカウント。 必要に応じて、Azure 無料アカウントを作成できます。
次のサンプル:
サンプル cs-auth-sample でのボット認証のクイック スタート js-auth-sample でのボット認証のクイックスタート py-auth-sample でのボット認証クイックスタート
リソース グループを作成する
リソース グループとサービス プランは厳密には必要ありませんが、作成したリソースを簡単に解放できます。 リソースを整理して管理しやすく保つことをお勧めします。
リソース グループを使用して、ボット用の個別リソースを作成します。 パフォーマンスを確保するために、これらのリソースが同じ Azure リージョンにあることを確認します。
- ブラウザーで、Microsoft Azure portal にサインインします。
- 左側のナビゲーション パネルで、リソース グループ を選択します。
- 表示されるウィンドウの左上で、[追加] タブを選択して、新しいリソース グループを作成します。 次のユーザー詳細を入力します。
- サブスクリプション。 既存のサブスクリプションを使用します。
- リソース グループ。 リソース グループの名前を入力します。 たとえば、 TeamsResourceGroup です。 名前は一意である必要があることに注意してください。
- [ リージョン] ドロップダウン メニューから、 米国西部、またはアプリケーションの近くのリージョンを選択します。
- [確認して作成] ボタンを選択します。 "検証合格" バナーが表示されます。
- [作成] ボタンを選択します。 リソース グループの作成には数分かかる場合があります。
ヒント
このチュートリアルの後半で作成するリソースと同様に、簡単にアクセスできるようにこのリソース グループをダッシュボードにピン留めすることをお勧めします。 これを行う場合は、ダッシュボードの右上にあるピン アイコン 📌 を選択します。
サービス プランを作成する
- Azure portal の左側のナビゲーション パネルで、[リソースの作成] を選択します。
- 検索ボックスに、「App Service Plan」 と入力します。 検索結果から App Service Plan カードを選択します。
- [作成] を選択します。
- 以下の情報を指定します。
- サブスクリプション。 既存のサブスクリプションを使用できます。
- リソース グループ。 前に作成したグループを選択します。
- 名前。 サービス プランの名前を入力します。 たとえば、 TeamsServicePlan です。 名前はグループ内で一意である必要があることに注意してください。
- オペレーティング システム。 Windows または該当する OS 選択します。
- リージョン。 [米国西部] またはアプリケーションに近いリージョンを選択します。
- 価格レベル。 既定値である [Standard S1] を選択します。
- [確認して作成] ボタンを選択します。 "検証合格" バナーが表示されます。
- [作成] を選択します。 App Service プランの作成には数分かかる場合があります。 プランはリソース グループに一覧表示されます。
Azure Bot リソースの登録を作成する
Azure ボット リソースの登録によって、Web サービスがボットとして Azure Bot Service に登録され、Microsoft アプリ ID とアプリ パスワード (クライアント シークレット) が提供されます。
重要
ボットが Azure でホストされていない場合にのみ、ボットを登録する必要があります。 Azure portal を使用してボットを作成した場合は、既にサービスに登録されています。 開発者ポータルを使用してボットを作成した場合、ボットは Azure に登録されていません。
Azure porta にアクセスし、[リソースの作成] セクションで Azure Bot を検索します。
Azure Bot を開き [作成] を選択します。
[ボット ハンドル] フィールドでボット ハンドル名を入力します。
ドロップダウン リストから [サブスクリプション] を選択します。
ドロップダウン リストから [リソース グループ] を選択します。
[ アプリの種類] を [ シングル テナント] として選択します。 名前にもかかわらず、この選択によって、ボットのインストールとテナントでの使用が制限されることはありません。
[確認 + 作成] を選びます。
検証に合格した場合は、[作成] を選択します。
Azure によってボットがプロビジョニングされます。
[リソースに移動] を選びます。 ボットと関連リソースがリソース グループに一覧表示されます。
Azure ボットが作成されます。
クライアント シークレットを作成するには:
[構成設定] で、[追加] を選択します。 将来の参照のために、Microsoft アプリ ID (クライアント ID) を保存します。
[Microsoft アプリ ID] の横にある [管理] を選択します。
[ クライアント シークレット] セクションで、[ 新しいクライアント シークレット] を選択します。 [クライアント シークレットの追加] ウィンドウが表示されます。
[説明] を入力し、[追加] を選択します。
[値] の列で、[クリップボードにコピー] を選択し、将来参照できるようにクライアント シークレット ID を保存します。
Microsoft Teams チャネルに追加するには:
[ホーム] に移動します。
[ 最近のリソース ] セクションからボットを開きます。
左側のウィンドウで [チャネル ] を選択し、[ Microsoft Teams
] を選択します。
サービス利用規約に同意するチェック ボックスをオンにし、[ 同意する] を選択します。
[保存] を選択します。
詳細については、「Microsoft Teams 用にボットを作成する」を参照してください。
ID プロバイダーの作成
認証には ID プロバイダーが必要です。 この手順では、Microsoft Entra プロバイダーを使用します。 または、他の Microsoft Entra ID でサポートされている ID プロバイダーを使用することもできます。
Azure portal の左側のナビゲーション パネルで、[Microsoft Entra ID] を選択します。
ヒント
この Microsoft Entra リソースは、アプリケーションによって要求されるアクセス許可の委任に同意できるテナントに作成して登録する必要があります。 テナントの作成手順については、「 ポータルにアクセスしてテナントを作成する」を参照してください。
左側のパネルで、[アプリの登録] を選択します。
右側のパネルで、左上の [新規登録] タブを選択します。
以下の情報を指定します。
- 名前。 アプリケーションの名前を入力します。 例として、 BotTeamsIdentity があります。 名前は一意である必要があることに注意してください。
- アプリケーションにサポートされているアカウントの種類を選択します。 任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ID テナント - マルチテナント) と個人の Microsoft アカウント (Skype、Xbox など) を選択します。
-
[リダイレクト URI] の場合:
✓ [Web]を選択します。
✓ URL をhttps://token.botframework.com/.auth/web/redirectに設定します。 - [登録] を選択します。
Azure によってアプリが作成されると、アプリの [概要] ページが表示されます。 次の情報をコピーしてファイルに保存します。
- アプリケーション (クライアント) ID の値。 この Azure ID アプリケーションをボットに登録するときに、この値を後でクライアント ID として使用します。
- [ディレクトリ (テナント) ID] をコピーします。 この Azure ID アプリケーションをボットに登録するときに、この値を後でテナント ID として使用します。
左側のパネルで [証明書とシークレット] を選択して、アプリケーションのクライアント シークレットを作成します。
- [ クライアント シークレット] で、[ 新しいクライアント シークレット] を選択します➕。
- Teams のボット ID アプリなど、このアプリ用に作成する必要がある可能性がある他のユーザーからこのシークレットを識別する説明を追加します。
- [期限切れ] を選択に設定します。
- [追加] を選択します。
- このページを終了する前に、シークレットを記録します。 この値は、後で Microsoft Entra アプリケーションをボットに登録するときにクライアント シークレットとして使用します。
ID プロバイダー接続を構成し、ボットに登録する
注:
サービス プロバイダーには、Azure Active Directory v1 と Azure Active Directory v2 の 2 つのオプションがあります。 2 つのプロバイダーの違い を次にまとめますが、一般的に、ボットのアクセス許可の変更に関して v2 の方が柔軟性が高くなります。 Graph API アクセス許可がスコープ フィールドに一覧表示され、新しいアクセス許可が追加されると、ボットによって、ユーザーは次回のサインイン時に新しいアクセス許可に同意できるようになります。 v1 の場合、OAuth ダイアログで新しいアクセス許可を表示するには、ボットの同意をユーザーが削除する必要があります。
Microsoft Azure Active Directory (Azure AD) v1
Azure portal で、ダッシュボードからリソース グループを選択します。
ボット登録リンクを選択します。
リソース ページを開き、[設定]の下にある [構成] を選択します。
[OAuth 接続設定の追加] を選択します。 次の図は、リソース ページの対応する選択を示しています。
フォームに次のように入力します。
名前。 接続の名前を入力します。 この名前は、ボットの
appsettings.jsonファイル内で使用します。 たとえば、 BotTeamsAuthADv1 などです。サービス プロバイダー。 Azure Active Directory を選択します。 このオプションを選択すると、Azure Active Directory 固有のフィールドが表示されます。
クライアント ID。Azure ID プロバイダー アプリ用に記録したアプリケーション (クライアント) ID を入力します。
クライアント シークレット。 Azure ID プロバイダー アプリ用に記録したシークレットを入力します。
許可の種類。
authorization_codeを入力します。ログイン URL。
https://login.microsoftonline.comを入力します。テナント ID、ID プロバイダー アプリの作成時に選択したサポートされているアカウントの種類に応じて、先ほど Azure ID アプリ用に記録した ディレクトリ (テナント) ID を入力するか、common を入力します。 割り当てる値を決定するには、次の条件に従います。
[この組織ディレクトリ内のアカウントのみ] (Microsoft のみ - シングル テナント) または [任意の組織ディレクトリ内のアカウント] (任意の Microsoft Entra ID テナント - マルチテナント) のいずれかを選択した場合は、以前に Microsoft Entra アプリ用に記録したテナント ID を入力します。 これは、認証できるユーザーに関連付けられているテナントになります。
任意の組織ディレクトリ (任意の Microsoft Entra ID テナント - マルチテナント) および個人の Microsoft アカウント (Skype、Xbox など) のアカウントを選択した場合は、テナント ID の代わりに common という単語を入力します。 それ以外の場合、Microsoft Entra アプリは、ID が選択されたテナントを通じて確認し、個人の Microsoft アカウントを除外します。
h. リソース URL には、「
https://graph.microsoft.com/」と入力します。 この URL はコード サンプルでは使用されていません。
i. [Scopes] は空白のままにします。 次の図に例を示します。
[保存] を選択します。
Microsoft Azure Active Directory (Azure AD) v2
Azure portal で、ダッシュボードから Azure Bot を選択します。
リソース ページで、[設定] にある [構成] を選択します。
[OAuth 接続設定の追加] を選択します。
次の図は、リソース ページの対応する選択を示しています。
フォームに次のように入力します。
名前。 接続の名前を入力します。
appsettings.jsonファイルのボットでこの名前を使用します。 たとえば、 BotTeamsAuthADv2 です。サービス プロバイダー。 [Azure Active Directory v2] を選択します。 このオプションを選択すると、Azure AD v2 固有のフィールドが表示されます。
クライアント ID。Azure ID プロバイダー アプリ用に記録したアプリケーション (クライアント) ID を入力します。
クライアント シークレット。 Azure ID プロバイダー アプリ用に記録したシークレットを入力します。
トークン交換 URL。 空白のままにします。
テナント ID、ID プロバイダー アプリの作成時に選択したサポートされているアカウントの種類に応じて、先ほど Azure ID アプリ用に記録した ディレクトリ (テナント) ID を入力するか、common を入力します。 割り当てる値を決定するには、次の条件に従います。
[この組織ディレクトリ内のアカウントのみ] (Microsoft のみ - シングル テナント) または [任意の組織ディレクトリ内のアカウント] (任意の Microsoft Entra ID テナント - マルチテナント) のいずれかを選択した場合は、以前に Microsoft Entra アプリ用に記録したテナント ID を入力します。 これは、認証できるユーザーに関連付けられているテナントになります。
任意の組織ディレクトリ (任意の Microsoft Entra ID テナント - マルチテナント) および個人の Microsoft アカウント (Skype、Xbox など) のアカウントを選択した場合は、テナント ID の代わりに common という単語を入力します。 それ以外の場合、Microsoft Entra アプリは、ID が選択されたテナントを通じて確認し、個人の Microsoft アカウントを除外します。
[スコープ] には、このアプリケーションが必要とする Graph アクセス許可のスペース区切りのリスト (User.Read、User.ReadBasic.All、Mail.Read など) を入力します。
[保存] を選択します。
接続をテストします。
接続エントリを選択して、作成した接続を開きます。
[サービス プロバイダー接続設定] パネルの上部になる[テスト接続] を選択します。
初めて、新しいブラウザー ウィンドウが開き、アカウントの選択を求められます。 使用するものを選択します。
次に、ID プロバイダーにデータ (資格情報) の使用を許可します。 次の図に例を示します。
[同意する] を選択します。
<your-connection-name> へのテスト接続の成功ページが開きます。 エラーが発生した場合は、ページを更新します。 次の図に例を示します。
ボット コードは、接続名を使用してユーザー認証トークンを取得します。
ボットのサンプル コードを準備する
準備の設定が完了したら、この記事で使用するボットの作成に焦点を当ててみましょう。
cs-auth-sample を複製します。
Visual Studio を開きます。
ツールバーから、[ファイル] > [プロジェクト/ソリューションを開く] >選択し、ボット プロジェクトを開きます。
C# で、 次のようにappsettings.json 更新します。
-
ConnectionNameを、ボット登録に追加した ID プロバイダー接続の名前に設定します。 この例で使用した名前は、BotTeamsAuthADv1 です。 -
ClientIdをボット登録時に保存した ボット アプリ ID に設定します。 - ボットの登録時に保存したクライアント シークレットに
ClientSecretを設定します。
ボット シークレットの文字によっては、パスワードを XML エスケープする必要がある場合があります。 たとえば、アンパサンド (&) は
&としてエンコードする必要があります。{ "Teams": { "ClientId": "", "ClientSecret": "", "TenantId": "", "ConnectionName": "" } }-
ソリューション エクスプローラーで、
appPackageフォルダーに移動し、manifest.jsonを開き、ボット登録時に保存したボット アプリ ID にidとbotIdを設定します。 詳細については、「アプリ マニフェスト」を参照してください。
ボットを Azure にデプロイする
ボットをデプロイするには、ボットを Azure にデプロイする方法の手順に従います。
または、Visual Studio の場合は、次の手順を実行できます:
Visual Studio ソリューション エクスプローラーで、プロジェクト名を長押し (または右クリック) します。
ドロップダウン メニューで、[ 公開] を選択します。
表示されたウィンドウで、[新規] リンクを選択します。
ダイアログ ウィンドウで、[App Service]、[新規作成] の順に選択します。
[発行] を選択します。
次のダイアログ ウィンドウで、必要な情報を入力します。
[作成] を選択します。
デプロイが正常に完了すると、Visual Studio に反映されます。 既定のブラウザーでページが開き、 "ボットの準備ができました!" というメッセージが表示されます。 URL は
https://botteamsauth.azurewebsites.net/に似ています。 ファイルに保存します。ブラウザーで Azure portal にアクセスします。
リソース グループを確認してください。ボットが他のリソースと共に一覧表示されます。 次の図に例を示します。
リソース グループで、ボット登録名 (リンク) を選択します。
左側のウィンドウで [設定] を選択します。
[ メッセージング エンドポイント] ボックスに、取得した URL に続いて
api/messagesを入力します。 たとえば、「https://botteamsauth.azurewebsites.net/api/messages」のように入力します。注:
ボットに対して許可されるメッセージング エンドポイントは 1 つだけです。
左上の [保存] ボタンを選択します。
Microsoft 365 エージェント プレイグラウンドを使用してローカルでテストする
ボットをローカルでテストするには、エージェントとボットの両方をサポートする Microsoft 365 Agents Playground を使用します。
セットアップとテストの手順については、「 Microsoft 365 Agents Playground を使用してエージェントをローカルでテストする」を参照してください。
デプロイされたボットをテストする
ブラウザーで Azure portal にアクセスします。
リソース グループを見つけます。
リソース リンクを選択します。 リソース ページが表示されます。
リソース ページで、[Web チャットでテスト] を選択します。 ボットが起動し、事前定義された案内応答が表示されます。
チャット ボックスに何かを入力します。
[サインイン] ボックスを選択します。
ボットのユーザー (あなた) を認証するための オープン URL を確認する ポップアップ ダイアログが表示されます。
[確認] を選択します。
メッセージが表示されたら、該当するユーザーのアカウントを選択します。 次の画像は、サインイン後のボット UI の例です。
[はい] ボタンを選択して、認証トークンを表示します。 次の図に例を示します。
入力チャット ボックスに 「ログアウト 」と入力してサインアウトします。
注:
サインインに問題がある場合は、 前の手順で説明したように接続のテストを再試行してください。 これにより、認証トークンが再作成される可能性があります。 Azure の Web チャット クライアントでは、認証が正しく確立されるまでに複数回サインインする必要がある場合があります。
Teams でボットをインストールしてテストする
ボット プロジェクトで、
appPackageフォルダーにmanifest.jsonが、outline.pngおよびcolor.pngと共に含まれていることを確認します。ソリューション エクスプローラー で、
appPackageフォルダーに移動します。 次の値を割り当てて、manifest.jsonを編集します:- ボットの登録時に受け取ったボット アプリ ID が
idとbotIdに割り当てられていることを確認します。 - この値を割り当てます:
validDomains: [ "token.botframework.com" ]。
- ボットの登録時に受け取ったボット アプリ ID が
manifest.json、outline.png、およびcolor.pngファイルを選択して zip します。Microsoft Teams を開きます。
左側のパネルの下部で、Apps アイコン を選択します。
右側のパネルの下部にある [カスタム アプリのアップロード] を選択します。
appPackageフォルダーに移動し、圧縮されたマニフェストをアップロードします。[ 追加] を選択して、アプリを Teams にインストールします。
必要な範囲を検索して選択するか、一覧からチャネルまたはチャットを選択し、ダイアログ間を移動して [Go] を選択します。
注:
OAuth は、グループ チャットまたはチャネル スコープでは直接サポートされていません。 認証を有効にし、ユーザーがグループ チャットまたはチャネルにボットをインストールした場合、ユーザーは、グループ チャットまたはチャネルでボットを使用する前に、個人用スコープで認証する必要があります。
左側のパネルで 3 つの点 (●●●) を選択します。 次に、 開発者ポータル アイコンを選択します。
[マニフェスト エディター] タブを選択します。アップロードしたボットのアイコンが表示されます。
また、ボットとメッセージを交換するために使用できるボットをチャットリストに連絡先として表示できます。
Teams でボットをローカルでテストする
Teams は完全にクラウドベースの製品です。 アクセスするすべてのサービスを、HTTPS エンドポイントを使用してクラウドから利用できるようにする必要があります。 そのため、ボット (サンプル) を Teams で動作させるには、任意のクラウドにコードを発行するか、トンネリング ツールを使用してローカルで実行されているインスタンスに外部からアクセスできるようにする必要があります。 マシン上でローカルに開くポートの外部アドレス指定可能な URL を作成する ngrok をお勧めします。 Teams アプリをローカルで実行する準備として ngrok を設定するには、次の手順に従います。
ターミナル ウィンドウで、
ngrok.exeがインストールされているディレクトリに移動します。 環境変数 パスをポイントするように設定することをお勧めします。たとえば、
ngrok http 3978 --host-header=localhost:3978を実行します。 必要に応じてポート番号を置き換えます。 ngrok を起動して、指定したポートでリッスンします。 その返しとして、ngrok が実行されている限り有効な外部アドレス指定可能な URL が提供されます。 次の図に例を示します。
次のような転送先 HTTPS アドレスをコピーします。
https://dea822bf.ngrok.io/。/api/messagesを追加して、https://dea822bf.ngrok.io/api/messagesを取得します。これは、コンピューター上でローカルに実行され、Teams チャットで Web 経由で到達可能なボットのメッセージ エンドポイントです。実行する最後の手順の 1 つは、デプロイされたボットのメッセージ エンドポイントを更新することです。 この例では、ボットを Azure にデプロイしました。 それでは、次の手順を実行しましょう:
- ブラウザーで Azure portal にアクセスします。
- [ボットの登録] を選択します。
- 左側のウィンドウで [設定] を選択します。
- 右側のパネルの [メッセージング エンドポイント] ボックスに、ngrok URL を入力します(例:
https://dea822bf.ngrok.io/api/messages)。
ボットをローカルで起動します (Visual Studioデバッグ モードなど)。
Azure portal の [Web チャットでテスト] を使用して、ローカルで実行中にボットをテストします。
ngrokが実行されているターミナル ウィンドウでは、ボットと Web チャット クライアントの間の HTTP トラフィックを確認できます。 より詳細なビューが必要な場合は、ブラウザー ウィンドウで、前のターミナル ウィンドウから取得したhttp://127.0.0.1:4040を入力します。 次の図に例を示します。
注:
ngrok を停止して再起動すると、URL が変更されます。 プロジェクトで ngrok を使用するには、また使用している機能に応じて、すべての URL 参照を更新する必要があります。
その他の情報
appPackage/manifest.json
このマニフェストには、ボットと接続するために Teams が必要とする情報が含まれています。
{
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.22/MicrosoftTeams.schema.json",
"manifestVersion": "1.22",
"version": "1.0.0",
"id": "${{TEAMS_APP_ID}}",
"developer": {
"name": "Teams App, Inc.",
"websiteUrl": "https://example.azurewebsites.net",
"privacyUrl": "https://example.azurewebsites.net/privacy",
"termsOfUseUrl": "https://example.azurewebsites.net/termsofuse"
},
"icons": {
"color": "color.png",
"outline": "outline.png"
},
"name": {
"short": "Auth Bot",
"full": "Auth Bot"
},
"description": {
"short": "Teams bot with SSO authentication and Graph API integration.",
"full": "This bot demonstrates SSO authentication in Microsoft Teams using Azure AD, and uses Microsoft Graph API to retrieve the user profile."
},
"accentColor": "#FFFFFF",
"bots": [
{
"botId": "${{BOT_ID}}",
"scopes": [
"personal",
"groupChat",
"team"
],
"supportsFiles": false,
"isNotificationOnly": false
}
],
"permissions": [
"identity",
"messageTeamMembers"
],
"validDomains": [
"token.botframework.com",
"${{BOT_DOMAIN}}"
],
"webApplicationInfo": {
"id": "${{BOT_ID}}",
"resource": "api://botid-${{BOT_ID}}"
}
}
認証を使用すると、Teams の動作は他のチャネルとは異なります。
コード サンプル
このサンプルでは、Active Directory を使用してMicrosoft Teamsボットに対して単一 Sign-On (SSO) 認証を実装する方法Azure示します。
| サンプルの名前 | 説明 | .NET | Node.js | Python |
|---|---|---|---|---|
| ボット認証のクイック スタート | このサンプルでは、Active Directory を使用してMicrosoft Teamsボットに対して単一 Sign-On (SSO) 認証を実装する方法Azure示します。 | 表示 | 表示 | 表示 |