【GraphAPI】Teams アプリのアクセス許可 (リソース固有の同意：RSC)

# はじめに

Graph API のアクセス許可として、Teams のアプリの場合だけ使用できる "リソース固有の同意" というアクセス許可があります。リソース固有の同意について、簡単にまとめてみました。

# リソース固有の同意とは？

**"リソース固有の同意"** は Teams アプリに対して、アプリが追加されたチームやチャットの情報のみ取得することを許可するアクセス許可です。

::: note
リソース固有の同意 (**R**esource-**S**pecific **C**onsent) は省略して **RSC** と記載されます。この記事でも以降は RSC と表記します。
:::

::: note warn
ここでの "Teams アプリ" は Teams クライアント上からチームやチャットに追加できる様々なアプリのことを指しています。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/ce5e1eb2-50aa-48d9-9e36-d04c71cd2973.png)

(参考：Teams アプリのリソース固有の同意)
https://learn.microsoft.com/ja-jp/microsoftteams/platform/graph-api/rsc/resource-specific-consent

## チャットボットの例

### ユーザー委任権限とアプリケーション許可権限の問題点

例えば、チャットボットの Teams アプリの場合、ユーザーが入力したメッセージの情報を Graph API で取得し、適切な応答を返す必要があります。

Graph API にはユーザー委任権限とアプリケーション許可権限があります。

ユーザー委任権限は特定のユーザーがサインインすることでアプリに自身の代わりアクセス許可を付与する方法なので、チャットボットには利用できません。

アプリケーション許可権限の場合は、チャットボットから利用することができます。しかし、アプリケーション許可権限ではアクセス許可を付与すると、アプリがテナント全体のメッセージを閲覧することが可能になってしまいます。

※ 参考

https://qiita.com/atsmin77/items/31df2f5624840b45dda0#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%B1%E5%8F%AF%E3%81%AE%E6%AF%94%E8%BC%83

### RSC の利用

そこで Teams アプリの場合には、RSC を使用します。RSC では Entra ID アプリケーションではなく、Teams アプリに対してアクセス許可を付与します。

<ins>RSC が付与された Teams アプリは、アプリが追加されたチームやグループチャット内の情報のみ、参照することが可能です</ins>。

# RSC を使用したチャットボットアプリのサンプル

RSC を使用したチャットボットアプリのサンプルが Github で公開されています。

https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-receive-channel-messages-withRSC/csharp

以下の手順でサンプルアプリを Teams クライアントに追加して、簡単に試すことができます。

■ 1. Github からサンプルアプリの zip ファイルをダウンロードする
1. Github のリンクをブラウザで開き、**[demo-manifest]** フォルダをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/229c9911-da53-4dbe-9569-8a9fd27fa421.png)
1. **[Bot-RSC.zip]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/5402dee3-dbd1-4313-8079-5df467f2febc.png)
1. 右側のダウンロードボタンをクリックし、"Bot-RSC.zip" をダウンロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/62b2ea31-6ac9-4bd4-9eca-467b34a9f594.png)

■ 2. Teams 管理センターからサンプルアプリをアップロードする

※ この手順は Teams 管理者のユーザーで行ってください。

1. Teams 管理センターから **[Teams のアプリ] - [アプリの管理] - [アクション] - [新しいアプリのアップロード]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/acd3788a-b0d2-47c3-9bf1-8dccc26045f1.png)
1. **[アップロード]** をクリックし、ダウンロードした "Bot-RSC.zip" をアップロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/bb15b89f-c66d-4530-968d-77dcb6cbe94e.png)
1. 検索ボックスに **"RSC Sample"** と入力し、サンプルアプリが追加されていることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/aec6e621-d48b-419c-a0cf-355da1854517.png)

■ 3. Teams クライアントからサンプルアプリを利用する

1.  Teams クライアントで **"[アプリ]"** を開き、検索ボックスに **"RSC Sample"** と入力し **[追加]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/f82bf655-234f-439c-b214-a70573419162.png)
1. **[アクセス許可]** タブにアプリを追加する際に同意するアクセス許可が表示されます (<ins>これが RSC です</ins>)
   **[追加]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/f9e5ed1a-badf-4db8-b260-5d6b64535a60.png)
1. サンプルアプリを追加する任意のチャネルを選択し、**[移動]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/5964fc3a-c05c-42fd-8c37-5b230e549dfc.png)
1. 追加したサンプルアプリによってチャネルにメッセージが投稿されます
そのまま **[投稿]** をクリックして、チャットボットとメンションします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/ca3348ad-787a-4d98-b498-1b44c030d816.png)
1. チャットボットがチャネルのメッセージを取得して、入力内容に応じて応答を返していることが確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/10602697-21b9-47b4-90e4-2f806066559c.png)

# Teams アプリへの RSC の設定方法

Teams アプリには以下の方法で RSC を設定します。

## manifest.json

"Bot-RSC.zip" を展開すると、フォルダ内に **"manifest.json"** というファイルが存在します。"manifest.json" はアプリの設定情報を記載するファイルです。

"manifest.json" の [authorization] - [permissions] - [resourceSpecific] でアプリに設定する RSC のアクセス許可を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/6215ca29-c9f9-44c8-848a-d7ab4ee735ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/deb32bc4-5c75-48d9-955b-e6f03ad732d9.png)

::: note
Bot-RSC サンプルアプリでは、RSC によってアプリがインストールされたチャネルやグループチャットのメッセージを読み取ることができるアクセス許可を設定していることが分かります。
:::

## Teams Developer Portal

Teams Developer Portal でもアプリの設定を変更することができます。

1. Developer Portal ブラウザから任意のユーザーで Developer Portal を開きます
   **[アプリ] - [アプリのインポート]** をクリックし、"Bot-RSC.zip" をアップロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/d6583a03-000d-4615-b41a-d5cf13e25267.png)
1. **[構成する] - [権限]** をクリックし、**[チームのアクセス許可] - [Application]** を展開します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/f45407cf-2197-41ef-99a4-13f86c4f91ab.png)
1. "ChannelMessage.Read.Group" アクセス許可が設定されていることが分かります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/d8d42f59-fc1d-4a29-91a4-a796b1cb2591.png)

(参考：Teams の開発者ポータル)
https://learn.microsoft.com/ja-jp/microsoftteams/platform/concepts/build-and-test/teams-developer-portal